CTFd平臺搭建以及一些相關問題解決-詳細版
CTFd平臺搭建以及一些相關問題解決-詳細版
一.序言
因為想給學校工作室提高一下學習氛圍,隨便帶學弟學妹入門,所以做了一個ctf平臺,開源的平臺有CTFd和FBCTF,因為窮學生租不起高階雲主機所以只能選擇佔資源相比FBCTF小的CTFd進行搭建。記錄一下搭建過程和遇到的一些問題。
二.搭建CTFd步驟
首先我們需要安裝映象,這裡我選擇的是阿里雲的ECS,Ubuntu16.04,單純是因為喜歡Ubuntu的風格,CentOS也是可以搭建的。
Line"/>
等待重置系統後,此時的伺服器是純淨的,什麼都沒有,甚至沒有ifconfig...
當然這些都不是問題,缺什麼裝什麼就行了。
1.升級源
$ sudo apt-get update
2.安裝git
因為CTFd的原始碼和部署好的題目都是要通過github傳輸的。
$ sudo apt install git
3.安裝pip
$ sudo apt install python-pip
如果出現異常可以升級pip
$ 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
$ 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值進行雙向判斷。這樣至少能增加一點可靠性。