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值进行双向判断。这样至少能增长一点可靠性。