CTFd平台搭建以及一些相关问题解决
一.序言
因为想给学校工作室提高一下学习氛围,随便带学弟学妹入门,所以做了一个ctf平台,开源的平台有CTFd和FBCTF,因为学生租不起高端云主机所以只能选择占资源相比FBCTF小的CTFd进行搭建。记录一下搭建过程和遇到的一些问题。
二.搭建CTFd步骤
首先我们需要安装镜像,这里我选择的是阿里云的ECS,Ubuntu16.04,单纯是因为喜欢Ubuntu的风格,CentOS也是可以搭建的。
等待重置系统后,此时的服务器是纯净的,什么都没有,甚至没有ifconfig...
当然这些都不是问题,缺什么装什么就行了。
1.更新apt包索引
$ 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: -w "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.
$ sudo apt-get install php5.-gd
$ sudo apt-get install php5.-mysql
$ sudo apt-get install php5.-mbstring
$ sudo apt-get install php5.-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值进行双向判断。这样至少能增加一点可靠性。