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、进入系统后台设置,打开插件设置页面,按照如下指导进行设置。点击可看大图。
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、添加一个题目,进行测试。点击可看大图。
7、点击 Preview,可以尝试启动靶机。
8、测试成功,配置完成。
二、单机 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、进入系统后台设置,打开插件设置页面,按照如下指导进行设置。点击可看大图。
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、添加一个题目,进行测试。点击可看大图。
7、点击 Preview,可以尝试启动靶机。
8、测试成功,配置完成。
附:如想让 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、进入系统后台设置,打开插件设置页面,按照如下指导进行设置。点击可看大图。
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、添加一个题目,进行测试。点击可看大图。
8、点击 Preview,可以尝试启动靶机。
9、测试成功,配置完成。
四、跨机 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、进入系统后台设置,打开插件设置页面,按照如下指导进行设置。点击可看大图。
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、添加一个题目,进行测试。点击可看大图。
8、点击 Preview,可以尝试启动靶机。
9、测试成功,配置完成。
附:如想让 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 个评论
苏苏
Step 1/13 : FROM python:3.7-alpine
3.7-alpine: Pulling from library/python
df20fa9351a1: Pull complete
36b3adc4ff6f: Pull complete
d4f879c74e1d: Pull complete
6064e23ad526: Pull complete
ff64a3b3d6f3: Pull complete
Digest: sha256:3bb2acc9bd988159abe35442a208895de22b76ecdbf565c636edbf01551d9905
Status: Downloaded newer image for python:3.7-alpine
—> 6ca3e0b1ab69
Step 2/13 : WORKDIR /opt/CTFd
—> Running in 73dcebbe381e
Removing intermediate container 73dcebbe381e
—> e226692e6caf
Step 3/13 : RUN mkdir -p /opt/CTFd /var/log/CTFd /var/uploads
—> Running in 54aaa480c880
Removing intermediate container 54aaa480c880
—> 5b11890b70ab
Step 4/13 : RUN sed -i ‘s/dl-cdn.alpinelinux.org/mirror.tuna.tsinghua.edu.cn/g’ /etc/apk/repositories && apk update && apk add python python-dev linux-headers libffi-dev gcc make musl-dev py-pip mysql-client git openssl-dev
—> Running in a55e856905d6
fetch http://mirror.tuna.tsinghua.edu.cn/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
fetch http://mirror.tuna.tsinghua.edu.cn/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
v3.12.0-175-g8b3334c57c [http://mirror.tuna.tsinghua.edu.cn/alpine/v3.12/main]
v3.12.0-177-g0fe5306cd8 [http://mirror.tuna.tsinghua.edu.cn/alpine/v3.12/community]
OK: 12750 distinct packages available
ERROR: unsatisfiable constraints:
python (missing):
required by: world[python]
python-dev (missing):
required by: world[python-dev]
ERROR: Service ‘ctfd’ failed to build: The command ‘/bin/sh -c sed -i ‘s/dl-cdn.alpinelinux.org/mirror.tuna.tsinghua.edu.cn/g’ /etc/apk/repositories && apk update && apk add python python-dev linux-headers libffi-dev gcc make musl-dev py-pip mysql-client git openssl-dev’ returned a non-zero code: 2
glzjin
再重试下- ||
苏苏
重试了N遍了
sin
请问解决了吗?我也一直报这个错误。
h3110w0r1d
我试了试把Dockerfile中的python和python-dev改为python3和python3-dev,成功启动
苏苏
frpc起不来,换了公网ip成就,这是ip设的不对吗
logs:
dial tcp 172.17.0.1:6490: connect: no route to host
dial tcp 172.19.0.1:6490: connect: connection timed out
苏苏
换公网ip也不行
苏苏
docker-compose.yml 里写的172.1.0.0的地址,照着教程用172.1.0.1也是no route to host
顾准
我也这样,请问解决了吗
Sinon
这个估计是因为防火墙端口没开,把对应的端口开了就可以
苏苏
这又是什么问题?
Step 1/13 : FROM python:3.7-alpine
3.7-alpine: Pulling from library/python
df20fa9351a1: Pull complete
36b3adc4ff6f: Pull complete
d4f879c74e1d: Pull complete
6064e23ad526: Pull complete
2551f262ffbe: Pull complete
Digest: sha256:afbf56228fee964053a9be2724ce3d946de5ff38b166d97e51faa919591b549e
Status: Downloaded newer image for python:3.7-alpine
—> c4d4af4fa7c0
Step 2/13 : WORKDIR /opt/CTFd
—> Running in fc5b80cb283a
Removing intermediate container fc5b80cb283a
—> 3a6befb2c98f
Step 3/13 : RUN mkdir -p /opt/CTFd /var/log/CTFd /var/uploads
—> Running in 208fb4c23d12
Removing intermediate container 208fb4c23d12
—> 03a8efa8a31a
Step 4/13 : RUN sed -i ‘s/dl-cdn.alpinelinux.org/mirror.tuna.tsinghua.edu.cn/g’ /etc/apk/repositories && apk update && apk add python python-dev linux-headers libffi-dev gcc make musl-dev py-pip mysql-client git openssl-dev
—> Running in 8ea741e9f92e
fetch http://mirror.tuna.tsinghua.edu.cn/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
ERROR: http://mirror.tuna.tsinghua.edu.cn/alpine/v3.12/main: No such file or directory
WARNING: Ignoring APKINDEX.21599bd3.tar.gz: No such file or directory
fetch http://mirror.tuna.tsinghua.edu.cn/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
ERROR: http://mirror.tuna.tsinghua.edu.cn/alpine/v3.12/community: No such file or directory
WARNING: Ignoring APKINDEX.9b490c07.tar.gz: No such file or directory
2 errors; 35 distinct packages available
ERROR: Service ‘ctfd’ failed to build: The command ‘/bin/sh -c sed -i ‘s/dl-cdn.alpinelinux.org/mirror.tuna.tsinghua.edu.cn/g’ /etc/apk/repositories && apk update && apk add python python-dev linux-headers libffi-dev gcc make musl-dev py-pip mysql-client git openssl-dev’ returned a non-zero code: 2
苏苏
frp的默认404页面怎么改啊?
利用docker 搭建动态靶场ctfd(含CTFd-whale) – fairyco's world
[…] CTFd-Whale 推荐部署实践 […]
shana的小迷弟
ctfd_1 | /usr/local/lib/python3.6/site-packages/tzlocal/unix.py:158: UserWarning: Can not find any timezone configuration, defaulting to UTC.
ctfd_1 | warnings.warn(‘Can not find any timezone configuration, defaulting to UTC.’)
ctfd_1 | Job “whale-auto-clean (trigger: interval[0:00:10], next run at: 2020-10-27 12:58:51 UTC)” raised an exception
ctfd_1 | Traceback (most recent call last):
ctfd_1 | File “/usr/local/lib/python3.6/site-packages/apscheduler/executors/base.py”, line 125, in run_job
ctfd_1 | retval = job.func(*job.args, **job.kwargs)
ctfd_1 | File “/opt/CTFd/CTFd/plugins/ctfd-whale/__init__.py”, line 202, in auto_clean_container
ctfd_1 | FrpUtils.update_frp_redirect()
ctfd_1 | File “/opt/CTFd/CTFd/plugins/ctfd-whale/frp_utils.py”, line 53, in update_frp_redirect
ctfd_1 | requests.put(“http://” + configs.get(“frp_api_ip”) + “:” + configs.get(“frp_api_port”) + “/api/config”, output,
ctfd_1 | TypeError: must be str, not NoneType
求赵师傅快快看到吧
Shana的小迷弟
不好意思错误见多了看到直接傻了,后来查到没初始化导致的问题,打扰赵师傅了,删评吧
Shana的小迷弟
2020-10-27T18:16:25.489301147Z 2020/10/27 18:16:25 [E] [proxy.go:549] [direct_1-57f469c5-9389-48ec-b1ba-244ccf61757a] connect to local service [1-57f469c5-9389-48ec-b1ba-244ccf61757a:80] error: lookup 1-57f469c5-9389-48ec-b1ba-244ccf61757a on 127.0.0.11:53: no such host
2020-10-27T18:16:25.489475934Z 2020/10/27 18:16:25 [E] [proxy.go:549] [direct_1-57f469c5-9389-48ec-b1ba-244ccf61757a] connect to local service [1-57f469c5-9389-48ec-b1ba-244ccf61757a:80] error: lookup 1-57f469c5-9389-48ec-b1ba-244ccf61757a on 127.0.0.11:53: no such host
…..这次配置没问题啊,看了下frp日志跟我报没有此host,可是节点已经看到了运行容器,就是没有端口号显示
SK
请问这里是怎么解决的,我也遇到相同问题了
wzs
师傅好,我想请教一下buu的challenge左侧的题目分类是怎么做的,用的什么插件呢,谢谢!
she11s
赵师傅这个插件可以通过指定docker-compose来部署题目吗,而不是指定docker镜像
glzjin
镜像处填写 json,dict,key为内网 host,value 为镜像 tag。
oldhen
点击插件CTFd-Whale,显示404是哪里错了呢?
Python成神之路 - 搭建 CTFd 平台
[…] 我选择的是 CTFd 这个框架,网上的资料很多,配上插件,搭建动态靶机靶场很方便。 […]