D1a0y1bb/CloverSec-CTF-Build-Dockerizer-skill
GitHub: D1a0y1bb/CloverSec-CTF-Build-Dockerizer-skill
一款基于状态化工作流和 AI Agent 的 CTF 竞赛题目容器化构建与校验工具,实现从题目源码到平台标准 Docker 镜像的自动化交付。
Stars: 29 | Forks: 1
# CloverSec-CTF-Build-Dockerizer
。
重试提示词:
不要重新执行全部流程。只修当前 ERROR 项,
然后重跑必要检查,并汇报修改文件和命令结果。
验收命令:
bash scripts/doc_guard.sh
bash src/CloverSec-CTF-Build-Dockerizer/scripts/validate_examples.sh
## 竞赛模式构建分类
### Jeopardy(Web / Pwn / AI)
适用:常规CTF竞赛的解题模式,默认 `profile=jeopardy`。
python3 src/CloverSec-CTF-Build-Dockerizer/scripts/render.py \
--config src/CloverSec-CTF-Build-Dockerizer/examples/node-basic/challenge.yaml \
--output /tmp/jeopardy-node
bash src/CloverSec-CTF-Build-Dockerizer/scripts/validate.sh \
/tmp/jeopardy-node/Dockerfile \
/tmp/jeopardy-node/start.sh \
/tmp/jeopardy-node/challenge.yaml
### Linux-QEMU(Linux kernel CVE / LPE)
适用:需要指定 guest kernel、initrd/rootfs、内核模块或内核配置的 Linux kernel 漏洞题。典型形态是外层 Docker 负责平台交付,内层 QEMU guest 负责漏洞环境。
建议配置形态:
challenge:
name: kernel-cve-demo
stack: linux-qemu
profile: jeopardy
base_image: debian:bookworm-slim
workdir: /opt/kernel-qemu
expose_ports: ["22"]
start:
mode: cmd
cmd: "qemu-system-x86_64"
vm:
arch: x86_64
accelerator: tcg
memory: 768M
cpus: 2
kernel: vm/vmlinuz
initrd: vm/initrd.img
rootfs: vm/rootfs.ext4
append: "console=ttyS0 root=/dev/vda rw"
guest_forwards:
- proto: tcp
host_port: "22"
guest_port: "22"
guest_flag_path: /root/flag
flag_injection: debugfs
healthcheck_mode: ssh-banner
交付要求:
- `/start.sh` 前台执行 QEMU,并显式设置 `-m`、`-smp`、`-nographic`、网络与 `hostfwd`。
- 默认使用 TCG;KVM 只能作为显式可选项,平台不应自动使用 `--privileged`。
- `EXPOSE`、平台端口映射、QEMU `hostfwd` 三处要对应。
- `changeflag.sh` 如果只写 `/flag`,guest 内不会自动看到新 flag;内层 flag 路径需要单独写入 rootfs 或由 guest 启动脚本读取。
- PoC/EXP 不建议进入镜像,作为附件与题解资料管理。
- 大型 kernel/rootfs 示例不建议进入默认 CI,完整启动验证应在 release/manual 阶段执行。
- 真实 VM 资产用 `asset_manifest.yaml` 记录文件名、大小和 SHA256;大文件仍放在外部目录。
Release/manual 验证入口:
python3 src/CloverSec-CTF-Build-Dockerizer/scripts/verify_asset_manifest.py --manifest /path/to/asset_manifest.yaml
bash scripts/linux_qemu_manual_check.sh --mode preflight --case-dir /path/to/linux-qemu/code --asset-manifest /path/to/asset_manifest.yaml
bash scripts/linux_qemu_manual_check.sh --mode boot --case-dir /path/to/linux-qemu/code --host-port 2222
详细分层、TCG/KVM 边界、动态 flag 写入和 PoC 证据记录见 `src/CloverSec-CTF-Build-Dockerizer/docs/linux_qemu_manual_validation.md`。
### RDG
适用:防守运维 + check_service 计分场景,通常使用 `stack=rdg`。
python3 src/CloverSec-CTF-Build-Dockerizer/scripts/render.py \
--config src/CloverSec-CTF-Build-Dockerizer/examples/rdg-python-ssti-basic/challenge.yaml \
--output /tmp/rdg-python
bash src/CloverSec-CTF-Build-Dockerizer/scripts/validate.sh \
/tmp/rdg-python/Dockerfile \
/tmp/rdg-python/start.sh \
/tmp/rdg-python/challenge.yaml
可用 `generate_check_stub.py` 生成 HTTP/TCP/Redis/MySQL/SSH 的可编辑 check-service 骨架:
python3 src/CloverSec-CTF-Build-Dockerizer/scripts/generate_check_stub.py \
--type http \
--output /tmp/rdg-python/check/check.sh \
--target-port 80 \
--path / \
--expect-status 200 \
--expect-text "login"
生成脚本默认带 `CHECK_REVIEW_REQUIRED`,`validate.sh` 会阻断发布,直到人工确认并移除标记。HTTP 还支持 `--forbid-text`、`--expect-header`、`--forbid-header`;Redis 支持 `--redis-key` / `--redis-expect-value`;MySQL 支持 `--mysql-query` / `--mysql-expect-text`。
### AWD
适用:攻防混合赛,基于现有 Web/Pwn 栈叠加 `profile=awd` 与运维入口。
关键点:暂时不新增 `stack=awd`,而是现有 stack + `profile=awd`。
python3 src/CloverSec-CTF-Build-Dockerizer/scripts/render_scenario.py \
--config src/CloverSec-CTF-Build-Dockerizer/examples/scenario-awd-basic/scenario.yaml \
--output /tmp/scenario-awd \
--accepted \
--reason "user accepted AWD scenario example"
python3 src/CloverSec-CTF-Build-Dockerizer/scripts/validate_scenario.py \
--output /tmp/scenario-awd
上面的命令只校验 scenario/compose 结构;如需同时调用 `validate.sh` 检查每个服务目录,可追加:
python3 src/CloverSec-CTF-Build-Dockerizer/scripts/validate_scenario.py \
--output /tmp/scenario-awd \
--validate-rendered
批量回归入口 `validate_examples.sh` 和 `smoke_test.sh` 默认会对 scenario 示例执行逐服务交付校验,也就是自动追加等价的 `--validate-rendered`。如只需要轻量结构校验,可设置 `SCENARIO_VALIDATE_RENDERED=0`。
### AWDP
适用:attack + fix双竞赛模式下的题目,选手需要提交补丁包后通过竞赛平台上传后自动执行。
固定补丁模式:
- `patch/src/`
- `patch/patch.sh`
- `patch_bundle.tar.gz`
python3 src/CloverSec-CTF-Build-Dockerizer/scripts/render.py \
--config src/CloverSec-CTF-Build-Dockerizer/examples/node-awdp-basic/challenge.yaml \
--output /tmp/awdp-node
bash src/CloverSec-CTF-Build-Dockerizer/scripts/validate.sh \
/tmp/awdp-node/Dockerfile \
/tmp/awdp-node/start.sh \
/tmp/awdp-node/challenge.yaml
### SecOps
适用:安全运维与加固配置类题目。`stack=secops + profile=secops` 已经做了独立语义,不再混入 RDG。
python3 src/CloverSec-CTF-Build-Dockerizer/scripts/render.py \
--config src/CloverSec-CTF-Build-Dockerizer/examples/secops-nginx-basic/challenge.yaml \
--output /tmp/secops-nginx
bash src/CloverSec-CTF-Build-Dockerizer/scripts/validate.sh \
/tmp/secops-nginx/Dockerfile \
/tmp/secops-nginx/start.sh \
/tmp/secops-nginx/challenge.yaml
### BaseUnit(指定版本服务包最小单元)
适用:快速生成某组件某版本的纯服务基座镜像,避免现场手工编译踩坑。首批组件:`mysql`、`redis`、`sshd`、`ttyd`、`apache`、`nginx`、`tomcat`、`php-fpm`、`vsftpd`、`weblogic`。
python3 src/CloverSec-CTF-Build-Dockerizer/scripts/render_component.py --list
python3 src/CloverSec-CTF-Build-Dockerizer/scripts/render_component.py \
--component redis \
--variant 7.2-alpine \
--profile jeopardy \
--output /tmp/baseunit-redis
bash src/CloverSec-CTF-Build-Dockerizer/scripts/validate.sh \
/tmp/baseunit-redis/Dockerfile \
/tmp/baseunit-redis/start.sh \
/tmp/baseunit-redis/challenge.yaml
### Bundle / Recipe(老环境组合)
适用:单容器多服务老环境。BaseUnit 是单组件,Scenario 是本地多服务编排,Bundle 是一个 Docker 镜像内的 Recipe。已知组合可用固定 Recipe;未知组合可用显式 custom 配置,但必须写清 base image、安装命令、启动命令、端口和服务清单。
python3 src/CloverSec-CTF-Build-Dockerizer/scripts/render_bundle.py \
--recipe legacy-centos7-python39-mysql57-redis5 \
--output /tmp/bundle-centos7
python3 src/CloverSec-CTF-Build-Dockerizer/scripts/validate_bundle.py \
--bundle-dir /tmp/bundle-centos7
当前固定 Recipe 为 `legacy-centos7-python39-mysql57-redis5` 与 `tomcat85-jdk8-mysql57`,均为 `support_level=partial`。显式 custom 示例见 `examples/bundle-custom-explicit/`。旧系统包源和 MySQL 5.7 安装方式可能需要人工处理,默认回归只要求 render 与静态契约校验。
### Vulhub-like(多服务漏洞环境迁移)
适用:把 Vulhub 风格的多服务场景迁移到本地 compose 编排 + 平台单服务交付。快速的完成历史CVE的本地靶场引擎的适配,`docker-compose.yml` 仅用于本地验证,平台交付仍是每个服务独立目录。
python3 src/CloverSec-CTF-Build-Dockerizer/scripts/render_scenario.py \
--config src/CloverSec-CTF-Build-Dockerizer/examples/scenario-vulhub-like-basic/scenario.yaml \
--output /tmp/scenario-vulhub-like \
--accepted \
--reason "user accepted Vulhub-like scenario example"
python3 src/CloverSec-CTF-Build-Dockerizer/scripts/validate_scenario.py \
--output /tmp/scenario-vulhub-like
上面的命令只校验 scenario/compose 结构;如需同时调用 `validate.sh` 检查每个服务目录,可追加 `--validate-rendered`。批量回归入口默认会执行逐服务交付校验;设置 `SCENARIO_VALIDATE_RENDERED=0` 可恢复为仅检查 scenario/compose 结构。
已有 `docker-compose.yml` 的目录可先生成导入草案:
python3 src/CloverSec-CTF-Build-Dockerizer/scripts/import_compose.py \
--compose path/to/docker-compose.yml \
--output /tmp/compose-import \
--scenario-name imported-scenario
该命令会同时生成完整 `scenario.draft.yaml`、可渲染子集 `scenario.renderable.yaml` 和 `import-report.json`。draft 会保留 ports、environment、depends_on、volumes、networks、healthcheck、command/entrypoint 等线索;只有可渲染子集适合继续交给 `render_scenario.py`。
构建级 smoke 支持可选业务断言文件 `smoke_assert.yaml`:
assertions:
- type: http
path: /
expect_status: 200
expect_text: "login"
- type: tcp
timeout_seconds: 5
- type: container_exec
cmd: "test -f /flag"
已有 `smoke_assert.sh` 仍然可用;两个文件都存在时会先执行 YAML,再执行 shell 脚本。
日常调试不需要跑全量 smoke,可以指定示例:
bash src/CloverSec-CTF-Build-Dockerizer/scripts/smoke_test.sh --case secops-redis-hardening-basic
bash src/CloverSec-CTF-Build-Dockerizer/scripts/smoke_test.sh --case python-flask-basic
SMOKE_CASES=node-basic,pwn-basic \
bash src/CloverSec-CTF-Build-Dockerizer/scripts/smoke_test.sh
`python-flask-basic` 是内置 `challenge.verification.solve_probe` 示例,会从 `challenge.yaml` 读取 HTTP 断言并验证题目入口。
## 平台硬契约与边界
所有渲染产物必须满足:存在 `Dockerfile`。存在可执行 `start.sh`。存在可执行 `changeflag.sh`。容器内存在 `/bin/bash`。Dockerfile 声明 `EXPOSE`。`start.sh` 启动真实服务进程,禁止空转保活。
`flag` 规则:默认需要交付 `flag`。显式 `include_flag_artifact=false` 时,只能放行 `flag` 缺失,不能放行 `changeflag.sh` 缺失。
业务 flag 路径:平台只认识 `/flag`,题目程序可能读取 `/home/ctf/flag0`、`/home/ctf/flag1`、`/challenge/flag.php` 等路径。此时在 `challenge.flag.sync_paths` 写入这些路径,生成的 `changeflag.sh` 会同步动态 flag。
题目入口验证:`validate.sh` 只验证平台交付契约和动态 flag 写入入口,不证明题目已经可解。需要证明“通过题目入口能拿到动态 flag”时,在 `challenge.verification.solve_probe` 或 `smoke_assert.yaml` 中写业务断言,再跑 `smoke_test.sh`。
Scenario 边界:允许输出 `docker-compose.yml` 做本地编排。平台最终交付仍是单服务目录(`Dockerfile + start.sh + changeflag.sh`)。
## Workflow 演示案例
提示词触发

