CTF-Agent 是一个基于 ReAct 思路、LangGraph 状态机和 LangChain LLM 接口的自动化 CTF 解题 Agent 示例项目。它会读取题目描述、URL 或附件路径,让 LLM 在多轮循环中选择工具、观察结果、继续推理,最终输出 Flag 候选或最终答案。
仅用于你拥有授权的 CTF 比赛、靶场、教学环境或本地实验环境。请勿用于未授权目标。
- ReAct 循环:思考 → 行动 → 观察 → 再思考。
- LangGraph 状态机:
think节点负责 LLM 决策,act节点负责工具调用。 - 多 LLM 后端:OpenAI API、DeepSeek OpenAI-compatible API、Ollama 本地模型。
- Docker 隔离执行:默认所有命令都在名为
ctf-target的容器中运行。 - 工具系统:统一
CtfBaseTool接口,内置命令执行、Python 执行、nmap、dirsearch、sqlmap、binwalk、strings、图片隐写初查、Flag 提交。 - 存档恢复:每轮状态写入
checkpoints/,支持--resume继续运行。 - 日志调试:控制台和
logs/同时记录思考、动作、观察和错误。
.
├── agent/ # Agent 核心循环和提示词
├── ctf_tool/ # 所有工具类
├── utils/ # 配置、LLM、Docker/SSH、日志、checkpoint
├── cli/ # 命令行入口
├── logs/ # 日志目录
├── checkpoints/ # Agent 存档目录
├── attachments/ # 题目附件目录
├── config.json # 默认 Ollama 本地配置,无密钥
├── config_template.json # 配置模板
├── config_openai_example.json
├── config_ollama_example.json
├── config_deepseek_example.json
├── requirements.txt
├── Dockerfile
└── README.md
建议 Python 3.10+,示例使用虚拟环境:
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtWindows PowerShell:
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt构建镜像:
docker build -t ctf-agent-env .启动容器,容器名必须与配置中的 ctf-target 一致:
docker run -d --name ctf-target \
--cap-add=NET_ADMIN \
-v "$PWD:/work" \
ctf-agent-env如果你需要让容器访问本地靶场服务,可按实际情况改为 --network host(Linux 可用)或使用 Docker Compose 自建网络。
项目自带 config.json,默认使用本地 Ollama:
{
"llm": {
"provider": "ollama",
"model": "llama3.1",
"api_base": "http://localhost:11434"
}
}启动 Ollama 并拉取模型:
ollama pull llama3.1
ollama serveOpenAI 配置示例见 config_openai_example.json,复制为 config.json 并填入自己的密钥:
{
"llm": {
"provider": "openai",
"model": "gpt-4.1-mini",
"api_key": "YOUR_OPENAI_API_KEY",
"api_base": "https://api.openai.com/v1"
}
}DeepSeek 配置示例见 config_deepseek_example.json:
{
"llm": {
"provider": "deepseek",
"model": "deepseek-chat",
"api_key": "YOUR_DEEPSEEK_API_KEY",
"api_base": "https://api.deepseek.com"
}
}不要把真实 API Key 提交到 Git。
Web 题目:
python cli/main.py --url http://example.com --question "这是一个授权 CTF Web 题,请尝试找到 flag。"附件题目:
cp /path/to/challenge.png attachments/
python cli/main.py --file attachments/challenge.png --question "图片隐写题,找出 flag。"从题目文件读取:
python cli/main.py --question-file question.txt --url http://challenge.local启用 DEBUG 日志:
python cli/main.py --url http://example.com --debug限制最大步数:
python cli/main.py --url http://example.com --max-steps 10从 checkpoint 恢复:
python cli/main.py --resume checkpoints/run_20250101_120000.json所有工具都继承 ctf_tool.base.CtfBaseTool,具有统一字段:
name:工具名,LLM 调用时使用。description:工具自然语言描述。args_schema:Pydantic 参数 schema。run(**kwargs):执行逻辑,返回ToolResult。
内置工具:
| 工具名 | 说明 |
|---|---|
run_command |
在 Docker 容器内执行 shell 命令 |
run_python |
在 Docker 容器内执行 Python 代码 |
nmap_scan |
nmap 端口和服务扫描 |
dirsearch_scan |
Web 目录爆破 |
sqlmap_check |
SQL 注入检测 |
file_inspect |
文件类型、大小、哈希识别 |
binwalk_analyze |
binwalk 分析和提取 |
strings_search |
strings 查找可见字符串 |
image_stego_check |
exiftool、zsteg、steghide 图片隐写初查 |
submit_flag |
模拟或 CTFd API 提交 Flag |
添加新工具时,在 ctf_tool/ 中新增类,并在 ctf_tool/registry.py 注册即可。
默认是模拟提交:
"ctfd": {
"enabled": false,
"api_url": "",
"api_token": "",
"validate_ssl": true
}如需接入 CTFd:
"ctfd": {
"enabled": true,
"api_url": "https://ctfd.example.com",
"api_token": "YOUR_CTFD_TOKEN",
"validate_ssl": true
}LLM 调用 submit_flag 时需要提供 challenge_id。
确认容器存在且正在运行:
docker ps
docker start ctf-target默认启动命令会把当前项目目录挂载到容器 /work。请把附件放到 attachments/,并使用相对路径:
python cli/main.py --file attachments/a.zip --question "分析附件"不同系统源可能有差异。可以进入容器手工安装:
docker exec -it ctf-target bash
pip install dirsearch
gem install zsteg换一个指令遵循能力更强的模型,或在 agent/prompts.py 中收紧提示词。当前代码会尝试从 Markdown 代码块中容错提取 JSON。
本项目默认把命令限制在 ctf-target 容器中执行,但工具本身仍具备网络探测和漏洞检测能力。请务必只在授权范围内使用,并根据比赛规则控制扫描频率和强度。