gobelinor/CTF-destroyer
GitHub: gobelinor/CTF-destroyer
基于LangGraph的CTF智能体编排工具,通过AI Worker实现挑战的自动化解析与多轮尝试求解。
Stars: 0 | Forks: 0
# CTF Destroyer
针对 CTF 挑战的智能体编排 PoC。
该项目使用 `LangGraph` 作为编排器,并在子进程中启动专门的 worker,目前重点关注 `codex`。目标很简单:接受一个挑战,准备一个隔离的 workspace,选择合适的技能,让 worker 工作,追踪其执行情况,然后循环直到获取 flag 或达到尝试限制。
## 项目状态
该工具仍是一个 PoC,但已具备以下功能:
- 异构挑战输入的标准化
- 每个挑战的专用 workspace
- artifact 的本地复制和 HTTP(S) 下载
- 按类别路由到 CTF 技能
- 执行 `mock`、`codex`、`claude` worker
- 编排器循环 `route -> specialist -> evaluate`
- 捕获 worker 的命令和输出
- `codex --json` 事件的实时流式传输
这还不是一个完整的多挑战编排器。
## 运行机制
一次运行的周期:
1. CLI 加载 JSON 格式的挑战或直接参数
2. 挑战被标准化
3. 在 `.challenges/-/` 下创建本地 workspace
4. artifact 被复制到 `artifacts/`
- 本地路径:复制到 workspace
- `http(s)` URL:自动下载到 `artifacts/`
5. 路由器选择一个专门的技能
6. 选定的 worker 在挑战的 workspace 中启动
7. 编排器评估结果并决定停止或重新启动
当前的 LangGraph 图谱故意保持最小化:
```
START
-> route
-> run_specialist
-> evaluate
-> END | run_specialist
```
## 结构
```
ctf_destroyer/
cli.py # point d'entrée
graph.py # graphe LangGraph
skills.py # chargement + routage des skills
workers.py # workers mock/codex/claude
workspace.py # staging du workspace challenge
skills/
... # skills CTF locaux
examples/
evaluative.json
tests/
...
```
## 前置条件
- Python `3.11+`
- 安装并认证 `codex` 以使用 `codex` 后端
- 安装并认证 `claude` 以使用 `claude` 后端
项目目前运行在 Python `3.14`,但 `langchain-core` 会发出警告。为了更干净的设置,建议使用 Python `3.12` 或 `3.13`。
## 安装
```
python3 -m venv .venv
. .venv/bin/activate
pip install -e .
```
## 快速使用
无 LLM 的本地运行:
```
ctf-orchestrator \
--challenge-file examples/evaluative.json \
--backend-sequence mock \
--max-attempts 2
```
使用 `codex` 运行:
```
CODEX_TIMEOUT_SECONDS=120 \
ctf-orchestrator \
--challenge-file examples/evaluative.json \
--backend-sequence codex \
--max-attempts 1
```
带 `codex -> claude` 回退的运行:
```
ctf-orchestrator \
--challenge-file examples/evaluative.json \
--backend-sequence codex,claude \
--max-attempts 4
```
## 输入格式
CLI 可以标准化以下字段:
- `title`, `name`, `challenge_name`
- `description`, `scenario`, `challenge_scenario`, `challenge_text`
- `category`, `category_hint`
- `files`, `artifacts`, `artifact_paths`
- `target_host` 或 `ip` + `port`
示例:
```
{
"title": "Evaluative",
"category": "misc",
"description": "A rogue bot is malfunctioning, generating cryptic sequences that control secure data vaults.",
"target_host": "154.57.164.64:31748",
"difficulty": "Very Easy",
"points": 10,
"rating": 3.3,
"files": []
}
```
未识别的字段将保存在 `challenge_metadata` 中。
## 挑战 Workspace
每个挑战在一个隔离的文件夹中执行:
```
.challenges/-/
```
该文件夹包含:
- `challenge.json`:标准化清单
- `artifacts/`:所提供文件的副本
- `.runs/`:worker 的输出和追踪
示例:
```
.challenges/evaluative-84c696b5/
challenge.json
artifacts/
.runs/
```
## Workers
### `mock`
不消耗配额的测试后端。用于验证图谱和状态转换。
### `codex`
`codex` worker 使用带有以下参数的 `codex exec`:
- `--json` 用于详细事件
- `--output-schema` 用于强制输出最终 JSON
- `-o` 用于将最后一条消息写入文件
- `-C` 用于在挑战的 workspace 中执行
每次尝试写入:
- prompt 至 `.runs/codex/attempt-XX-prompt.txt`
- JSON schema 至 `.runs/codex/attempt-XX-schema.json`
- 事件流至 `.runs/codex/attempt-XX-events.jsonl`
如果设置了 `CODEX_STREAM_EVENTS=1`,`command_execution` 事件将实时显示:
```
[codex] start: /bin/zsh -lc ls
[codex] done (0): /bin/zsh -lc ls
```
### `claude`
`claude` worker 使用带有结构化 JSON schema 的 `claude -p`。它已接入,但最近的主要工作都集中在 `codex` 上。
## 有用的环境变量
- `CODEX_MODEL`
- `CODEX_SANDBOX`
- `CODEX_APPROVAL_POLICY`
- `CODEX_EXTRA_ARGS`
- `CODEX_TIMEOUT_SECONDS`
- `CODEX_STREAM_EVENTS`
- `CLAUDE_MODEL`
- `CLAUDE_PERMISSION_MODE`
- `CLAUDE_EXTRA_ARGS`
- `CLAUDE_TIMEOUT_SECONDS`
worker 的默认超时时间现在更长(`1800s`),以避免过快中断困难的运行。后续尝试也会复用在 workspace 的 `.runs/working-memory.json` 中持久化存储的结构化记忆,其中包括:
- 已确认的观察结果
- 应避免的低价值线索
- 重要的内联命令和脚本
- 重新开始前需重读的交接文件
当挑战在失败后重新启动时,编排器也会重新加载 `.runs/attempt-history.json`,对之前的尝试进行批判性审查,然后为新运行提供:
- 应保留的已获成果
- 可疑或已被过度挖掘的路径
- 简短的恢复指令,以避免再次陷入同样的死胡同
## 测试
```
.venv/bin/python -m unittest discover -s tests -v
```
## 当前限制
- 尚无多挑战并行处理
- 尚无整个 CTF 的全局规划器
- 除本地 workspace 外尚无持久化存储
- 尚无专用于 stderr 流式传输之上的实时 UI
- 尚未自动利用技能的 `references/`
## Discord 集成
CLI 现在可以在专用频道中为每个挑战创建或复用 Discord 帖子,然后发布:
- 挑战的初始消息
- 路由结果(类别 + 技能)
- 每次 worker 尝试
- 最终结果
本地映射持久化于:
- `.challenges/-/.discord-thread.json`
- `challenge.json` 中的 `discord_thread` 字段
以托管线程的文本频道为例:
```
export DISCORD_BOT_TOKEN=...
export DISCORD_PARENT_CHANNEL_ID=123456789012345678
ctf-orchestrator \
--challenge-file examples/evaluative.json \
--backend-sequence mock
```
可用的环境变量和标志:
- `DISCORD_BOT_TOKEN` / `--discord-bot-token`
- `DISCORD_PARENT_CHANNEL_ID` / `--discord-parent-channel-id`
- 根目录下的 `.env` 如果存在则自动加载
- `--env-file chemin/.env` 允许加载另一个文件
`.env` 示例:
```
DISCORD_BOT_TOKEN=ton_bot_token
DISCORD_PARENT_CHANNEL_ID=1480705892918755544
```
## 短期路线图
- 多个挑战的并行编排
- 更好的实时可观测性
- worker 对漏洞利用证明更严格的验证
- 更丰富的网络目标和 artifact 支持
- 专门 worker 之间的回退策略
标签:Agent, AI安全, Chat Copilot, Claude, Codex, CVE检测, DLL 劫持, LangGraph, PMD, PoC, Python, TGT, 云资产清单, 人工智能, 代码执行, 大语言模型, 子进程管理, 实时流处理, 工作流自动化, 攻防演练, 无后门, 暴力破解, 用户模式Hook绕过, 编排框架, 网络安全, 网络调试, 自动化, 逆向工具, 逆向工程, 隐私保护