在Docker中部署CTFd+CTF-Whale动态靶机+题库以及常见问题解决方案
前言
我这几天一直在研究CTFd的靶场搭建,因为我不是很熟悉Docker的正确食用方法,所以在安装路上遇到很多问题,好在我勤奋好学,通过不懈努力,我终于搭建好CTFd平台,同时使得CTF-Whale插件正确运作,实现答题动态flag。
注:CTFd项目地址,CTF-Whale插件项目地址,CTFTraining题库
部署
本次将引用另一位博主已经打包好并上传至仓库的版本,以方便部署,主要是因为我懒,懒得打包
- VaalaCat/ctfd_whale
前期准备
环境安装
该项目基本都是通过
Docker实现,首先安装Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
sudo usermod -aG docker 用户名
准备Docker-Compose
sudo pip3 install docker-compose -i https://pypi.tuna.tsinghua.edu.cn/simple环境配置
动态靶机模式需要服务器集群,所以在此我们得创建一个单个的服务器集群
docker swarm init
然后将此服务器加入到该集群中
docker node update --label-add='name=linux-1' $(docker node ls -q)
最后要准备的是给Docker更换镜像源,否则接下来在部署的时候速度很慢,在/etc/docker/daemon.json中更改源,推荐中科大的源,改完之后像下面这样
{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn/"]}
最后重启Docker使其生效
sudo systemctl daemon-reload
sudo systemctl restart docker
安装
下载
从GitHub上克隆下项目文件
git clone https://github.com/VaalaCat/CTFd.git --depth=1配置
cd CTFd
vim conf/frp/frps.ini # token自己设置
vim conf/frp/frpc.ini # token自己设置一定要保证frps.ini和frpc.ini中的token一定要一致!!
给出frp中两个文件的参考内容,基本上只需要修改token和域名
frps.ini
[common]
bind_port = 7000
vhost_http_port = 9123
token = 填入你的token
subdomain_host = 你的域名frpc.ini
[common]
token = 填入你的token
server_addr = 172.1.0.3
server_port = 7000
admin_addr = 172.1.0.4
admin_port = 7400
安装插件并重新启动
git submodule update --init
docker-compose up -d不出意外应该可以成功,接着查看已经启动的镜像
docker ps -a
平台插件设置
通过浏览器访问你的域名:9124进入平台,先完成平台的基本设置,进入平台后台之后,右上角点击进入Whale的设置
Docker
在左侧的Docker面板中,Auto Connect Network中填入ctfd_frp_containers,Dns Setting中填入223.5.5.5,这是阿里云的公共DNS,在Auto Connect Containers中填入ctfd_frpc_1
Frp
在左侧的Frp面板中,Http Domain Suffix填写以http方式访问靶机的泛解析域名,Http Port中填入9123,在Direct IP Address中填入服务器IP,一般用于PWN题,以Direct方式访问,在Direct Minimum Port填入9125,在Direct Maximum Port中填入9129即可完成插件Whale的设置
用一张表格来总结上述设置
Docker
| 选项 | 内容 |
|---|---|
| Auto Connect Network | ctfd_frp_containers |
| Dns Setting | 223.5.5.5这是阿里云的公共DNS |
| Auto Connect Containers | ctfd_frpc_1 |
Frp
| 选项 | 内容 |
|---|---|
| Http Domain Suffix | 填写以http方式访问靶机的泛解析域名 |
| Http Port | 9123填写frps中的vhost_http_port,该端口为http方式靶机访问的端口 |
| Direct IP Address | 填入服务器IP,一般用于PWN题,以Direct方式访问 |
| Direct Minimum Port | 9125填写用于动态靶机Direct方式的开始端口 |
| Direct Maximum Port | 9129填写用于动态靶机Direct方式的结束端口 |
填写完成之后记得保存,可以新建题目来测试是否成功,按下表新建题目,表中没提则默认
| 选项 | 内容 |
|---|---|
| Choose Challenge Type | Dynamic docker |
| Name | test |
| Category | test |
| Docker Image | 题目的Docker镜像名 |
| Frp Redirect Type | Direct 或者 Http |
| Frp Redirect Port | 80 |
| Initial Value | 1 |
| Decay Limit | 1 |
| Minimum Value | 1 |
| Score Type | dynamic score |
ps:web题及其他为http类型,pwn题为direct类型
题目新建完成后点击启动,等待靶机创建,可在服务器中输入docker ps -a查看靶机是否启动
总结
- 9123:
默认 http 模式靶机访问端口,需要修改frps.ini、后台中的Http Port、docker-compose.yml - 9124:
默认为 ctfd 端口,需要修改docker-compose.yml - 9125-9129"
动态靶机 Direct 模式端口,需要修改 docker-compose.yml、后台中的端口范围
完成以上文件的修改即可完成对平台用到端口的修改
最后千万别忘了在防火墙中开启允许访问以上提到的端口哟~
关于平台汉化
https://github.com/Gu-f/CTFd_chinese_CN下载好汉化包之后,选择版本,将里面的admin和core文件复制,粘贴在/CTFd/CTFd/themes下,并覆盖即可完成汉化。
题目包
题库:CTFTraining
现在/CTFd目录下创建CTFTraining目录,再进入CTFTraining目录中,有选择性的一个一个拉取题目,以拉去第一个题目为例
mkdir CTFTraining
cd CTFTraining
git clone https://github.com/CTFTraining/0ctf_2016_unserialize.git然后在CTFd后台创建此题目即可



































































































































