后续更新:
https://www.yuque.com/hxfqg9/misc/ctfd
搭建
初始化集群
docker swarm init
如果不行加个 --force-new-cluster
docker node update --label-add='name=linux-1' $(docker node ls -q)
加入集群别名 linux-1
下载CTFd并安装插件
git clone https://gitee.com/yichen115/CTFd.git --depth=1
cd CTFd
git submodule update --init
拉起来
docker-compose up -d
访问
等上面拉起来之后访问(端口取决于 docker-compose.yml 我这个是 80)setup 自己随便设置
在 Admin Panel 的 Whale 的 Frp 的 Direct IP Address 是你服务器的 IP
Direct Minimum Port |
动态靶机Direct方式可用最小端口 |
Direct Maximum Port |
动态靶机Direct方式可用最大端口 |
维护
flag格式
在后台的 whale 界面的 Challenges 选项更改
默认是:
{{ "flag{"+uuid.uuid4()|string+"}" }}
#flag{67031515-682b-4f59-9678-bc43c7674096}
前缀随便改了,想要把中间的 - 去掉,可以在后面加个 .hex
{{ "ctf{"+uuid.uuid4().hex|string+"}" }}
#ctf{cea24c8b0f0949e6887d3348251f2fca}
忘记管理员密码
先随便注册一个账号,docker ps 查看容器,进 mariadb:10.4.12 mysql -u root -p
密码是 ctfd
在数据库 ctfd,user 表,把刚才注册的用户 type 字段改为 admin,然后登录就行了
[×]题目分页与检索
想要实现类似 BUU 那种可以分页的,网上暂时没找到合适的
https://gitee.com/kee1ong/ctfd-pages-theme
有个差不多的,但是不行,npm 简直魔鬼,各种报错,暂时放弃😅
Read-only file system解决
想进 ctfd 的 docker 换个主题啥的,结果给我说 Read-only file system
感觉是 docker-compose.yml 的第 22 行有个 :ro
,因为它的基础镜像是没有这个 Read-only的,把这个去掉就行了🤦♂️我给的链接已经去掉了,可以直接用,这里只是记录一下
换主题
解决了 Read-only file system 直接找个适配 CTFd 版本的主题,去 docker 里面 clone 下来,然后后台更换即可
MARK 几个适配了 3.3.0 的主题:
ctfd-neon-theme
为了下载速度,我同步到了 gitee:
https://gitee.com/yichen115/ctfd-neon-theme
CTFd-theme-pixo:
https://gitee.com/yichen115/CTFd-theme-pixo
这个对动态靶机支持不好,不过这字体是真的好看,看看能不能两个结合一下😋
QQ群机器人
改了个小脚本,当有用户注册或者答对题目时会在 qq 群发消息:
https://github.com/yichen115/ctfd-qq-bot
我这个只是一个小爬虫,主要是配合 go-cqhttp 项目
去 https://docs.go-cqhttp.org/ 找一个适合自己服务器的 release 版本,放在服务器上,首次运行会生成一个文件,里面填写用来作为机器人的 qq 账号密码之类的,然后后台运行就行了,网上挺多方法,比如运行着 ctrl+z 然后 bg,还有 nohup 这种的
nohup python3 ctfd-bot.py &
ctfd-bot.py 是用 python3 写的,先安装对应的库,打开修改对应的参数,然后也是后台运行起来即可,需要关掉直接 kill -9 pid
出题
参考:
https://www.zhaoj.in/read-6259.html
https://blog.csdn.net/Cypher_X/article/details/115359957
https://www.v0n.top/2020/05/01/如何正确使用Docker出一道CTF题目/
PWN 题环境
这个不错,还没试:
https://github.com/TaQini/pwn_docker
WEB 题环境
整体结构:files 是个文件夹,里面有 flag.sh 和 html 文件夹,html 是题目源码
docker-compose.yml
Dockerfile
files--|
|--flag.sh
|--html--|
|--index.php
|--flag.php
首先当然是题目了,就完整的写好题目就可以啦,放在一个 html 文件夹里
flag 自定义一个特殊的后面用,这里使用 flag{dockerflag}
,后面会自动替换
然后写一个 flag.sh 用来动态生成密码,使用 sed 去 flag.php 查找 flag{dockerflag} 然后替换为 ctfd-whale 自动生成的 $FLAG,最后删掉这个文件,sed 查找的目录根据需要自己写
sed -i "s/flag{dockerflag}/$FLAG/" /var/www/html/flag.php
export FLAG=not_flag
FLAG=not_flag
rm -f /flag.sh
如果是 sql 注入这类的题,需要写到数据库中
#!/bin/bash
# 修改数据库中的 FLAG,自定义sql语句把
mysql -e "USE ctf;INSERT INTO Flag VALUES('$FLAG');" -uroot -proot
export FLAG=not_flag
FLAG=not_flag
rm -f /flag.sh
然后编写 Dockerfile
FROM ctftraining/base_image_nginx_mysql_php_73
#这里自己选择基础镜像
COPY ./files /tmp/
RUN cp -rf /tmp/html /var/www/ #把题目复制到 /var/www
&& cp -f /tmp/flag.sh /flag.sh #强制拷贝flag.sh到根目录
&& chown -R www-data:www-data /var/www/html #设置权限
docker-compose.yml 里面的端口以及 flag 都会随机生成,没必要,倒是可以用来生成镜像 docker-compose up -d
version: "2"
services:
web:
build: .
image: yichen115/web_get_method
restart: always
ports:
- "127.0.0.1:8302:80"
environment:
- FLAG=flag{123}
整理文档的时候突然懵了,我没看到有运行 flag.sh 的地方呀,原来 ctftraining 的镜像带着,docker-php-entrypoint 里面有个
if [[ -f /flag.sh ]]; then
source /flag.sh
fi
替他类型的直接静态flag吧
本文始发于微信公众号(陈冠男的游戏人生):CTFd动态靶机搭建与维护
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论