news 2026/5/27 19:09:12

如何用Docker快速搭建CTFd动态靶场?5分钟搞定CTFd-Whale配置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用Docker快速搭建CTFd动态靶场?5分钟搞定CTFd-Whale配置

5分钟极速部署CTFd动态靶场:Docker+Whale插件实战指南

为什么需要动态靶场?

在网络安全竞赛或教学场景中,传统静态靶场存在明显的局限性——所有参赛者共享同一套题目环境,容易导致Flag被复制传播、解题思路被窥探等问题。动态靶场技术通过为每位用户实时生成独立隔离的题目环境,从根本上解决了这些痛点:

  • 环境隔离性:每个队伍获得专属容器实例
  • Flag唯一性:系统自动生成差异化Flag
  • 资源可控性:按需分配计算资源,结束后自动回收

CTFd-Whale作为官方推荐的动态靶场插件,通过与Docker深度集成,实现了开箱即用的动态环境管理能力。下面我们将用最简洁的步骤完成整套系统的部署。

1. 环境准备

1.1 基础组件安装

确保系统已安装以下核心组件(以Ubuntu 20.04为例):

# 更新软件源 sudo apt-get update && sudo apt-get upgrade -y # 安装Docker引擎 curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER # 安装Docker Compose sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose

验证安装结果:

docker --version && docker-compose --version

1.2 网络配置优化

动态靶场需要特殊的网络架构支持,建议提前规划以下网络配置:

网络名称用途说明IP段示例
ctfd_networkCTFd核心服务通信172.16.0.0/24
whale_network动态靶机容器间通信172.17.0.0/24
frp_networkFRP反向代理通信172.18.0.0/24

创建基础网络:

docker network create ctfd_network docker network create whale_network

2. 快速部署CTFd核心

2.1 一键启动基础服务

创建docker-compose.yml文件:

version: '3' services: ctfd: image: ctfd/ctfd:latest ports: - "8000:8000" volumes: - ctfd_data:/var/ctfd - /var/run/docker.sock:/var/run/docker.sock networks: - ctfd_network environment: - UPLOAD_FOLDER=/var/uploads - DATABASE_URL=mysql+pymysql://root:ctfd@db/ctfd - REDIS_URL=redis://redis:6379 db: image: mariadb:10.5 environment: - MYSQL_ROOT_PASSWORD=ctfd - MYSQL_DATABASE=ctfd volumes: - db_data:/var/lib/mysql networks: - ctfd_network redis: image: redis:6 networks: - ctfd_network volumes: ctfd_data: db_data: networks: ctfd_network: driver: bridge

启动服务:

docker-compose up -d

提示:首次启动可能需要2-3分钟初始化数据库,访问http://服务器IP:8000即可进入安装向导

2.2 管理员账户配置

完成网页端的初始化设置后,建议通过命令行创建超级用户:

docker exec -it ctfd_ctfd_1 flask create_admin

3. Whale插件集成

3.1 插件安装与配置

进入CTFd容器安装插件:

docker exec -it ctfd_ctfd_1 bash cd /opt/CTFd/plugins git clone https://github.com/glzjin/CTFd-Whale.git exit

修改docker-compose.yml增加Whale所需配置:

ctfd: environment: - WHALE_ENABLED=true - WHALE_FRPC_API=http://frpc:7400 - WHALE_DOCKER_BASE_URL=unix://var/run/docker.sock - WHALE_SUBNET=172.18.0.0/24

3.2 FRP服务部署

添加FRP服务到docker-compose.yml

services: frpc: image: glzjin/frp volumes: - ./frpc.ini:/etc/frp/frpc.ini networks: - frp_network - ctfd_network restart: always networks: frp_network: driver: bridge

创建frpc.ini配置文件:

[common] server_addr = 172.18.0.1 server_port = 6490 token = your_secure_token admin_addr = 0.0.0.0 admin_port = 7400

重启服务使配置生效:

docker-compose down && docker-compose up -d

