关于 solve-challenge
solve-challenge 是面向 Agent 的 CTF 解题技能,指导从平台访问、题目分类到专项分析、策略切换和生成题解。它结合基于证据的难度判断,并覆盖 CTFd API 与浏览器操作流程。
主要功能
- 01检测并导航 CTF 平台
- 02勘察题目文件与远程服务
- 03路由至分类专项技能
- 04提供跨类别切换指引
- 05验证 Flag 并生成题解
适用场景
- 01初步分析新分配的 CTF 题目
- 02依据文件或服务行为选择技巧
- 03浏览 CTF 平台并提交已验证的 Flag
MCP 相关
说明了使用 Playwright MCP 操作浏览器版 CTF 平台,包括查看题目、下载文件和提交 Flag;若有可用原生 API,则优先使用 API。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ljagiello/ ctf-skills --skill solve-challenge安装后在 Claude Code 中输入/solve-challenge确认已加载。
附带文件difficulty-routing.md
详细介绍
CTF 挑战求解器
你是一名经验丰富的 CTF 选手。你的目标是解决挑战并找到 flag。
环境设置
根据工作流选择以下两种设置策略:
预安装(推荐在比赛前完成)
使用中央安装入口:
bash scripts/install_ctf_tools.sh all
只想安装一个工具组时,使用范围更小的模式:
bash scripts/install_ctf_tools.sh python
bash scripts/install_ctf_tools.sh apt
bash scripts/install_ctf_tools.sh brew
bash scripts/install_ctf_tools.sh gems
bash scripts/install_ctf_tools.sh go
bash scripts/install_ctf_tools.sh manual
完整的软件包列表现在位于 scripts/install_ctf_tools.sh。
按需安装(挑战过程中)
每个类别技能的 SKILL.md 都有一个 Prerequisites 部分,其中仅列出该类别所需的工具。边做边安装。
工作流
在选择或升级模型前,请阅读 difficulty-routing.md。在整个工作流中,按照其中基于证据的评分、 止损规则和层级门槛执行。
步骤 0:检测 CTFd 平台
如果已知 CTF 平台 URL,请检查其是否运行 CTFd,并切换到由 API 驱动的导航方式:
# Detect CTFd (look for /api/v1/ and /themes/core/)
curl -s "$CTF_URL/api/v1/" | head -5
curl -s "$CTF_URL" | grep -oE '/themes/core/'
如果检测到 CTFd,请向用户索要 API 令牌(在 CTFd Settings > Access Tokens 中生成)。默认不会提供令牌——用户必须先在 CTFd 网页 UI 中创建一个。用户提供令牌后,设置环境变量并通过 API 操作:
export CTF_URL="https://ctf.example.com"
export CTF_TOKEN="ctfd_..." # Ask user for this
调用 /ctf-misc,并加载其 ctfd-navigation.md,查看完整的 API 参考和 Python 客户端类。
通过 Playwright MCP 与 CTF 平台交互
当平台不是 CTFd、没有可用的 API,或需要登录才能访问挑战,且页面由 JS 渲染时,请使用真实浏览器和 Playwright MCP(https://github.com/microsoft/playwright-mcp)操作平台。这样 Agent 可以读取挑战文本、下载附件、保持登录会话,并直接通过网站提交 flag。
browser_navigate "https://ctf.example.com/challenges"
browser_snapshot # list challenges, points, categories (rendered)
browser_click <challenge ref> # open a challenge card
browser_snapshot # read description, hints, attachment links
browser_click <attachment ref> # download the challenge file (saved by the browser)
# ... solve the challenge ...
browser_type <flag input ref> "flag{...}"
browser_click <submit ref>
browser_find text="Correct" # cheaper than a full snapshot to check the verdict
当你只需确认一个值时,browser_find(在无障碍树中按文本或正则表达式搜索)是合适的工具;只有在需要元素引用来点击或输入时,才使用完整的 browser_snapshot。
登录会话(cookies/localStorage)会在多次工具调用之间保留,因此只需验证一次身份,之后的所有导航都会获得授权。有关通用浏览器自动化工具,请参阅 ../ctf-web/tools-mcp.md。
如果存在原生 API,请优先使用它(上述 CTFd 令牌流程更快、更可靠);对于没有 API 的平台,或挑战列表仅在客户端渲染时,再使用 Playwright MCP。
步骤 1:侦察
- 检查文件——列出挑战目录,对所有文件运行
file * - 初步分析二进制文件——对二进制文件使用
strings、xxd | head、binwalk、checksec - 获取链接内容——如果挑战中提到 URL,请先获取内容以了解背景
- 连接服务——尝试连接远程服务(
nc),了解其预期行为 - 阅读提示——挑战描述、文件名和注释通常都包含线索
第 2 步:分类
确定主要类别,然后调用相应的技能。
按文件类型:
.pcap、.pcapng、.evtx、.raw、.dd、.E01-> 取证.elf、.exe、.so、.dll、无扩展名的二进制文件 -> 逆向或 pwn(检查是否提供远程服务——如果提供,可能是 pwn).py、.sage、包含数字的.txt-> 密码学.apk、.wasm、.pyc-> 逆向.safetensors、.pt、.pth、.bin、.onnx-> AI/ML- Web URL 或包含 HTML/JS/PHP/模板的源代码 -> Web
- 没有明显内容的图像、音频、PDF -> 取证(隐写术)
按挑战描述中的关键词:
- “buffer overflow”“ROP”“shellcode”“libc”“heap” -> pwn
- “RSA”“AES”“cipher”“encrypt”“prime”“modulus”“lattice”“LWE”“GCM” -> 密码学
- “XSS”“SQL”“injection”“cookie”“JWT”“SSRF” -> Web
- “disk image”“memory dump”“packet capture”“registry”“power trace”“side-channel”“spectrogram”“audio tracks”“MKV” -> 取证
- “find”“locate”“identify”“who”“where” -> OSINT
- “obfuscated”“packed”“C2”“malware”“beacon” -> 恶意软件
- “prompt injection”“LoRA”“adversarial”“model weights”“embedding” -> AI/ML
- “jail”“sandbox”“escape”“encoding”“signal”“game”“Nim”“commitment”“Gray code” -> Misc
按服务行为:
- 提供交互式提示符的端口,输入过长时崩溃 -> pwn
- HTTP 服务 -> Web
- 使用 netcat 提供数学/密码学谜题 -> 密码学
- 使用 netcat 提供受限 shell 或 eval -> Misc(jail)
第 3 步:调用类别技能
确定类别后,调用相应技能以获取专门的技巧:
| 类别 | 调用 | 适用场景 |
|---|---|---|
| Web | /ctf-web | XSS、SQLi、SSTI、SSRF、JWT、文件上传、原型污染 |
| Pwn | /ctf-pwn | 缓冲区溢出、格式字符串、堆、ROP、沙箱逃逸 |
| Crypto | /ctf-crypto | RSA、AES、ECC、PRNG、ZKP、古典密码 |
| Reverse | /ctf-reverse | 二进制分析、游戏客户端、虚拟机、混淆代码 |
| Forensics | /ctf-forensics | 磁盘镜像、内存转储、事件日志、隐写术、网络捕获 |
| OSINT | /ctf-osint | 社交媒体、地理定位、DNS、公开记录 |
| Malware | /ctf-malware | 混淆脚本、C2 流量、PE/.NET 分析 |
| AI/ML | /ctf-ai-ml | 模型权重(.safetensors、.pt、.pth、.bin、.onnx)、提示词注入、LoRA 适配器、对抗样本 |
| Misc | /ctf-misc | Jail、编码、RF/SDR、深奥语言、约束求解 |
你也可以调用 /ctf-<category>,加载包含详细技巧的完整技能说明。
步骤 4:陷入困境时转换思路
如果你的首个方案行不通:
- 重新审视假设 —— 这真的是你认为的类别吗?“web”挑战可能需要用 crypto 伪造 JWT。“forensics” PCAP 中可能包含可用于重放的 pwn 漏洞利用代码。
- 尝试其他类别的技能 —— 许多挑战涉及多个类别。调用第二项技能来处理跨类别技术。
- 寻找遗漏之处 —— 隐藏文件、备用端口、响应头、源代码中的注释、图像元数据。
- 简化方案 —— 如果漏洞利用过于复杂,看看是否有更简单的途径(默认凭据、已知 CVE、逻辑漏洞)。
- 检查边界情况 —— 差一错误、竞态条件、整数溢出、编码不匹配。
常见的多类别模式:
- Forensics + Crypto:PCAP/磁盘映像中的加密数据,需要用 crypto 解密
- Web + Reverse:Web 挑战中的 WASM 或混淆 JS
- Web + Crypto:JWT 伪造、自定义 MAC/签名方案
- Reverse + Pwn:先逆向二进制文件,再利用漏洞
- Forensics + OSINT:从转储文件中恢复数据,再通过公开来源追踪
- Misc + Crypto:在限制条件下构建加密原语,以逃离 jail
- OSINT + Stego:包含 Unicode 同形异义字符隐写术的社交媒体帖子(西里尔字母形似字符可编码比特)
- Web + Forensics:绕过付费墙(curl 可显示被 CSS 覆盖层隐藏的内容)
- Misc + Crypto + Game Theory:多阶段交互式挑战,依次进行 AES 解密 → HMAC 承诺 → 组合博弈求解(GF(256) Nim)
- Crypto + Geometry + Lattice:多层挑战,依次进行空间重建 → 子空间恢复 → LWE 求解 → AES-GCM 解密
- Forensics + Signal Processing:电源轨迹/侧信道分析,需要对测量数据进行统计分析
- Forensics + Network + Encoding:PCAP 中基于时序的编码(数据包间隔编码二进制数据)
步骤 5:生成解题报告
解出挑战后,调用 /ctf-writeup 生成标准化的提交式解题报告——简洁、可复现,可供竞赛组织者或队友验证。
Flag 格式
Flag 格式因 CTF 而异。常见格式:
flag{...}、FLAG{...}、CTF{...}、TEAM{...}- 自定义前缀:查看挑战说明或 CTF 规则了解格式(例如
ENO{...}、HTB{...}、picoCTF{...}) - 有时只是没有任何包装的纯文本字符串
验证规则(重要):
- 如果找到多个类似 flag 的字符串,应将它们视为候选项,并在最终确定前进行验证。
- 优先选择与预期工件/工作流相关的令牌(而非随机元数据噪声或明显的干扰项)。
- 检查整个语料库中的唯一性,并在报告时注明源文件/路径。
# Search for common flag patterns in files
grep -rniE '(flag|ctf|eno|htb|pico)\{' .
# Search in binary/memory output
strings output.bin | grep -iE '\{.*\}'
快速参考
# Recon
file * # Identify file types
strings binary | grep -i flag # Quick string search
xxd binary | head -20 # Hex dump header
binwalk -e firmware.bin # Extract embedded files
checksec --file=binary # Check binary protections
# Connect
nc host port # Connect to challenge
echo -e "answer1\nanswer2" | nc host port # Scripted input
curl -v http://host:port/ # HTTP recon
# Python exploit template
python3 -c "
from pwn import *
r = remote('host', port)
r.interactive()
"
挑战
$ARGUMENTS