CTFd平臺搭建以及一些相關問題解決

 

CTFd平臺搭建以及一些相關問題解決php

 

 

   一.序言

  由於想給學校工做室提升一下學習氛圍,隨便帶學弟學妹入門,因此作了一個ctf平臺,開源的平臺有CTFd和FBCTF,由於學生租不起高端雲主機因此只能選擇佔資源相比FBCTF小的CTFd進行搭建。記錄一下搭建過程和遇到的一些問題。html

 

   二.搭建CTFd步驟

   首先咱們須要安裝鏡像,這裏我選擇的是阿里雲的ECS,Ubuntu16.04,單純是由於喜歡Ubuntu的風格,CentOS也是能夠搭建的。python

  等待重置系統後,此時的服務器是純淨的,什麼都沒有,甚至沒有ifconfig...mysql

  固然這些都不是問題,缺什麼裝什麼就好了。linux

1.更新apt包索引git

$ sudo apt-get update

2.安裝gitgithub

由於CTFd的源碼和部署好的題目都是要經過github傳輸的。web

$ sudo apt install git

3.安裝pip  sql

$ sudo apt install python-pip

若是出現異常能夠升級pipdocker

$ sudo python -m pip install --upgrade pip

4.安裝Flask

由於CTFd是基於Flask框架建造的,因此要搭建CTFd確定要安裝Flask

$ sudo pip install Flask

5.下載CTFd

 

$ sudo git clone https://github.com/isislab/CTFd.git

 

6.安裝CTFd

 

$ cd CTFd
$ sudo ./prepare.sh

 

7.運行CTFd

$ sudo python serve.py

若是沒有出錯的話就能夠直接在本地訪問了,可是我要架的是能夠經過外網訪問的,因此還要安裝gunicorn

8.安裝gunicorn並規定映射的端口

$ sudo pip install gunicorn
$ sudo gunicorn --bind 0.0.0.0:8000 -w 1 "CTFd:create_app()"

出現這一步即表示服務正常打開了,能夠從外部訪問。

其中的端口號是能夠隨便改的。

   三.問題處理

1.關於阿里雲的防火牆

當作到這一步時確定要先訪問一下公網地址看能不能訪問服務器,可是訪問卻發現連接失敗。可是在本地確能夠訪問,端口也確實打開了

後來發現阿里雲的防火牆默認只開啓了80、443和22端口,因此將8000防火牆打開。

再次訪問,發現能夠訪問了。

 

2.清理主界面的廣告

 既然爲學校搭建平臺,確定主頁面要去廣告的,否則看着鬧心。

那麼 找源代碼去,在/CTFd/CTFd/themes/core/templates目錄下找到了CTFd的全部html文件,在比對後發現base.html是主頁面,那麼打開看看,找了半天都沒找到關於以上廣告的匹配信息,只找到了這個,通過一番查找終於在他自帶的數據庫ctfd.db找到了這段html...

 

好的,刪除之,重啓服務,廣告沒了,完美。

 

3.在主頁面添加標籤

CTFd平臺並未提供公告功能,可是我認爲這個功能是要有的,以防網站被掃描致使癱瘓等發生。

好 繼續改源代碼,這邊我走了彎路,下面的都是彎路內容,我首先在base.html的列位置增長了兩個href

格式照着上面寫過來後點擊主頁面的info發現彈出404

 

那麼"{{ request.script_root }}/info"這個東西究竟是什麼呢,後來通過查閱後得知這是Flask框架的一種訪問規則,稱爲路由,表示用戶請求的URL找出對應的處理函數,由於源碼中並無指定info的路由,因此確定404了,那怎麼辦呢,我找到了控制視圖的文件views.py

在這個文件中包含了全部url對應的訪問地址,因此添加兩條路由

@views.route('/notice')
def notice():
    
    return render_template('notice.html',notice=notice)
@views.route('/info')
def info():
    
    return render_template('info.html',info=info)

再將html文件移動至/CTFd/CTFd/themes/core/templates目錄下發現能夠訪問了。

 

那麼我爲何要說走了彎路呢,原來管理員界面是能夠增長標籤頁的!!!我這一圈白走了並且不便於管理...苦逼。

4.平臺web題目的部署

