CTFd-Whale 是本人开发的一个 CTFd 插件, 具有如下优点:
- 可允许用户创建属于自己的独立靶机。(解题时不像共享靶机一样受其他用户对题目操作的影响,体验更好)
- 可快速部署题目(题目镜像在 dockerhub 上有即可,可快速使用他人打包好的题目)
- 可在一台低配置机器上部署成百上千的题目(只要硬盘够大,因为题目是按需启动,不是同时运行的)
为了便于各位安装 CTFd-Whale,部署自己的动态靶机靶场,特作此文阐述几种模式下由一台新机器到靶机能打开为止的全过程。
一、单机 Direct 模式(Frp 转发在一个机器上,只需要一台机器,靶机通过端口号访问,无需配置域名解析)
1、在机器上安装好 Docker 和 Docker-Compose,并且启用 Docker Swarm。
Docker Swarm 参考:https://www.jianshu.com/p/77c4c62d9afe
注意需要用以下命令来标记节点:
docker node ls #检查节点 ID
docker node update --label-add name=linux-1 <节点 ID>
参考链接:
2、在机器上下载代码。
git clone -b single https://github.com/glzjin/CTFd.git
3、进入目录,编辑 frp 两端配置文件,使 token 随机,再使用 docker-compose 启动相关组件。
cd CTFd
vi frp/frps.ini # token 一定要随机
vi frp/frpc.ini # token 一定要随机
git submodule update --init
docker-compose up -d
4、启动完毕,打开 http://ip:8000 安装 CTFd。
5、进入系统后台设置,打开插件设置页面,按照如下指导进行设置。点击可看大图。
![](https://www.zhaoj.in/wp-content/uploads/2019/10/1572522408fd2e2edaab6606e1882e0798dbe86b2c-1024x617.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/10/15725226305e155d156701c4b433a70bc7a905f57e-1024x591.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/10/1572522684d6659fff263ce6521d74abc38f363839-1024x175.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/11/15728808403db7850437a1d884003d84d9ba5bba74-1024x137.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/11/1574352783a80f73dad9a2b6cd529fde32de133b2b-1024x449.png)
Frp Config Template,记得修改 token:
[common]
token = randomme
server_addr = 172.1.0.1
server_port = 6490
pool_count = 200
tls_enable = true
admin_addr = 172.1.0.3
admin_port = 7400
其他内容无特殊情况无需修改。
6、添加一个题目,进行测试。点击可看大图。
![](https://www.zhaoj.in/wp-content/uploads/2019/10/1572522897889d097d59c3a0b90947548fc8dfa58b-1024x613.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/10/1572523092e0eab9d4a0b8034c8ce59849e56f8284-1024x796.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/10/1572523123378c3d81c847b6d5d97a8f251ae7acc9-1024x271.png)
7、点击 Preview,可以尝试启动靶机。
![](https://www.zhaoj.in/wp-content/uploads/2019/10/1572523242cb5a39442addd24e00bf7575c529b2f3-999x1024.png)
8、测试成功,配置完成。
![](https://www.zhaoj.in/wp-content/uploads/2019/10/157252326152b19c6ff4080f71b341e1a778bf9f52-1024x244.png)
二、单机 Direct + Http 模式(Frp 转发在一个机器上,只需要一台机器,靶机通过端口号或者域名访问,需要配置域名解析)
0、准备一个域名,设置如下解析。
- A | *.test.127.0.0.1.nip.io | 你机器 IP
1、在机器上安装好 Docker 和 Docker-Compose,并且启用 Docker Swarm。
Docker Swarm 参考:https://www.jianshu.com/p/77c4c62d9afe
注意需要用以下命令来标记节点:
docker node ls #检查节点 ID
docker node update --label-add name=linux-1 <节点 ID>
参考链接:
2、在机器上下载代码。
git clone -b single-http https://github.com/glzjin/CTFd.git
3、进入目录,编辑 frp 两端配置文件,使 token 随机,使用 docker-compose 启动相关组件。
cd CTFd
vi frp/frps.ini # token 一定要随机
vi frp/frpc.ini # token 一定要随机
git submodule update --init
docker-compose up -d
4、启动完毕,打开 http://ip:8000 安装 CTFd。
5、进入系统后台设置,打开插件设置页面,按照如下指导进行设置。点击可看大图。
![](https://www.zhaoj.in/wp-content/uploads/2019/10/1572524065a67e21a70cd331b5d1643bdc2dcb7d2c-1024x615.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/10/15725226305e155d156701c4b433a70bc7a905f57e-1024x591.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/10/1572522684d6659fff263ce6521d74abc38f363839-1024x175.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/11/1572880834a87c2015720648fd25aa119e2a5d7ceb-1024x137.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/11/157435279085d263384977c01e4c7e5d108f5a3c33-1024x449.png)
Frp Config Template,记得修改 token:
[common]
token = randomme
server_addr = 172.1.0.1
server_port = 6490
pool_count = 200
tls_enable = true
admin_addr = 172.1.0.3
admin_port = 7400
其他内容无特殊情况无需修改。
6、添加一个题目,进行测试。点击可看大图。
![](https://www.zhaoj.in/wp-content/uploads/2019/10/1572522897889d097d59c3a0b90947548fc8dfa58b-1024x613.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/10/1572524287cec0dd04cdb4c6e80c07a42ecaed95bc-1024x601.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/10/1572523123378c3d81c847b6d5d97a8f251ae7acc9-1024x271.png)
7、点击 Preview,可以尝试启动靶机。
![](https://www.zhaoj.in/wp-content/uploads/2019/10/1572524401f49bfea7eea3a9a76009f38497a0d9af-1007x1024.png)
8、测试成功,配置完成。
![](https://www.zhaoj.in/wp-content/uploads/2019/10/1572524411ee83c2c31e03c6f33af985035ff1d31e-1024x259.png)
附:如想让 CTFd 也走 80 端口可在 frpc 配置里加一个配置节,也就是 frp/frpc.ini 和 上面的 Frp Config Template 里。
[ctfd]
type = http
local_ip = 172.1.0.2
local_port = 8000
use_encryption = true
use_compression = true
custom_domains = domain.for.your.ctfd.com
三、跨机 Direct 模式(Frp 转发在两个机器上,Frpc 和 CTFd 在一起–下面用机器 A 表示,Frps 单独放一个机器–下面用机器 B 表示,靶机通过端口号访问,无需配置域名解析)
1、在机器上安装好 Docker 和 Docker-Compose,并且启用 Docker Swarm。
Docker Swarm 参考:https://www.jianshu.com/p/77c4c62d9afe
注意需要用以下命令来标记节点:
docker node ls #检查节点 ID
docker node update --label-add name=linux-1 <节点 ID>
参考链接:
2、在机器B上下载代码,编辑 frps 配置文件,随机化 token,并使用 docker-compose 启动相关组件。
git clone https://github.com/glzjin/Frp-Docker-For-CTFd-Whale.git
cd Frp-Docker-For-CTFd-Whale
vi frp/frps.ini
docker-compose up -d
3、在机器A上下载代码。
git clone -b double https://github.com/glzjin/CTFd.git
4、进入目录,编辑 frp 两端配置文件,使 token 随机,并且设置 server_addr 为 机器 B 的 IP,使用 docker-compose 启动相关组件。
cd CTFd
vi frp/frpc.ini # token 一定要随机,并且设置 server_addr 为 机器 B 的 IP
git submodule update --init
docker-compose up -d
5、启动完毕,打开 http://ip:8000 安装 CTFd。
6、进入系统后台设置,打开插件设置页面,按照如下指导进行设置。点击可看大图。
![此图像的alt属性为空;文件名为1572522408fd2e2edaab6606e1882e0798dbe86b2c-1024x617.png](https://www.zhaoj.in/wp-content/uploads/2019/10/1572522408fd2e2edaab6606e1882e0798dbe86b2c-1024x617.png)
![此图像的alt属性为空;文件名为15725226305e155d156701c4b433a70bc7a905f57e-1024x591.png](https://www.zhaoj.in/wp-content/uploads/2019/10/15725226305e155d156701c4b433a70bc7a905f57e-1024x591.png)
![此图像的alt属性为空;文件名为1572522684d6659fff263ce6521d74abc38f363839-1024x175.png](https://www.zhaoj.in/wp-content/uploads/2019/10/1572522684d6659fff263ce6521d74abc38f363839-1024x175.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/11/157288081866a315d58456c96377c7673244535731-1024x137.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/11/15743528043a2419c5022ec5fcc7d13aed03e1011b-1024x449.png)
Frp Config Template,记得修改 ip 和 token:
[common]
token = randomme
server_addr = remote_ip
server_port = 6490
pool_count = 200
tls_enable = true
admin_addr = 172.1.0.3
admin_port = 7400
其他内容无特殊情况无需修改。
7、添加一个题目,进行测试。点击可看大图。
![此图像的alt属性为空;文件名为1572522897889d097d59c3a0b90947548fc8dfa58b-1024x613.png](https://www.zhaoj.in/wp-content/uploads/2019/10/1572522897889d097d59c3a0b90947548fc8dfa58b-1024x613.png)
![此图像的alt属性为空;文件名为1572523092e0eab9d4a0b8034c8ce59849e56f8284-1024x796.png](https://www.zhaoj.in/wp-content/uploads/2019/10/1572523092e0eab9d4a0b8034c8ce59849e56f8284-1024x796.png)
![此图像的alt属性为空;文件名为1572523123378c3d81c847b6d5d97a8f251ae7acc9-1024x271.png](https://www.zhaoj.in/wp-content/uploads/2019/10/1572523123378c3d81c847b6d5d97a8f251ae7acc9-1024x271.png)
8、点击 Preview,可以尝试启动靶机。
![此图像的alt属性为空;文件名为1572523242cb5a39442addd24e00bf7575c529b2f3-999x1024.png](https://www.zhaoj.in/wp-content/uploads/2019/10/1572523242cb5a39442addd24e00bf7575c529b2f3-999x1024.png)
9、测试成功,配置完成。
![此图像的alt属性为空;文件名为157252326152b19c6ff4080f71b341e1a778bf9f52-1024x244.png](https://www.zhaoj.in/wp-content/uploads/2019/10/157252326152b19c6ff4080f71b341e1a778bf9f52-1024x244.png)
四、跨机 Direct + Http 模式(Frp 转发在两个机器上,Frpc 和 CTFd 在一起–下面用机器 A 表示,Frps 单独放一个机器–下面用机器 B 表示,靶机通过端口号或者域名访问,需要配置域名解析)
0、准备一个域名,设置如下解析。
- A | *.test.127.0.0.1.nip.io | 机器B IP
1、在机器上安装好 Docker 和 Docker-Compose,并且启用 Docker Swarm。
Docker Swarm 参考:https://www.jianshu.com/p/77c4c62d9afe
注意需要用以下命令来标记节点:
docker node ls #检查节点 ID
docker node update --label-add name=linux-1 <节点 ID>
参考链接:
2、在机器B上下载代码,编辑 frps 配置文件,随机化 token,并使用 docker-compose 启动相关组件。
git clone -b double-http https://github.com/glzjin/Frp-Docker-For-CTFd-Whale.git
cd Frp-Docker-For-CTFd-Whale
vi frp/frps.ini # token 一定要随机
docker-compose up -d
3、在机器A上下载代码。
git clone -b double https://github.com/glzjin/CTFd.git
4、进入目录,编辑 frp 两端配置文件,使 token 随机,并且设置 server_addr 为 机器 B 的 IP,使用 docker-compose 启动相关组件。
cd CTFd
vi frp/frpc.ini # token 一定要随机,并且设置 server_addr 为 机器 B 的 IP
git submodule update --init
docker-compose up -d
5、启动完毕,打开 http://ip:8000 安装 CTFd。
6、进入系统后台设置,打开插件设置页面,按照如下指导进行设置。点击可看大图。
![此图像的alt属性为空;文件名为1572524065a67e21a70cd331b5d1643bdc2dcb7d2c-1024x615.png](https://www.zhaoj.in/wp-content/uploads/2019/10/1572524065a67e21a70cd331b5d1643bdc2dcb7d2c-1024x615.png)
![此图像的alt属性为空;文件名为15725226305e155d156701c4b433a70bc7a905f57e-1024x591.png](https://www.zhaoj.in/wp-content/uploads/2019/10/15725226305e155d156701c4b433a70bc7a905f57e-1024x591.png)
![此图像的alt属性为空;文件名为1572522684d6659fff263ce6521d74abc38f363839-1024x175.png](https://www.zhaoj.in/wp-content/uploads/2019/10/1572522684d6659fff263ce6521d74abc38f363839-1024x175.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/11/157288080986beed578fac199676b7b093a086361d-1024x137.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/11/1574352804de32546011d0ce9fb9eaaca63df89dbe-1024x449.png)
Frp Config Template,记得修改 token:
[common]
token = randomme
server_addr = remote_ip
server_port = 6490
pool_count = 200
tls_enable = true
admin_addr = 172.1.0.3
admin_port = 7400
其他内容无特殊情况无需修改。
7、添加一个题目,进行测试。点击可看大图。
![此图像的alt属性为空;文件名为1572522897889d097d59c3a0b90947548fc8dfa58b-1024x613.png](https://www.zhaoj.in/wp-content/uploads/2019/10/1572522897889d097d59c3a0b90947548fc8dfa58b-1024x613.png)
![此图像的alt属性为空;文件名为1572524287cec0dd04cdb4c6e80c07a42ecaed95bc-1024x601.png](https://www.zhaoj.in/wp-content/uploads/2019/10/1572524287cec0dd04cdb4c6e80c07a42ecaed95bc-1024x601.png)
![此图像的alt属性为空;文件名为1572523123378c3d81c847b6d5d97a8f251ae7acc9-1024x271.png](https://www.zhaoj.in/wp-content/uploads/2019/10/1572523123378c3d81c847b6d5d97a8f251ae7acc9-1024x271.png)
8、点击 Preview,可以尝试启动靶机。
![此图像的alt属性为空;文件名为1572524401f49bfea7eea3a9a76009f38497a0d9af-1007x1024.png](https://www.zhaoj.in/wp-content/uploads/2019/10/1572524401f49bfea7eea3a9a76009f38497a0d9af-1007x1024.png)
9、测试成功,配置完成。
![此图像的alt属性为空;文件名为1572524411ee83c2c31e03c6f33af985035ff1d31e-1024x259.png](https://www.zhaoj.in/wp-content/uploads/2019/10/1572524411ee83c2c31e03c6f33af985035ff1d31e-1024x259.png)
附:如想让 CTFd 也走 80 端口可在 frpc 配置里加一个配置节,也就是 frp/frpc.ini 和 上面的 Frp Config Template 里。
[ctfd]
type = http
local_ip = 172.1.0.2
local_port = 8000
use_encryption = true
use_compression = true
custom_domains = domain.for.your.ctfd.com
85 个评论
小王
按教程写了,第一种,但题目的镜像(动态靶机启动不了,有端口被占用),[W] [control.go:142] [direct_1-72fb5947-1280-46a8-a073-c22129005d3a_udp] start error: port already used(frpc容器),
[W] [control.go:395] [be74747970a83782] new proxy [direct_1-72fb5947-1280-46a8-a073-c22129005d3a_udp] error: port already used(frps–)这个可以怎么解决?
白鹤
我也遇到同样问题 ,请问解决了吗
白鹤
我也遇到同样问题 ,请问解决了吗
robber
师傅好,我想请问一下默认用插件起的动态docker容器是不通外网的,如何配置可以实现默认创建的docker容器可以连外网呢
glzjin
搜索代码中的 internal,删掉。
pwjcw
竞赛中心的面板那个是插件吗?
glzjin
是的。
caicaiooh
师傅好,我用该插件遇到了能创建靶机,但是本机和ip访问都访问不了的情况,我检查了防火墙,它是正常的,后面检查了frps,它也是正常的,到了frpc就发现了访问被拒绝了
[proxy.go:549] [direct_1-44f49b3b-53f5-4fe2-9f65-4791799ce7a5] connect to local service [1-44f49b3b-53f5-4fe2-9f65-4791799ce7a5:78] error: dial tcp 172.2.0.8:78: connect: connection refused
请问这怎么解决呢?
glzjin
frpc端口不对。
段段
大神有没有联系方式或者交流群,有问题想请教你呢
glzjin
没有:——)
笑看风云
我按方案三在两台虚拟机上搭建跨机Direct,机器A配置两块网卡,一个NAT模式,一个仅主机模式,机器B也配置两块网卡,一个桥接模式,一个仅主机模式。两台虚拟机的仅主机模式的网卡都设为固定IP,在机器A上建立Docker swarm,机器B加入。
我现在遇到的问题是:通过仅主机模式的IP直接访问机器A正常,访问机器B就不行,不论通过桥接网卡的IP还是仅主机网卡的IP
glzjin
B上开了什么服务吗?