CTFd+CTFd_Whale 1.0
- 上次搭建 CTFd 还是好久好久之前(2年叭),前阵子由于院校比赛需要又捡起来了,这次顺便将动态靶场搭建(Whale)和动态 Flag 都搞上,经过漫长的百度流程,还是总结出了蛮多东西的。
引言
之前有按照网上的文章从零开始搭建 CTFd + Whale,经过了两天的努力侥幸成功了两次(淦),其它都会出现动态靶场出现地址,但是 CTFd 不会拉取镜像的问题(QAQ)。
本来已经放弃,又看到 VaalaCat 师傅的文章可以一键启动,尝试了两遍没问题,写一份文档备用。
VaalaCat 师傅文章地址:传送门
Linux 系统版本:Ubuntu 18.04(众多师傅的反馈发现 Ubuntu 20 会出现不可预测的 bug,我之前也是用 Ubuntu 20.04)
Ubuntu 靶机安装
- VM 安装过程略。
- 登录后修改下 root 密码:
1 | sudo passwd root |
- 进行 SSH 安装,目前靶机用不到 VMware Tools:
1 | apt install -y ssh |
- 因为要后续要进行多个软件安装,更新下 apt 源:
1 | apt install -y vim |
- 更新 apt 源:
1 | apt-get update -y |
- 由于需要 curl 下载文件,安装一下:
1 | apt-get install -y curl |
Docker 环境安装
- 由于动态靶机是使用 docker 实现的,所以首先要准备安装一下 docker(这一步耗时较长):
1 | curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun |
- 然后还要准备 docker-compose(建议使用 proxychains 代理下载):
1 | apt-get install -y python3-pip |
- 这时会出现报错信息:
1 | Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-5ydi0mj7/cryptography/ |
- 百度了一下,需要更新 pip:
1 | python3 -m pip install --upgrade --force pip |
- 再次安装 docker-compose 即可。
Docker 集群配置
- Whale 插件使用的是集群的模式,所以这里要创建一个单个服务器的集群:
1 | docker swarm init |
- 然后将这个服务器加入集群:
1 | docker node update --label-add='name=linux-1' $(docker node ls -q) |
- 最后要准备的是给 docker 更换镜像源,不然会很龟速,修改文件 /etc/docker/daemon.json:
1 | { |
- 重启 docker 生效:
1 | systemctl daemon-reload |
CTFd + Whale 安装
- 使用 VaalaCat 师傅整合好的 ctfd:
1 | git clone https://github.com/Un1kTeam/CTFd --depth=1 |
- 修改 frp 配置文件(看自己需求,不变就不动):
1 | frps.ini |
1 | frpc.ini |
- 插件初始化、更新或检查子模块:
1 | git submodule update --init |
- 启动 CTFd(巨慢,我用了半小时):
1 | docker-compose up -d |
- 查看下 5 个容器是否正常运行:
1 | docker ps -a |
Whale 配置
- 新版 CTFd 的 Whale 和旧版不同,做了板块区分,这里 VaalaCat 师傅已经配好了。
- 左侧 Docker 菜单栏如果没有特殊需求无需更改,只需更改左侧 Frp 菜单栏中的内容:
项 | 内容 |
---|---|
Http Domain Suffix | node.vaala.ink ,这里填写使用 HTTP 方式访问靶机的泛解析域名 |
Http Port | 9123 ,这里填写 frps 中的 vhost_http_port,该端口为 HTTP 方式靶机访问的端口 |
Direct IP Address | chive.vaala.cloud ,这里填写服务器 IP,用于显示 Direct 方式访问的题目的IP |
Direct Minimum Port | 9125 ,这里填写用于动态靶机 Direct 方式的开始端口 |
Direct Maximum Port | 9129 ,这里填写最大端口 |
- 只需要填入 Direct IP Address 即可。
- 最后点一下更新就可以保存配置了,填写完成后新建题目测试是否成功,按下表新建题目,表中没有提到的保持默认就好:
项 | 内容 |
---|---|
Choose Challenge Type | Dynamic docker |
Name | test |
Category | test |
Docker Image | vaalacat/push_f12 |
Frp Redirect Type | Direct 或者 Http |
Frp Redirect Port | 80 |
Initial Value | 1 |
Decay Limit | 1 |
Minimum Value | 1 |
Score Type | dynamic score |
- 新建题目过后点击启动,然后等待靶机创建,可以在服务器中
docker ps -a
查看是否启动,若启动成功则搭建完成。
端口修改
- VaalaCat 师傅仓库中所使用的端口一共有三类,需要修改平台信息请按照以下文件位置修改:
- 9123(一般用不到,都采用直连):
- 默认 http 模式靶机访问端口,需要修改
frps.ini
、后台中的Http Port
、docker-compose.yml
- 默认 http 模式靶机访问端口,需要修改
- 9124:
- 默认为 ctfd 端口,需要修改
docker-compose.yml
- 默认为 ctfd 端口,需要修改
- 9125-9129:
- 动态靶机 Direct 模式端口,需要修改
docker-compose.yml
、后台中的端口范围
- 动态靶机 Direct 模式端口,需要修改
- 9123(一般用不到,都采用直连):
后记
Docker Swarm
- 在一段时间不使用 CTFd 后,使用 docker-compose up -d 会出现如下报错:
1 | root@docker:/opt/CTFd# docker-compose up -d |
- 解决方法如下:
1 | docker swarm leave |
前端汉化
- 由于该大佬的 CTFd 版本是 3.5.0,市面上没有完美适配的汉化包,为了避免意外,将前端汉化一下就好:
- 项目地址:https://github.com/Gu-f/CTFd_chinese_CN
- 下载完成后,我们只需要 CTFd-3.4.1/CTFd/themes/core 文件夹即可,重命名为
core-cn
。 - 将该文件放到 Ubuntu 的 CTFd/CTFd/themes 即可,在后台进行切换:
端口开放
- 由于公司映射的端口比较特殊,且访问量较大,这里直接修改开放端口:
1 | frps: |
路由删减
- 默认打开大致会产生几个路由表项:
1 | root@docker:/opt/CTFd# route |
- 经过简单的尝试,发现若是删除 172.17,就会生成 172.21,所以哪个网段冲突就删除哪个,不影响使用:
1 | route del -net 172.17.0.0 netmask 255.255.0.0 |
- 使用 docker-compose up -d 后重新生成:
1 | root@docker:/opt/CTFd# route |
CTFd Update Del
- 每次进后台都会看见更新提示,很烦,直接删了。
- 该文件需要进入 CTFd/CTFd/themes/admin/templates/base.html 进行修改,把下面这段内容删除:
1 | <div class="container-fluid bg-warning text-center py-3"> |
- 世界清净了:
容器题目
- 建议创建题目时不要直接填镜像 ID,先拉取不然创建很慢。
开启自启动
- 创建一个 ctfd.sh 放在根目录,内容如下:
1 | !/bin/bash |
- 给个执行权限:
1 | chmod +x /root/ctfd.sh |
- 创建服务单元:
1 | vim /etc/systemd/system/ctfd.service |
- 内容如下:
1 | [Unit] |
- 重载一下:
1 | systemctl daemon-reload ; systemctl enable ctfd.service ; systemctl start ctfd.service |
- 验证一下:
1 | root@docker:~# systemctl start ctfd.service |
Web 动态链接
- CTFd_Whale 插件默认情况下是没有动态链接的,非常难受,这里直接修改文件。
- 文件路径:
/opt/CTFd/CTFd/plugins/ctfd-whale/assets/view.js
- 原文内容:
1 | '<div class="card" style="width: 100%;">' + |
- 现修改为:
1 | '<div class="card" style="width: 100%;">' + |
- 如果是比较新的版本,那修改成如下的样子:
1 | $("#user-access").html( |
CTFd 用户批量导入
- 最近也是有个比赛,组队人员也是比较多的,百度了个脚本改了改:
1 | import requests |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yongz丶!