做爲CTF平臺,平臺作的再好,沒有題目確定是沒用的,因此開始部署題目,至於MISC和CRYPTO、REVERSE題目是能夠直接在後臺部署而且上傳的,可是web題呢?

當時第一個想到的是使用docker部署web,可是看了看本身的服務器配置,

 

哈哈算了吧,那怎麼辦呢,由於我也是出題人,對於web這塊我選擇了php做爲主語言,因此後來想了想搭建一個LAMP環境算了。

那麼開始搭建L(linux)A(apache)M(mysql)P(php)環境

 考慮到php版本帶來的部分弱類型沒法使用,所以選擇安裝php5.6版本,

安裝PHP5.6

//安裝aptiude
$ apt-get install aptitude
//檢索並卸載php現有版本,由於阿里雲ubuntu鏡像默認安裝了php7
$ aptitude purge `dpkg -l | grep php| awk ‘{print $2}’ |tr 「\n」 」 「`
//添加支持php5.6源 $ sudo add-apt-repository ppa:ondrej/php //更新ubuntu源 $ sudo apt-get update //安裝php5.6及經常使用組件 $ sudo apt-get install php5.6 $ sudo apt-get install php5.6-gd $ sudo apt-get install php5.6-mysql $ sudo apt-get install php5.6-mbstring $ sudo apt-get install php5.6-zip
  • 測試:php -v

安裝Apache

$ sudo apt-get install apache2
  • 測試: 瀏覽器訪問http://Ubuntu的IP,出現It Works!網頁。

  • 查看狀態: service apache2 status/start/stop/restart

  • Web目錄: /var/www

  • 安裝目錄: /etc/apache2/

  • 全局配置: /etc/apache2/apache2.conf

  • 監聽端口: /etc/apache2/ports.conf

安裝Mysql

$ sudo apt-get install mysql-server mysql-client
  • 測試mysql -u root -p

  • 查看狀態service mysql status/start/stop/retart

  • 查看監聽端口的狀況netstat -tunpl 或 netstat -tap

安裝phpMyAdmin

$ sudo apt-get install phpmyadmin
  • 安裝:選擇apache2,點擊肯定。下一步選擇是要配置數據庫,並輸入密碼。

  • 建立phpMyAdmin快捷方式sudo ln -s /usr/share/phpmyadmin /var/www/html

  • 啓用Apache mod_rewrite模塊sudo a2enmod rewrite

  • 重啓服務

    • service apache2 restart

  • 測試:瀏覽器訪問:http://ubuntu地址/phpmyadmin

安裝完畢,部署web題目便可,可是,服務器與本地並無交互,如何上傳題目呢?

這就用到以前安裝的git了,我能夠將題目打包到github的項目中,再經過git clone 命令下載到服務器,而後在後臺將web指向服務器的php文件便可。

 

5.平臺web題目的安全問題

由於apache默認是開啓列目錄的,因此某些題目可能會直接泄露源碼,而web代碼審計類型題目的flag就隱藏在源碼中,因此必須禁用列目錄

/etc/apache2/apache2.conf是Ubuntu-apache的主配置文件

修改此文件中的

刪除便可

6.一些關於題目的問題

  身爲ctf的web模塊,sql注入確定是必不可少的,可是注入必定會波及數據庫,若是將CTFd的默認數據庫用mysql管理,即將ctfd.db內容寫入mysql,並將config.py指向mysql的表的話,就會致使flag以及平臺用戶名密碼所有泄露,失去了題目存在的意義,原本是應該將ctfd.db放到mysql管理的,可是因爲以上緣由,不予修改,這樣既能保證重要數據的安全性,也能保證題目的可玩性。

  可是一樣帶來的隱患是CTFd初始數據庫容量有限,必須控制好用戶數量。這個是須要注意的。

  還有一點是關於管理的,由於ctf線上作題並不能保證真實性和可靠性,若是依靠分數順位選拔人才的話,難免會有不合適的人進階,本身的平臺最實用的功能其實就是flag的保密性,由於本身出的題目在網上是找不到flag的,固然,個人github也進行了安全處理==

綜上所述,我決定增長提交word形式的writeup和flag值進行雙向判斷。這樣至少能增長一點可靠性。

 原創文章,轉載請聯繫我並註明出處:https://www.cnblogs.com/pureqh/p/10001259.html

相關文章
相關標籤/搜索