CTFd平臺搭建以及一些相關問題解決php
由於想給學校工做室提升一下學習氛圍,隨便帶學弟學妹入門,因此作了一個ctf平臺,開源的平臺有CTFd和FBCTF,由於學生租不起高端雲主機因此只能選擇佔資源相比FBCTF小的CTFd進行搭建。記錄一下搭建過程和遇到的一些問題。html
首先咱們須要安裝鏡像,這裏我選擇的是阿里雲的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值進行雙向判斷。這樣至少能增長一點可靠性。