4. 动态题目实战配置

4.1 题目环境构建

以简单的Web题目为例,准备Docker镜像:

FROM nginx:alpine COPY flag /flag COPY src /usr/share/nginx/html RUN chmod 444 /flag && \ echo "<?php echo system(\$_GET['cmd']); ?>" > /usr/share/nginx/html/shell.php

构建并推送镜像:

docker build -t your_registry/web_challenge:latest . docker push your_registry/web_challenge:latest

4.2 CTFd后台配置

  1. 进入Admin Panel → Whale → Settings
  2. 填写Docker连接参数:
    • Docker API URL:unix://var/run/docker.sock
    • FRP API URL:http://frpc:7400
  3. 创建新题目时选择"Dynamic"类型
  4. 配置题目容器参数:
image: your_registry/web_challenge ports: - "80" memory: 128m cpu: 0.5

4.3 访问测试

参赛者点击"Start Instance"后,系统将自动:

  1. 从指定镜像创建独立容器
  2. 分配随机端口并通过FRP暴露
  3. 生成唯一Flag注入容器
  4. 在题目页面显示访问入口

5. 运维与监控技巧

5.1 资源监控命令

查看当前运行的动态容器:

docker ps --filter "label=whale=true"

监控资源使用情况:

docker stats $(docker ps -q --filter "label=whale=true")

5.2 日志排查方法

查看特定容器的运行日志:

docker logs -f 容器ID

检查FRP连接状态:

curl http://localhost:7400/api/status

5.3 自动清理策略

设置Cron任务定期清理闲置实例:

0 * * * * docker ps -q --filter "label=whale=true" --filter "status=exited" | xargs docker rm -f

对于资源占用过高的容器,可以通过API强制回收:

import docker client = docker.from_env() for container in client.containers.list(filters={"label": "whale=true"}): if container.attrs['State']['Memory']['usage'] > 512*1024*1024: container.kill()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/1 3:40:34

从原理到实践:深入解析高斯金字塔与拉普拉斯金字塔的构建与重构

1. 理解图像金字塔&#xff1a;为什么需要多尺度表示&#xff1f; 当你用手机拍摄一张照片后&#xff0c;如果直接放大查看细节&#xff0c;会发现图像逐渐变得模糊。这种从清晰到模糊的变化过程&#xff0c;其实就隐含了图像金字塔的核心思想。我第一次接触这个概念是在开发一…

作者头像 李华
网站建设 2026/4/1 3:39:54

SendOnlySerial:AVR单向串口输出的零RAM调试方案

1. SendOnlySerial 库深度技术解析&#xff1a;面向资源受限嵌入式系统的极简串口输出方案1.1 设计哲学与工程定位SendOnlySerial 并非对 ArduinoSerial类的简单裁剪&#xff0c;而是一次面向 AVR 微控制器&#xff08;特别是 ATmega328P 系列&#xff09;资源瓶颈的精准外科手…

作者头像 李华
网站建设 2026/4/1 3:39:54

JDspyder:三步掌握京东抢购自动化的终极指南

JDspyder&#xff1a;三步掌握京东抢购自动化的终极指南 【免费下载链接】JDspyder 京东预约&抢购脚本&#xff0c;可以自定义商品链接 项目地址: https://gitcode.com/gh_mirrors/jd/JDspyder 还在为心仪的热门商品秒杀失败而烦恼吗&#xff1f;JDspyder京东抢购脚…

作者头像 李华
网站建设 2026/4/1 3:37:41

SpringBoot 接口测试:Postman 与 JUnit 5 实战

做后端开发&#xff0c;接口测试是绕不开的环节&#xff0c;既要保证接口能正常运行&#xff0c;又要应对前后端联调、线上稳定&#xff0c;所以今天就结合实际开发场景&#xff0c;来讲讲接口测试的方法。做后端这么久&#xff0c;发现很多同学要么只靠Postman手动测试&#x…

作者头像 李华