CTFD动态靶场搭建

CTFD动态靶场搭建

为了迎接未来的新生赛和未来接活做准备,学习一下如何搭建CTFD靶场顺便练练手。不过这中间踩的坑也是巨多,前前后后搭了好几天才搭好。

前置

CTFD使用的是的docker搭建,所以在服务器上需要先装好docker和docker-compose。其中ctfd有多种搭建方式,我采用的是服务器本地起frp服务将题目容器转发到服务器的端口上。

安装FRP

下载并安装rp

1
2
3
4
5
6
7
8
9
10
wget https://github.com/fatedier/frp/releases/download/v0.29.0/frp_0.29.0_linux_amd64.tar.gz
tar -zxvf frp_0.29.0_linux_amd64.tar.gz
cd frp_0.29.0_linux_amd64
cd frp_0.29.0_linux_amd64
sudo cp systemd/* /etc/systemd/system/ #移动配置文件
sudo mkdir /etc/frp #创建客户端配置文件
sudo cp frpc.ini frps.ini /etc/frp/ #移动客户端配置文件
sudo cp frpc frps /usr/bin/ #将客户端和服务端的二进制文件移动至bin文件夹
sudo chmod a+x /usr/bin/frpc /usr/bin/frps #给所有用户赋予frpc和frps的可执行权限
sudo systemctl enable frps #将frps服务设置为每次开机启动

编辑frps配置文件

1
2
3
4
5
vim /etc/frp/frps.ini
[common]
bind_port = 7897
bind_addr = 0.0.0.0
token =thisistoken

启动frps服务

1
systemctl start frps

修改/etc/frp/frpc.ini的配置文件

此处的frpc与上面的frps相对应,连接的是上面启动的frps

1
2
3
4
5
vim /etc/frp/frpc.ini
[common]
server_addr = 172.17.0.1#此处的IP为docker0的ip,docker0的ip通过ifconfig查看
server_port = 7897
token=thisistoken

再修改frp_0.29.0_linux_amd64/frpc.ini (这个文件会用来配置frpc容器的)

1
2
3
4
5
6
7
[common]
server_addr = 172.17.0.1
server_port = 7897
token=thisistoken
admin_addr = 172.20.0.3
admin_port = 7400
log_file = ./frps.log

创建网络并运行frpc容器

1
2
3
docker network create ctfd_frp-containers #创建一个docker网络,名称为ctfd_frp-containers

docker run -d -v ~/frp_0.29.0_linux_amd64/frpc.ini:/etc/frp/frpc.ini --network="ctfd_frp-containers" --restart=always "glzjin/frp" #运行容器并将本地的frpc.ini挂载到容器内。网络名称为ctfd_frp-containers

接着创建frpcadmin网络用语ctfd和frpc容器通信

1
2
docker network creat frcadmin
docker network connect frpcamdin id<刚才启动的frpc容器ID>

查看frpcadmin网络的连接情况并记录frpc容器的网络IP

1
docker network inspect frpcadmin

图中的IP就是frpc容器在frpcadmin网络中的IP地址,就是我们在/frp/frpc.ini中指定的(admin_addr)

image-20230820205128158

可以提前把这个地址记录下来,后面配置ctfd-whale的时候会用到。

安装CTFd和CTFd-whale

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#下载ctfd
git clone https://github.com/CTFd/CTFd.git
#进入CTFd目录
cd CTFd
#回退到某个版本,直接执行下面命令
git reset 6c5c63d667a17aec159c8e26ea53dccfbc4d0fa3 --hard
cd CTFd/CTFd/plugins/ #进入plugins目录

#下载插件并确保文件名小写
git clone https://github.com/glzjin/CTFd-Whale.git ctfd-whale
#进入ctfd-whale
cd ctfd-whale
#回退版本
git reset 5b32f457e9f56ee9b2b29495f4b3b118be3c57bd --hard
#回到第一层CTFd目录
cd ../../../
#配置docker-compose
vim docker-compose.yml

docker-compose.yml,直接复制粘贴就行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
version: '2.2'

services:
ctfd:
build: .
user: root
restart: always
ports:
- "8000:8000" #第一个是访问ctfd的端口,第二个是docker端口映射出去的端口
environment:
- UPLOAD_FOLDER=/var/uploads
- DATABASE_URL=mysql+pymysql://root:ctfd@db/ctfd
- REDIS_URL=redis://cache:6379
- WORKERS=1
- LOG_FOLDER=/var/log/CTFd
- ACCESS_LOG=-
- ERROR_LOG=-
volumes:
- .data/CTFd/logs:/var/log/CTFd
- .data/CTFd/uploads:/var/uploads
- .:/opt/CTFd:ro
- /var/run/docker.sock:/var/run/docker.sock #添加这句即可,别的基本按照官方的不用动
depends_on:
- db
networks:
default:
internal:

db:
image: mariadb:10.4.12 #这里改成10.4.12,10.4.13会出错
restart: always
environment:
- MYSQL_ROOT_PASSWORD=ctfd
- MYSQL_USER=ctfd
- MYSQL_PASSWORD=ctfd
- MYSQL_DATABASE=ctfd
volumes:
- .data/mysql:/var/lib/mysql
networks:
internal:
# This command is required to set important mariadb defaults
command: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci, --wait_timeout=28800, --log-warnings=0]

cache:
image: redis:4
restart: always
volumes:
- .data/redis:/data
networks:
internal:

networks:
default:
internal:
internal: true

进入CTFd目录,修改Dockerfile的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
FROM python:3.6-alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories &&\
apk update && \
apk add python3 python3-dev linux-headers libffi-dev gcc make musl-dev py-pip mysql-client git openssl-dev
RUN adduser -D -u 1001 -s /bin/bash ctfd

WORKDIR /opt/CTFd
RUN mkdir -p /opt/CTFd /var/log/CTFd /var/uploads
RUN pip config set global.index-url https://pypi.doubanio.com/simple
RUN pip config set install.trusted-host pypi.doubanio.com
COPY requirements.txt .

RUN pip install -r requirements.txt -i https://pypi.doubanio.com/simple

COPY . /opt/CTFd

RUN for d in CTFd/plugins/*; do \
if [ -f "$d/requirements.txt" ]; then \
pip install -r $d/requirements.txt -i https://pypi.doubanio.com/simple; \
fi; \
done;

RUN chmod +x /opt/CTFd/docker-entrypoint.sh
RUN chown -R 1001:1001 /opt/CTFd
RUN chown -R 1001:1001 /var/log/CTFd /var/uploads

USER 1001
EXPOSE 8000
ENTRYPOINT ["/opt/CTFd/docker-entrypoint.sh"]

requirements.txt内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Flask==1.1.2
Werkzeug==0.16.0
Flask-SQLAlchemy==2.4.1
Flask-Caching==1.4.0
Flask-Migrate==2.5.2
Flask-Script==2.0.6
SQLAlchemy==1.3.11
SQLAlchemy-Utils==0.36.0
passlib==1.7.2
bcrypt==3.1.7
six==1.13.0
itsdangerous==1.1.0
jinja2==2.11.3
requests>=2.20.0
PyMySQL==0.9.3
gunicorn==19.9.0
normality==2.0.0
dataset==1.1.2
mistune==0.8.4
netaddr==0.7.19
redis==3.3.11
datafreeze==0.1.0
gevent==21.12.0
python-dotenv==0.10.3
flask-restplus==0.13.0
pathlib2==2.3.5
flask-marshmallow==0.10.1
marshmallow-sqlalchemy==0.17.0
boto3==1.10.39
markupsafe==1.1.1
marshmallow==2.20.2

准备好后开始构建容器,进入CTFd目录

1
docker-compose biuld

启动镜像

1
docker-compose up -d

启动完之后将ctfd容器加入到frpcadmin的网络之中

1
2
docker ps #查看ctfd容器的ID
docker network connect frpcadmin #容器ID

可以看到ctfd容器已经加入到了frpcadmin容器之中了

image-20230821113536575

查看容器运行状态

image-20230821113654613

访问 ip:8000进入平台,按需填写内容

image-20230821113902068

上方导航栏Admin->Plugins 配置CTFd Whale相关内容

image-20230821141633201

image-20230821141835333

image-20230821142048736

image-20230821142123914

添加题目

上方challenges处添加题目,选择dynamic_docker创建动态题目

image-20230821142321874

image-20230821142545317

image-20230821142719030

image-20230821142727231

最后不要忘记选择动态分数

成功部署题目

image-20230821142835370

image-20230821142845326

flag也是动态flag

image-20230821142949627


CTFD动态靶场搭建
https://sammylingsj.github.io/2023/08/27/CTFD平台搭建/CTFD靶场搭建/
作者
s4mmy
发布于
2023年8月27日
许可协议