建议使用新版【CTFd】靶场安装与配置(同时支持Whale+Owl+AWD的Docker一键配置版v2)
CTFd是githbu上开源的ctf靶场之一,配合上whale等插件,可以快速搭建一个靶场
CTFd
以下测试环境均为Ubuntu20.04,Python3.8
CTFd官网
CTFd-Github仓库
CTFd中文汉化
由于本人更喜欢汉化风格,所以使用的均为CTFd_chinese_CN下3.4.1版本的CTFd
- 克隆CTFd代码并安装相关依赖
#如果空白环境 sudo ./prepare.sh #如果是在宝塔环境下安装(bt自带的python会产生冲突) sudo apt-get --fix-broken install #如果已经安装好python环境(建议使用3.7) sudo pip install -r requirements.txt
- 下载CTFd_chinese_CN-v3.4.1并将CTFd目录覆盖到你的项目目录
- 运行,默认运行在http://127.0.0.1:4000,你可以通过更改配置文件使其监听0.0.0.0,或者使用nginx反代,此处使用后者
#配置文件CTFd/config.ini python serve.py
CTFd-whale
CTFd-whale是CTFd的动态靶机,依赖Docker集群实现
- 安装Docker与Docker-compose并且启用 Docker Swarm
apt-get install docker docker-compose -y
- 给你的Docker换源,不然会龟速下载
- 在插件目录下,克隆frankli0324修改过的ctfd-whale
#打开ctfd插件目录 cd CTFd/plugins #确保插件文件夹小写 git clone https://github.com/frankli0324/ctfd-whale #安装一些缺少的组件 pip3 install flask_apscheduler flask_redis
- 由于插件使用的是集群的模式,所以这里要创建一个单个服务器的集群,然后将这个服务器加入集群
docker swarm init docker node update --label-add='name=linux-1' $(docker node ls -q)
- 安装启动Frps,Frps为目前最好用的内网代理之一,通过这个将容器映射出去
请访问Frps-Github获取目前最新的版本wget https://github.com/fatedier/frp/releases/download/v0.39.1/frp_0.39.1_linux_amd4.tar.gz tar -zxvf frp_0.39.1_linux_amd64.tar.gz cd frp_0.39.1_linux_amd64 sudo cp systemd/* /etc/systemd/system/ sudo mkdir /etc/frp sudo cp frpc.ini frps.ini /etc/frp/ sudo cp frpc frps /usr/bin/ sudo chmod a+x /usr/bin/frpc /usr/bin/frps sudo systemctl enable frps
修改/etc/frp/frpc.ini,
请自己随机设置一个YOUR_TOKEN
#frps.ini [common] bind_port = 7000 #防火墙记得开放相应端口 bind_addr = 0.0.0.0 vhost_http_port = 10000 #如果是http动态域名需要这个。80端口开启需要systemmd使用root权限启用frp token = YOUR_TOKEN subdomain_host = ctfd-node.hz2016.cn
修改之后重启frps
service frps restart
创建FrpAdmin容器
docker network create --driver overlay ctfd_frp-containers docker run -d -v /etc/frp/frpc.ini:/etc/frp/frpc.ini --network="ctfd_frp-containers" --restart=always "glzjin/frp"
创建网络frpcadmin用于ctfd容器和frpc容器通信
docker network create frpcadmin docker ps #查看容器ID
查看frpcadmin网络的连接情况并记录frpc容器的网络IP
docker network connect frpcadmin
根据上方回显,修改/etc/frp/frpc.ini,此处TOKEN与PORT应该与frps.ini一致
#frpc.ini [common] server_addr = 172.17.0.1 # 这里填写宿主机ifconfig之后docker0的ip,因人而异,不要一摸一样填 server_port = 7000 token = YOUR_TOKEN admin_addr = 172.21.0.2 #这里填写frpc容器在frpcadmin网络里的ip,因人而异,不要一摸一样填,而且要和后续下图插件配置界面中️的一样。 admin_port = 7400
最后记得重启frpc容器
docker restart
由于莫名其妙报错Unable to access frpc admin api
但是反复排查又是没有问题的,于是看源码!#修改CTFd/plugins/ctfd-whale/utils/routers/frp.py第125行 resp = self.ses.get(f'http://{self.url}/api/status')
- 完成Whale相关设置
项 | 内容 | 注释 |
---|---|---|
Http Domain Suffix | ctf-node.hz2016.cn | 这里填写使用http方式访问靶机的泛解析域名 |
Http Port | 10000 | 这里填写frps中的vhost_http_port,该端口为http方式靶机访问的端口 |
Direct IP Address | ctf-direct.hz2016.cn | 这里填写服务器ip,用于显示Direct方式访问的题目的IP |
Direct Minimum Port | 10001 | 这里填写用于动态靶机Direct方式的开始端口 |
Direct Maximum Port | 10010 | 这里填写结束端口 |
参考文献
CTFd+CTFd-whale动态靶机环境搭建
ctfd使用ctfd-whale动态靶机插件搭建靶场指南
手把手教你如何建立一个支持ctf动态独立靶机的靶场(ctfd+ctfd-whale)
记载一次CTFd平台搭建及运维