提案确认

错误处理

自动产物

自动校验

硬约束检查

交付清单

## Build_test 真实样例池
`Build_test/` 存放真实 CTF 和漏洞环境样例,用来覆盖 `examples/` 不适合承担的历史目录、半成品交付、脏输入、Linux-QEMU 缺资产和控制面板类仿真场景。
样例池采用期望匹配规则:历史样例可以声明 `validate.sh` 预期失败,只要实际结果与 `Build_test/cases.yaml` 一致,回归就通过。这样可以保留真实问题样本,而不会把它们误写成可发布交付件。
python3 scripts/validate_build_test.py
python3 scripts/validate_build_test.py --format json
python3 scripts/validate_build_test.py --case cpanel-whm-authbypass-rce
详细样例清单、字段说明和当前限制见 `Build_test/README.md`。每个样例目录都有 `case_note.md`,记录来源、预期路径、支持等级、验证等级和契约期望。
## 文件目录索引
### 根目录(发布与入口)
| 文件/目录 | 作用 |
|---|---|
| `README.md` | 中文默认完整手册(主入口) |
| `README.en.md` | 英文完整手册 |
| `README.ja.md` | 日文完整手册 |
| `VERSION` | 当前发布版本号 |
| `CHANGELOG.md` | 版本变更历史 |
| `LICENSE` | 开源许可证 |
| `Build_test/` | 真实题目构建回归样例 |
| `dist/` | `release_build` 生成的发布资产 |
### `scripts/`(仓库级治理与发布)
| 文件 | 作用 |
|---|---|
| `scripts/doc_guard.py` | 文档一致性门禁主实现 |
| `scripts/doc_guard.sh` | 文档门禁 Shell 入口 |
| `scripts/release_build.py` | release 打包主实现 |
| `scripts/release_build.sh` | release 打包入口 |
| `scripts/publish_guard.py` | 发布前版本/白名单守卫 |
| `scripts/publish_release.sh` | commit + push + tag + release 编排 |
| `scripts/validate_build_test.py` | Build_test 真实样例池回归 |
| `scripts/linux_qemu_manual_check.sh` | Linux-QEMU release/manual 分级验收 |
| `scripts/golden_snapshot.py` | 关键渲染产物哈希快照回归 |
| `scripts/platform_matrix.py` | 本机 Docker/QEMU/SBOM 工具矩阵检查 |
| `scripts/generate_sbom.py` | SBOM 生成主实现 |
| `scripts/generate_sbom.sh` | SBOM 入口 |
| `scripts/sync.py` | 私有仓到发布仓同步逻辑 |
| `scripts/sync.sh` | 同步入口 |
### `src/CloverSec-CTF-Build-Dockerizer/data`(规则与配置数据)
| 文件 | 作用 |
|---|---|
| `schema.md` | `challenge.yaml` 输入契约 |
| `scenario_schema.md` | `scenario.yaml` 输入契约 |
| `bundle_schema.md` / `bundle_recipes.yaml` | Bundle/Recipe 输入契约、custom 格式与固定组合定义 |
| `stacks.yaml` | 栈默认值与模板映射 |
| `profiles.yaml` | profile 默认行为定义 |
| `components.yaml` | BaseUnit 组件与版本变体 |
| `runtime_profiles.yaml` | 运行时档位定义(php/node/java) |
| `patterns.yaml` | 自动探测规则 |
| `validate_rules.yaml` | `validate.sh` 规则配置 |
| `validate_scenario_rules.yaml` | scenario 校验规则配置 |
| `base_image_allowlist.yaml` | 基础镜像白名单 |
| `README.md` | data 目录说明 |
### `src/CloverSec-CTF-Build-Dockerizer/scripts`(渲染/校验核心脚本)
| 文件 | 作用 |
|---|---|
| `derive_config.py` | 自动推断 challenge 配置 |
| `audit_input.py` | 输入风险审计 |
| `workflow.py` | 状态化题目分析、方案确认、交付生成与验证编排 |
| `parse_config_block.py` | 解析方案确认内容 |
| `render.py` | 单题渲染入口 |
| `render_component.py` | BaseUnit 组件渲染入口 |
| `render_bundle.py` / `validate_bundle.py` | Bundle/Recipe 渲染与校验 |
| `import_compose.py` | compose/Vulhub-like 导入草案 |
| `generate_check_stub.py` | RDG/SecOps check-service 骨架生成 |
| `render_scenario.py` | 场景编排渲染入口 |
| `validate.sh` | 单题契约校验入口 |
| `validate_scenario.py` | 场景契约校验入口 |
| `validate_examples.sh` | examples 批量回归 |
| `smoke_test.sh` | 冒烟测试 |
| `scripts/ci_linux_qemu_full_check.sh` | release-full-check 中按资产可用性执行 Linux-QEMU full 检查 |
| `validate_context.py` | challenge 上下文解析辅助 |
| `autofix.py` | 常见问题自动修复辅助 |
| `detect_stack.py` | 栈识别辅助 |
| `result_utils.py` | 结构化结果输出辅助 |
| `utils.py` | 公共工具函数 |
| `requirements.txt` | Python 脚本依赖 |
| `cleanup_test_containers.sh` | 测试容器清理 |
| `test_runtime_profiles.sh` | runtime profiles 回归 |
| `README.md` | scripts 目录说明 |
### `src/CloverSec-CTF-Build-Dockerizer/templates`(模板库)
| 路径 | 作用 |
|---|---|
| `templates/node|php|python|java|tomcat|lamp|pwn|ai/` | Jeopardy 栈模板 |
| `templates/rdg/` | RDG 专用模板 |
| `templates/secops/` | SecOps 专用模板 |
| `templates/baseunit/` | BaseUnit 通用模板 |
| `templates/linux-qemu/` | Linux kernel CVE/LPE 的 QEMU guest 模板 |
| `templates/snippets/` | defense/check/changeflag 等片段 |
| `templates/README.md` | 模板目录说明 |
### `src/CloverSec-CTF-Build-Dockerizer/examples`(示例与回归输入)
| 路径 | 作用 |
|---|---|
| `examples/*-basic` | 单题最小示例(node/php/python/...) |
| `examples/node-awdp-basic` | AWDP 单题补丁契约示例 |
| `examples/secops-*-basic` | SecOps 示例 |
| `examples/baseunit-*` | BaseUnit 示例 |
| `examples/bundle-*` | Bundle/Recipe 输入示例 |
| `examples/linux-qemu-basic` | Linux-QEMU 占位 VM 资产示例 |
| `examples/scenario-awd-basic` | AWD 场景示例 |
| `examples/scenario-awdp-basic` | AWDP 场景示例 |
| `examples/scenario-vulhub-like-basic` | Vulhub-like 迁移示例 |
| `examples/scenario-compose-import-basic` | compose 导入草案示例 |
| `examples/README.md` | 示例目录说明 |
### `src/CloverSec-CTF-Build-Dockerizer/docs`(设计文档)
| 文件 | 作用 |
|---|---|
| `architecture_overview.md` | 架构总览 |
| `platform_contract.md` | 平台硬契约说明 |
| `orchestrated_workflow.md` | 方案确认、确认门槛和 5 项确认协议 |
| `stack_cookbook.md` | 各栈构建建议 |
| `validation_guide.md` | 校验规则、check-service 门禁与发布前检查 |
| `directory_guide.md` | 目录设计说明 |
| `troubleshooting.md` | 常见故障排查 |
| `beginner_guide.md` | 新手入门流程 |
## FAQ 与常见排障
### Q1:为什么必须有 `/start.sh`、`/changeflag.sh`、`/bin/bash`?
这是凌虚竞赛平台&星图大靶场引擎的运行契约(实际上适配市面上任意一家的竞赛平台与靶场Docker启动引擎)。缺任一项都可能导致题目无法被平台正常启动或重置。
### Q2:为什么我设置了 `include_flag_artifact=false` 还报错?
这个开关只允许 `flag` 缺失,不允许 `changeflag.sh` 缺失。请检查渲染目录里 `changeflag.sh` 是否存在且可执行。
### Q3:AWD 和 SecOps 看起来很像,怎么选?
你要做攻防对抗,选“现有栈 + `profile=awd`”。你要做加固运维,选 `stack=secops + profile=secops`。
### Q4:AWDP 为什么不是直接 SSH 修题?
AWDP 的关键是“补丁提交与审计”,不是现场运维。选手通过 `patch/src + patch.sh + tar.gz` 提交修复,平台再自动应用。
### Q5:Vulhub-like 场景为什么不能直接拿 compose 当最终交付?
因为目标平台要求单服务交付目录。`scenario` 的 compose 只用于你本地联调与验证拓扑。
### Q6:`npx -y skills add . --list` 和 Release 资产有关系吗?
没有直接依赖。前者验证技能可发现,后者是版本归档分发。
## 维护、贡献与发布
日常维护快速检查:
bash scripts/check_fast.sh
常规功能改动再补 examples 回归:
bash src/CloverSec-CTF-Build-Dockerizer/scripts/validate_examples.sh
涉及 Docker 模板、端口映射、check-service 或启动脚本时,只跑受影响示例:
bash src/CloverSec-CTF-Build-Dockerizer/scripts/smoke_test.sh --case node-basic
正式发布前检查清单:
bash scripts/check_fast.sh
bash src/CloverSec-CTF-Build-Dockerizer/scripts/validate_examples.sh
bash src/CloverSec-CTF-Build-Dockerizer/scripts/smoke_test.sh
npx -y skills add . --list
bash scripts/release_build.sh --with-smoke
正式发布:
bash scripts/publish_release.sh --version v2.2.0-r7
如果遇到远端 tag/release 冲突或认证失败,应该停止发布流程并先处理阻塞,不要临时修改版本号绕过。
## License
本项目使用 [MIT License](LICENSE),版权所属@D1a0y1bb.
VERSION: v2.2.0-r7
标签:Cutter, Docker, NIDS, 安全竞赛, 安全防御评估, 容器化, 自动化构建, 请求拦截, 逆向工具