CTF平台之CTFm的搭建过程
Drunkbaby Lv6

CTF 平台之 CTFm 的搭建过程

CTF 平台之 CTFm 的搭建过程

0x01 前言

感谢 EkiXu 师傅
感谢 火柴 师傅

说一说为什么要用 CTFm 吧。

CTFm 相对于 CTFd 更加稳定,而且更加集成,那些 frpc.inifrps.ini 都不需要自己手动配置的。

0x02 环境准备

这里很感谢火柴师傅帮我避了很多坑,要不然我会崩溃的吧😭😭

1. 机器型号

Ubuntu 20.04

2. 工具准备

node 的安装

这里必须是 node16 的版本,不能是 node18 的。

1
2
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs

这里在安装 node16 的时候很可能在装完之后输入 node -v 之后没反应的,这里需要使用的安装命令为,我记得 Ubuntu 会提示你的,按照提示的来就可以,好像是加上 --fix 的参数。

1
sudo apt-get install -y nodejs --fix

再安装 yarn,这里对 yarn 没有版本需求

1
npm install --global yarn

docker 及一系列东西的安装

首先安装 docker

1
2
sudo apt-get update
sudo apt-get install docker

安装 docker-compose,这里挺坑的,要安装最新版本的 docker-compose,不然到后面容易踩坑。

1
sudo wget -O /usr/local/bin/docker-compose "https://github.com/docker/compose/releases/latest/download/docker-compose-https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)"

再进行授权与验证

1
2
3
4
chmod a+x /usr/local/bin/docker-compose

//验证
docker-compose --version

0x03 开始搭建

1. 创建 docker-swarm

1
docker swarm init

2. 标记节点

1
2
docker node ls #检查节点 ID
docker node update --label-add name=linux-1 <节点 ID>

3. 拉取代码

1
2
3
4
5
6
7
8
git clone https://github.com/EkiXu/CTFm
cd CTFm
#拉取子模块
git submodule update --init --recursive
#创建log文件夹
mkdir backend/log/
cd backend/log/
chmod 777 log -R // 这个很重要,不然会踩坑的

这一步如果卡的话,多操作几次,或者开代理。我搭建的时候代理一直配不起来。

4. 创建相关 secret

1
2
3
4
5
echo -n "Z3brFdddeh2F37G2rTB" > "./secrets/DB_PASSWORD"

echo -n "r1vMTdppMcdvvPFk7bB" > "./secrets/REDIS_PASSWORD"

echo -n "o1bGorxEMZdXsq2WuJZ" > "./secrets/SECRET_KEY"

这里用随机的就可以,和我一样也可以。

5. 前端代码生成(可选)

  • 5,6 两步我都没有进行部署
1
2
3
cd frontend
yarn install
yarn build

6. 中台代码生成(可选)

1
2
3
cd dashboard
yarn install
yarn build

7. 使用docker-compose编排启动

1
sudo docker-compose up -d --build

8. 数据库和管理员账号初始化

  • 这里的管理员账号不要输错,不然挺麻烦的。
1
2
3
sudo docker-compose exec ctfm /bin/bash 
python manage.py migrate
python manage.py createsuperuser

至此,已经可以访问了,默认的是 80 端口

0x04 一些其他设置

1. 关于recaptcha验证码

这是一定要配的,如果不配的话无法完成注册,不过是要付费的。

需要自行到https://www.google.com/recaptcha/获取客户端密钥和服务端密钥。

这里的密钥版本是 v2 的,不要踩坑去弄了 v3 的。关于密钥的位置在这个地方获取,当时我也是找了一会儿。

进去之后要先自己创建项目的,这些都挺简单的,密钥的话在这里。

客户端密钥存放在 frontend/.env

1
2
VUE_APP_BASE_API = '/api/v1'
VUE_APP_RECAPTCHA_PUBLIC_KEY = '<your RECAPTCHA_CLIENT_KEY>'

并重新生成前端

1
yarn build

在服务端设置中添加

1
2
#backend/CTFm_backend/settings.py // 文件位置
DRF_RECAPTCHA_SECRET_KEY = "<your RECAPTCHA_SERVER_KEY>"

2. 关于邮件验证功能

这里如果是小比赛不需要配,像校内的比赛就不需要了。

我这里就略过了,如果需要配的师傅们可以去官方文档这里看CTFm/README.zh.md at master · EkiXu/CTFm (github.com)

邮箱验证自己的小比赛不需要是因为可以在 admin 下修改 user 权限

3. CTFd-Whale 插件的配置

CTFm 真的比 CTFd 方便快捷太多了,这里都不需要进行配置,直接集成就有了。在起完项目 docker 服务之后,以管理员账号登入,在左侧的 Dashboard 下点 admin,进行 Whale 配置。

几点注意事项说一说,以防踩坑

Frp HTTP Domain Suffix 可以不填的,就空在那儿。

Frp Config 这里,是把 frpc.ini 的全部内容粘贴进来的,当时我这里也踩坑了。

Frp Direct IP address 就填服务器 IP 即可。

如果一直弄不起来的话,检查一下 frpc.inifrps.ini 的token,最好不要随机,写一个大致 8 位长的密钥即可,要两个一致。

0x05 题目设置

主要是 Web 类的题目,如果要使用 dynamic container 的话,并且不是使用域名的情况下,设置应当注意一下这个。

如果使用了域名,需要选择 HTTP 80 端口

0x06 小结

官方文档的内容还是比较少,我这里基本把所有的坑都踩了一遍。

像我这么粗心的人的话,搭建 CTFd 对我来说太难了,我个人强推 CTFm

 评论