CTFd平台搭建以及一些相关问题解决

一.序言

  因为想给学校工作室提高一下学习氛围,随便带学弟学妹入门,所以做了一个ctf平台,开源的平台有CTFd和FBCTF,因为学生租不起高端云主机所以只能选择占资源相比FBCTF小的CTFd进行搭建。记录一下搭建过程和遇到的一些问题。

二.搭建CTFd步骤

  首先我们需要安装镜像,这里我选择的是阿里云的ECS,Ubuntu16.04,单纯是因为喜欢Ubuntu的风格,CentOS也是可以搭建的。

CTFd平台搭建以及一些相关问题解决-LMLPHP

  等待重置系统后,此时的服务器是纯净的,什么都没有,甚至没有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()"

CTFd平台搭建以及一些相关问题解决-LMLPHP

出现这一步即表示服务正常打开了,可以从外部访问。

其中的端口号是可以随便改的。

三.问题处理

1.关于阿里云的防火墙

当做到这一步时肯定要先访问一下公网地址看能不能访问服务器,但是访问却发现链接失败。但是在本地确可以访问,端口也确实打开了

CTFd平台搭建以及一些相关问题解决-LMLPHP

后来发现阿里云的防火墙默认只开启了80、443和22端口,所以将8000防火墙打开。

CTFd平台搭建以及一些相关问题解决-LMLPHP

再次访问,发现可以访问了。

CTFd平台搭建以及一些相关问题解决-LMLPHP

2.清理主界面的广告

既然为学校搭建平台,肯定主页面要去广告的,不然看着闹心。

CTFd平台搭建以及一些相关问题解决-LMLPHP

那么 找源代码去,在/CTFd/CTFd/themes/core/templates目录下找到了CTFd的所有html文件,在比对后发现base.html是主页面,那么打开看看,找了半天都没找到关于以上广告的匹配信息,只找到了这个,经过一番查找终于在他自带的数据库ctfd.db找到了这段html...

CTFd平台搭建以及一些相关问题解决-LMLPHP

CTFd平台搭建以及一些相关问题解决-LMLPHP

好的,删除之,重启服务,广告没了,完美。

CTFd平台搭建以及一些相关问题解决-LMLPHP

3.在主页面添加标签

CTFd平台并未提供公告功能,但是我认为这个功能是要有的,以防网站被扫描导致瘫痪等发生。

好 继续改源代码,这边我走了弯路,下面的都是弯路内容,我首先在base.html的列位置增加了两个href

CTFd平台搭建以及一些相关问题解决-LMLPHP

格式照着上面写过来后点击主页面的info发现弹出404

CTFd平台搭建以及一些相关问题解决-LMLPHP

那么"{{ request.script_root }}/info"这个东西到底是什么呢,后来经过查阅后得知这是Flask框架的一种访问规则,称为路由,表示用户请求的URL找出对应的处理函数,因为源码中并没有指定info的路由,所以肯定404了,那怎么办呢,我找到了控制视图的文件views.py

CTFd平台搭建以及一些相关问题解决-LMLPHP

在这个文件中包含了所有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目录下发现可以访问了。

CTFd平台搭建以及一些相关问题解决-LMLPHP

那么我为什么要说走了弯路呢,原来管理员界面是可以增加标签页的!!!我这一圈白走了而且不便于管理...苦逼。

4.平台web题目的部署

作为CTF平台,平台做的再好,没有题目肯定是没用的,所以开始部署题目,至于MISC和CRYPTO、REVERSE题目是可以直接在后台部署并且上传的,但是web题呢?

当时第一个想到的是使用docker部署web,但是看了看自己的服务器配置,

CTFd平台搭建以及一些相关问题解决-LMLPHP

哈哈算了吧,那怎么办呢,因为我也是出题人,对于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文件即可。

CTFd平台搭建以及一些相关问题解决-LMLPHP

5.平台web题目的安全问题

因为apache默认是开启列目录的,所以某些题目可能会直接泄露源码,而web代码审计类型题目的flag就隐藏在源码中,所以必须禁用列目录

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

修改此文件中的

CTFd平台搭建以及一些相关问题解决-LMLPHP

删除即可

6.一些关于题目的问题

  身为ctf的web模块,sql注入肯定是必不可少的,但是注入一定会波及数据库,如果将CTFd的默认数据库用mysql管理,即将ctfd.db内容写入mysql,并将config.py指向mysql的表的话,就会导致flag以及平台用户名密码全部泄露,失去了题目存在的意义,本来是应该将ctfd.db放到mysql管理的,但是由于以上原因,不予修改,这样既能保证重要数据的安全性,也能保证题目的可玩性。

  但是同样带来的隐患是CTFd初始数据库容量有限,必须控制好用户数量。这个是需要注意的。

  还有一点是关于管理的,因为ctf线上做题并不能保证真实性和可靠性,如果依靠分数顺位选拔人才的话,不免会有不合适的人进阶,自己的平台最实用的功能其实就是flag的保密性,因为自己出的题目在网上是找不到flag的,当然,我的github也进行了安全处理==

CTFd平台搭建以及一些相关问题解决-LMLPHP

综上所述,我决定增加提交word形式的writeup和flag值进行双向判断。这样至少能增加一点可靠性。

原创文章,转载请联系我并注明出处:https://www.cnblogs.com/pureqh/p/10001259.html

05-02 05:12