声明:本人坚决反对利用文章内容进行恶意攻击行为,一切错误行为必将受到惩罚,绿色网络需要靠我们共同维护,推荐大家在了解技术原理的前提下,更好的维护个人信息安全、企业安全、国家安全。
CTFd是一个Capture The Flag框架,侧重于易用性和可定制性。它提供了运行CTF所需的一切,并且可以使用插件和主题轻松进行自定义。
代码语言:javascript复制官方网站:https://ctfd.io/
下载ctfd:https://github.com/glzjin/CTFd.git
下载frp:https://github.com/fatedier/frp/releases/download/v0.29.0/frp_0.29.0_linux_amd64.tar.gz
下载ctf-whale:https://github.com/glzjin/CTFd-Whale
01
安装部署frps服务
步骤1. 安装启动frps
代码语言:javascript复制wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_amd64.tar.gz
tar -zxvf frp_0.36.2_linux_amd64.tar.gz
cd frp_0.36.2_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/
sudo chmod a x /usr/bin/frpc /usr/bin/frps
步骤2. 编辑frps.ini
代码语言:javascript复制sudo vim /etc/frp/frps.ini
[common]
bind_port = 7897
bind_addr = 0.0.0.0
token =thisistoken
vhost_http_port=80 #如果是http动态域名需要这个。80端口开启需要systemmd使用root权限启用frp
步骤3. 启动frps服务
代码语言:javascript复制sudo systemctl start frps
步骤4. 创建网络并启动frpc容器
代码语言:javascript复制sudo docker network create ctfd_frp-containers
sudo docker network ls
代码语言:javascript复制sudo docker run -d -v ~/frp_0.36.2_linux_amd64/frpc.ini:/etc/frp/frpc.ini --network="ctfd_frp-containers" --restart=always "glzjin/frp"
注意:如果执行上述命令行,产生的frpc容器一直循环启动,通过指令docker logs <frpc容器ID> 查看报错内容为缺少配置文件,则可以将根目录的frp_0.36.2_linux_amd64文件夹删除(注意是系统生成的空文件夹),在下载的frp_0.36.2_linux_amd64文件夹目录执行(本次操作在opt目录下)
代码语言:javascript复制sudo docker run -d -v frp_0.36.2_linux_amd64/frpc.ini:/etc/frp/frpc.ini --network="ctfd_frp-containers" --restart=always "glzjin/frp"
步骤5. 创建网络frpcadmin用于ctfd容器和frpc容器通信
代码语言:javascript复制sudo docker network create frpcadmin
sudo docker network connect frpcadmin <frpc容器名或者ID> #将frpc和ctfd容器单独连接到网络frpcadmin,注意要等容器创建好之后再连接,因此ctfd将在稍后连接
docker network inspect frpcadmin #查看frpcadmin网络的连接情况并记录frpc容器的网络IP
步骤6. 编辑frpc.ini
代码语言:javascript复制vim ~/frp_0.36.2_linux_amd64/frpc.ini
[common] server_addr = 172.17.0.1 # 这里填写宿主机ifconfig之后docker0的ip,因人而异,不要一摸一样填
server_port = 7897
token=thisistoken
admin_addr = 172.19.0.2 #这里填写frpc容器在frpcadmin网络里的ip,因人而异,不要一摸一样填,而且要和后续下图插件配置界面中️的一样。
admin_port = 7400
log_file = ./frpc.log
编辑完之后记得重启frpc容器
02
安装靶场与插件
步骤1. 下载靶场与插件
将插件ctfd-whale 下载到CTFd/plugins目录:
代码语言:javascript复制git clone https://github.com/CTFd/CTFd.git
cd CTFd/
git reset 6c5c63d667a17aec159c8e26ea53dccfbc4d0fa3 --hard #回滚到当前教程适合的版本
cd CTFd/plugins #打开ctfd插件目录
git clone https://github.com/glzjin/CTFd-Whale.git ctfd-whale #确保插件文件夹小写
cd ctfd-whale
git reset 5b32f457e9f56ee9b2b29495f4b3b118be3c57bd --hard #回滚到当前教程适合的版本 cd ../.. #返回ctfd主目录 vim docker-compose.yml
步骤2. 配置docker-compose.yml
代码语言:javascript复制version: '2'
services:
ctfd:
build: .
user: root
restart: always
ports:
- "8000:8000" #你自己的
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:
external:
name: frpcadmin
internal:
internal: true
步骤3. 重新build后启动ctfd
代码语言:javascript复制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 g
RUN adduser -D -u 1001 -s /bin/bash ctfd
WORKDIR /opt/CTFd
RUN mkdir -p /opt/CTFd /var/log/CTFd /var/uploads
RUN pip3 config set global.index-url https://pypi.doubanio.com/simple
RUN pip3 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"]
步骤4. 构建启动镜像。
代码语言:javascript复制docker-compose build docker-compose up -d
步骤5. 将ctfd连接frpcadmin网络
代码语言:javascript复制docker network connect frpcadmin <ctfd容器名或者ID>
03
CTFd部署及插件配置
步骤1. 启动ctfd后进入管理页面选择插件
步骤2. 填写相关参数
进入后随便设置,然后进Admin Panel进行设置
属性 | 配置 |
---|---|
Docker API URL | unix://var/run/docker.sock |
Frp API IP | frpc的ip配置 |
Frp API Port | frpc的端口配置 |
Frp Http Domain Suffix | Docker API URL to connect(可填None) |
Frp Http Port | 80 |
Frp Direct IP Address | 你的公网ip,本机即为127.0.0.1 |
Frp Direct Minimum Port | 与之前frps最小端口呼应 |
Frp Direct Minimum Port | 与之前frps最大端口呼应 |
Max Container Count | 不超过最大-最小 |
Max Renewal Times | 最大实例延时次数 |
Frp config template | 填入frps的配置,只需填[common] |
Docker Auto Connect Containers | ctfd_frpc_1 |
Docker Dns Setting | 可填机器内DNS,没有可填个外网DNS |
Docker Swarm Nodes | linux-1 与前面swarm集群呼应 |
Docker Multi-Container Network Subnet | 内网题大子网ip配置/CIDR |
Docker Multi-Container Network Subnet New Prefix | 每个内网题实例的CIDR |
Docker Container Timeout | 单位为秒 |
最后附上我的配置图片
示例:接下来带领大家创建一个web容器:
首先通过命令行,下载容器镜像,记录好镜像名称,然后在challenge进行配置: