在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后台创建此题目即可