CloverSec-CTF-Pack
Health Gecti
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Community trust — 31 GitHub stars
Code Gecti
- Code scan — Scanned 3 files during light audit, no dangerous patterns found
Permissions Gecti
- Permissions — No dangerous permissions requested
Bu listing icin henuz AI raporu yok.
面向 Agent 的四叶草安全 CTF 题目交付技能 Skill @CloverSecLabs
简体中文 · English
安装 · 使用 · 交付目录 · 手册 · 本地验证 · Flag 约定 · 仓库结构
面向 Agent 的四叶草安全 CTF 题目交付 Skill @CloverSecLabs
把题目源码、一段题目设计或者一个旧题目录交给 Claude Code / Codex,整理成能交付的题目包:容器题给出可构建的镜像目录并本地验证,附件题给出整理好的选手附件,RDG 防守题给出带判题脚本的加固环境,三类都带手册。
- 交付目录按
题目类型-题目名称命名,类型取 Web、Pwn、Crypto、AI 等 20 种。 - 源码、
Dockerfile、start.sh按内置范例编写,带中文注释,讲清漏洞点和不明显的配置。 - 容器题用
verify.sh按平台的方式跑一遍:amd64 构建、/start.sh启动、写入随机测试 Flag、探测端口,有solve/solve.py就运行它,必须拿到这个 Flag。 - 顺手检查手册文件名和章节、
docker run有没有带/start.sh、交付目录有没有多余文件。 - 手册写在
README/,solve/、附件/、镜像/都放在和src/同级的目录。 - 需要长期存档的题,按参考文档锁定镜像 digest、apt 源和依赖版本,上游更新后照样能 build。
- 多服务、Bundle、Scenario、RDG/AWD、Linux-QEMU 有单独的参考文档,常规题不加载。
安装
npx skills add D1a0y1bb/CloverSec-CTF-Pack -g -a claude-code -a codex
-g 装到用户目录 ~/.agents/skills/,Claude Code 通过软链接读取;去掉 -g 装进当前项目。-a 指定装给哪些 Agent,可以写多个。
本机需要 Docker 和 curl。Apple Silicon 上按 amd64 构建会走模拟,比原生慢。
使用
在对话里点名 Skill,再给材料。Claude Code 用 /cloversec-ctf-pack,Codex 用 $cloversec-ctf-pack:
/cloversec-ctf-pack 把 ./ssti-notes 做成平台题目。
Flask 写的 SSTI,flag 放 /flag,端口 5000。
材料可以是题目设计、只有源码的目录,或者带旧 Dockerfile 的历史题目。端口、启动命令、运行时版本、Flag 路径这类会卡住构建的信息如果缺了,它会用结构化提问(Codex 的 request_user_input、Claude Code 的 AskUserQuestion)一次问完,给出直白选项和推荐项,不会自己猜着往下做。
交付目录
容器题:
Web-残影/
├── README/
│ ├── Web-残影.md # 手册,文件名同交付目录
│ └── assets/ # 手册里的截图
├── src/
│ ├── index.php
│ └── upload.php
├── Dockerfile
├── start.sh # 平台入口,前台运行真实服务
├── challenge.yaml # 端口、Flag 路径等平台字段
├── flag # 占位 Flag,平台启动后覆盖
├── solve/
│ └── solve.py # 解题脚本,本地验证用,不进镜像
└── 附件/ # 选手附件,需要时才有
纯附件题没有镜像相关文件,只有 README/、src/、附件/、solve/。镜像/ 在需要导出镜像 tar 时才建。
交付目录是一份白名单:容器题只允许 src/、Dockerfile、start.sh、challenge.yaml、flag、README/、solve/,按需加 附件/、镜像/;RDG 题再加 check/、changeflag.sh、ttyd 这些题目真正运行需要的文件。verify.sh、verify-report.json、*.verify.json、.DS_Store、__pycache__/ 一律不许留下,verify.sh 会扫出来。验证报告写到系统临时目录:
bash ~/.agents/skills/cloversec-ctf-pack/scripts/verify.sh ./ssti-notes --report "$(mktemp -d)/verify.json"
手册
手册是交付物里最重要的一份,写在 README/<题目类型-题目名称>.md,文件名必须和交付目录同名,截图放 README/assets/。章节顺序固定:题目名称、题目描述、题目难度、考察信息、旗帜信息、题目情况、部署方式、题目设计、解题步骤。
四节是重点,写法见 references/manual.md,那里有逐节范例:
- 1.2 题目描述写氛围和悬念,可以风趣,但不能泄漏技术栈、漏洞类型、路径和函数名。选手在平台上只看得到这一段。
- 1.5 旗帜信息逐项写全:Flag 路径、权限和属主、谁在什么时候读它、平台覆盖命令、程序读的不是
flag.path时的接法。 - 1.7 部署方式是硬性清单:目录说明、构建命令、镜像 tar 导入、带
/start.sh的启动命令、访问地址、平台写 Flag 命令、清理命令、改端口后的同步位置。 - 1.9 解题步骤给可直接复制的命令和 payload、预期输出、截图位置,详细到别人照着能复现。
不写"常见失败现象"一节。
RDG 防守题
RDG 的判据不是"能不能拿到 Flag",而是"漏洞还在不在",交付物和验证方式都和普通题不同:
- 多一个
check/目录(check.sh+check.py+requirements.txt),平台点"验证"时跑的就是它。调用方式./check.sh <IP> <PORT>,返回 0 表示已修复、非 0 表示漏洞还在,输出里有ok: True/False或RESULT: PASS/FAIL。 - 多一个 ttyd 服务,选手通过浏览器进容器改代码。
- 有些 RDG 题没有 Flag 合同:敏感目标就是题目自己配置里的固定内容,check 直接验证那个目标还能不能被读到。
verify.sh自动识别带check/的题目,跑 RDG 判定:初始环境必须报"有漏洞"才算题目状态正确,报"已修复"直接判failed——那样选手没得打。
本地验证
bash ~/.agents/skills/cloversec-ctf-pack/scripts/verify.sh ./ssti-notes
脚本按 linux/amd64 构建镜像,用 /start.sh 起容器,等端口真正开始监听,往 flag.path 写一个随机测试 Flag,再探测端口。目录里有 solve/solve.py 时自动运行它(从环境变量 HOST、PORT 读地址),输出里出现这个测试 Flag 才算通过,能发现启动时把 Flag 缓存进变量的问题。其他语言的解题脚本用 --solve '<命令>' 指定。跑完删除容器和镜像,加 --keep 保留。
它还会顺手检查三件和运行无关、但最常被漏掉的事:手册文件名和章节是否齐全、docker run 命令有没有带 /start.sh、交付目录有没有多余文件。
== 构建镜像 (linux/amd64)
完成,用时 16 秒
== 启动容器
等待端口 5000 开始监听(最多 60 秒)
容器运行中
== 写入测试 Flag 到 /flag
回读一致(444 root:root)
== 探测端口 5000(本机 127.0.0.1:61197)
HTTP 200
== 运行解题命令: python3 solve/solve.py
拿到测试 Flag
== 结果: passed
RDG 题的输出换成 check 判定:
== 阶段: handbook: passed delivery: passed build: passed startup: passed port: passed flag_write: skipped check_initial: ok: False
== 结果: passed
| 结果 | 退出码 | 含义 |
|---|---|---|
passed |
0 | 全部检查通过 |
partial |
3 | 能跑,但有检查项没做(比如没声明端口、手册缺一节、目录有多余文件),输出里逐条列出 |
failed |
1 | 构建失败、容器退出、端口只监听 127.0.0.1、Flag 写不进去、解题拿不到 Flag、手册文件名不对,或 RDG 初始环境就是修好的 |
端口和 Flag 路径默认从 challenge.yaml 读取,也可以用 --port、--flag-path 指定。完整参数见 verify.sh --help。
难度等价
迁移旧题时,缺材料、本机跑不动,都不是把题目降级的理由。challenge.yaml 里的 provenance 记录这道题的来源和恢复状态:
provenance:
status: original_adapter # original_adapter / independent_completion / incomplete / attachment_only
original_material: [源码, install.sql]
missing: [原数据库快照]
preserved: [漏洞类型=前台 SQL 注入, 链路=3 步]
simplified: []
env_limited: Apple ARM64 模拟下无法执行原始 rt_sigreturn
verify: passed
incomplete 的题不许写成"已验证通过";independent_completion 必须在手册里写明这是独立补全、不是原题还原;simplified 有值时说明这道题已经偏离原题难度,要单独告诉出题人。verify 通过只说明容器生命周期正常,不等于题目难度等价。
Flag 约定
平台起容器后,直接把本场的动态 Flag 写进 challenge.yaml 中 flag.path 指向的文件。这个路径必须是程序实际读取的那个:
| 题型 | 常用路径 |
|---|---|
| Web / AI / Misc | /flag |
| Pwn | /home/ctf/flag(root:ctf,440) |
| PHP 嵌入 Flag | /var/www/html/flag.php |
| 数据库 | 在手册里写清更新 Flag 的 SQL |
程序要在每次请求时读取 Flag 文件。启动时读一次存进变量(Python 模块级变量、Java static 块),平台换了 Flag 也不会生效。
仓库结构
src/CloverSec-CTF-Pack/
├── SKILL.md # 入口:提问规则、交付目录白名单、流程、写法范例、注释要求、RDG、难度等价
├── agents/openai.yaml # Codex 里显示的名称、默认提示词和提问约定
├── references/
│ ├── manual.md # 手册逐节写法和范例
│ ├── platform.md # 平台启动方式、环境变量传 Flag、镜像 tar 格式、challenge.yaml 与 provenance
│ ├── dockerfiles.md # 各语言 Dockerfile / start.sh 范例、Pwn、镜像版本固定
│ └── special.md # 多服务、Bundle、Scenario、RDG/AWD、Linux-QEMU
└── scripts/
└── verify.sh # 本地构建与运行验证,含手册、目录白名单和 RDG 判定
版本记录见 CHANGELOG.md。
License
Yorumlar (0)
Yorum birakmak icin giris yap.
Yorum birakSonuc bulunamadi