mcpField
S
solve-challenge

solve-challenge

github.com/ljagiello安全3.6k9.0k 次安装2 天前更新
代码仓库

关于 solve-challenge

solve-challenge 是面向 Agent 的 CTF 解题技能,指导从平台访问、题目分类到专项分析、策略切换和生成题解。它结合基于证据的难度判断,并覆盖 CTFd API 与浏览器操作流程。

主要功能

  1. 01检测并导航 CTF 平台
  2. 02勘察题目文件与远程服务
  3. 03路由至分类专项技能
  4. 04提供跨类别切换指引
  5. 05验证 Flag 并生成题解

适用场景

  1. 01初步分析新分配的 CTF 题目
  2. 02依据文件或服务行为选择技巧
  3. 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:侦察
  1. 检查文件——列出挑战目录,对所有文件运行 file *
  2. 初步分析二进制文件——对二进制文件使用 strings、xxd | head、binwalk、checksec
  3. 获取链接内容——如果挑战中提到 URL,请先获取内容以了解背景
  4. 连接服务——尝试连接远程服务(nc),了解其预期行为
  5. 阅读提示——挑战描述、文件名和注释通常都包含线索
第 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-webXSS、SQLi、SSTI、SSRF、JWT、文件上传、原型污染
Pwn/ctf-pwn缓冲区溢出、格式字符串、堆、ROP、沙箱逃逸
Crypto/ctf-cryptoRSA、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-miscJail、编码、RF/SDR、深奥语言、约束求解

你也可以调用 /ctf-<category>,加载包含详细技巧的完整技能说明。

步骤 4:陷入困境时转换思路

如果你的首个方案行不通:

  1. 重新审视假设 —— 这真的是你认为的类别吗?“web”挑战可能需要用 crypto 伪造 JWT。“forensics” PCAP 中可能包含可用于重放的 pwn 漏洞利用代码。
  2. 尝试其他类别的技能 —— 许多挑战涉及多个类别。调用第二项技能来处理跨类别技术。
  3. 寻找遗漏之处 —— 隐藏文件、备用端口、响应头、源代码中的注释、图像元数据。
  4. 简化方案 —— 如果漏洞利用过于复杂,看看是否有更简单的途径(默认凭据、已知 CVE、逻辑漏洞)。
  5. 检查边界情况 —— 差一错误、竞态条件、整数溢出、编码不匹配。

常见的多类别模式:

  • 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

评论

支持 Markdown