第144篇:Docker+CTFd动态靶场环境后台配置及题库部署的踩坑全记录(下篇)

admin 2025-12-29 00:47:35 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细记录了CTFd动态靶场后台配置与题库部署过程。重点讲解了Whale插件的API与网络设置、Docker镜像下载与Compose版本升级问题,以及后台添加题目时的资源限制、动态分值配置。文章特别指出了题目隐藏状态需手动更新的坑点,并完成了选手启动实例答题的流程验证。 综合评分: 91 文章分类: CTF,安全工具,安全建设,实战经验


cover_image

第144篇:Docker+CTFd 动态靶场环境后台配置及题库部署的踩坑全记录(下篇)

原创

abc123info

希潭实验室

2025年12月27日 12:58 山东

Part1 前言

大家好,我是ABC_123。接下来继续写完CTFd动态靶场环境搭建的剩余部分。虽然这套CTFd动态靶场坑很多,但是解决这些坑点过程,还是有不少收获。

Part2 技术研究过程

  • CTFd后台设置

在上一篇文章中,我们通过管理员后台设置好了攻防比赛的名称、详细介绍、开始日期及截止日期等。接下来使用先前注册的管理员账号admin:123456登录,继续配置CTF比赛的题库。

切换到CTFd Whale界面。API URL地址填写CTFd 将要连接的 Docker API 地址,比如 unix:///var/run/docker.sock 或 tcp://host:2375。

Credentials:填写 docker.io 镜像仓库账号与密码,用于拉取私有 Docker 靶场题库镜像。

Swarm Nodes:指定运行容器的 Swarm 节点列表,当存在多个节点时,从中自动选择一个节点部署题目容器。该功能支持 label,比如 name=linux-* 匹配规则。

Dns Setting:指定容器内部使用的 DNS 服务器地址。让容器通过内网 DNS 解析题目域名,如果不需要特殊 DNS,可留空或使用 8.8.8.8。

Grouped Containers(分组容器配置):用于支持多容器联动题目,每个选手启动的实例可能是一个容器组。

Auto Connect Containers:ctfd-frpc-1。例如,当第 5 个选手启动题目时,Whale 自动创建:Network:multi-net-team5(/24)、team_5_web(题目独立实例)、ctfd-frpc-1(自动加入该网络)。这样 frpc 就可以进行内部通信,并自动生成一个访问链接,例如:https://team5.ctf.example.com/,CTFd会把这个访问链接展示给选手。

Multi-Container Network Subnet:174.1.0.0/16,为所有多容器题目的虚拟网络提供一个大网段地址池,Whale插件从这里划分出小网段给每个选手的实例。类似于docker network create –subnet=174.1.0.0/16。

Multi-Container Network Subnet New Prefix:24。用于指明划分给每个实例网络子网的自动前缀长度。则每个实例会分配一个 /24 子网,例如:174.1.1.0/24 给第1 个选手实例,174.1.2.0/24 给第 2 个选手实例。

Flag Template(动态 Flag 模板):每实例自动生成一个 UUID 作为 flag,格式类似:flag{a7c3b7df-8cfe-48ad-8b2f-9bdf3634975e}。

切换到Theme标签页,这里可以更改CTFd的主题。

  • 部署CTF题库镜像

首先从github网站上下载题库。这个url中有很多题库,挨个打包下载比较麻烦,于是写了一个sh脚本批量下载每个文件夹的所有配置文件。

clone h*tt*ps://github.c*o*m/CTFTraining/CTFTraining.git

接下来选择一个题目进行部署,如0ctf_2016_unserialize,这是一道反序列化漏洞利用的题目。使用docker-compose up -d 命令运行,结果报错;应该是docker-compose版本过低,接下来升级一下。

执行sudo apt remove docker-compose -y将旧版本卸载掉,接下来输入which docker-compose ,如果不输出内容,说明卸载干净。

然后执行 sudo apt install docker-compose-plugin -y 开始重新安装。安装完成后发现,v2版本的用法变了,改为 docker compose up -d 运行docker。

输入docker ps -a,发现题目已经部署成功,并且STATUS为Up状态。

接下来切换到Challenge标签页,加载这个题目让所有答题者看到。Name:题目名称test111;Category:题目所属类别名称web;Message:题目描述/提示,展示给参赛者的题目说明,可以写题目背景、提示、说明、附件链接等。

Docker Image:指定用于部署题目的 Docker 镜像名称。

Frp Redirect Type:控制通过 FRP (反向代理) 将容器开放给外网的方式。通常选择Direct,直接将端口暴露出去(适合内网或简单部署)。

Frp Redirect Port:指定容器内部要暴露给选手访问的端口。通常为 Web 服务端口,例如 80 或 8080。

Docker Container Memory Limit:限制容器可占用的最大内存,防止选手消耗资源拖垮服务器。

Docker Container CPU Limit:限制 CPU 使用量。0.5 表示最多占用半个 CPU 核心。

Initial Value:题目刚发布时的初始分数50;Decay Limit:每次有人解答出题目后降低的分数;Minimum Value:分值最低可掉到的分数10。

Flag 输入框:输入题目的静态 flag 内容;Case Sensitive:是否区分大小写;Files:题目文件上传区域(可选),用于上传附件,让选手下载并配合解题,比如源码、说明文档、压缩包等;State(题目可见性):控制该题是否允许参赛者看到和访问。接下来点击Finish,这里有个坑,直接点击Finish没有反应,需要我们自己动手把当前窗口X掉。

回到Challenges标签页,发现题目已经成功添加。这里又有一个坑,发现题目还是hidden状态,这种状态下,选手是看不到题目内容的。

接下来需要双击题目名称test111,然后选择State为Visible,然后点击Update更新;注意,这里一定要点击Update,其他的功能按钮都没办法更新State状态。

  • 参赛选手登录答题

接下来让每一个参赛选手注册个普通用户,登录平台答题。

登录平台之后,在Challenges页面会列出上传的CTF题目。

双击指定的题目,会弹出一个页面,点击launch an instance,会启动一个docker题库的实例。

使用给出的域名和端口组成URL进行访问,可以开始答题了。

 Part3 总结

1.  后续会继续更新相关的CTF比赛环境的搭建过程,在解决各种坑的过程中,我们也可以学到不少知识,如Linux的配置、Docker集群配置、CTFd环境的原理等等。

2.  大家有好的建议,欢迎给我留言。为了便于技术交流,现已建立微信群”希水涵-信安技术交流群”,欢迎您的加入。

公众号专注于网络安全技术分享,包括APT事件分析、红队攻防、蓝队分析、渗透测试、代码审计等,每周一篇,99%原创,敬请关注。

Contact me: 0day123abc#gmail.com

OR 2332887682#qq.com

(replace # with @)


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:希潭实验室 abc123info《第144篇:Docker+CTFd 动态靶场环境后台配置及题库部署的踩坑全记录(下篇)》

2025年录课总结 网络安全文章

2025年录课总结

文章总结: 作者haidragon在2025年完成了5套Rust及1套恶意软件课程的录制,主要精力集中在Rust语言教学。2026年规划将重心转移至恶意软件分析
评论:0   参与:  0