titaniumtushar/burp-mcp-plus
GitHub: titaniumtushar/burp-mcp-plus
一个 Burp Suite 的 MCP 封装层,通过结构化输入防止 LLM 生成畸形 HTTP 请求,并利用本地文件索引大幅降低 AI 辅助渗透测试的 token 成本。
Stars: 3 | Forks: 0
## 问题所在
你将一个 LLM 连接到 Burp 官方的 MCP server,并要求它“使用被篡改的 cookie 重放这个请求”。它尽职尽责地构建了一个 Repeater payload——然后默默地丢弃了 `Cookie` header,得到了一个 401 状态码,并自信地告诉你该 endpoint 不需要认证。
或者它忘记了 `Content-Length`。或者 `Host`。或者使用了 LF 而不是 CRLF。又或者直接粘贴了一个完全没有 header 的 JSON body。
发生这种情况是因为上游 Burp MCP 接受自由格式的 `content` 字符串。模型发出的任何内容都会直接传输到线路上。这里没有 schema,没有验证,也没有任何帮助。
破坏漫长渗透测试环节的另一个问题是:**token 成本**。每次调用 `get_proxy_http_history` 都会将数 KB 重复的 header 发送回模型。对目标进行一小时的分类筛选,你会因为对相同的代理历史记录进行重复翻页而消耗大量成本。
## 此项目修复了什么
**`burp-mcp-plus`** 是一个 Python MCP wrapper,位于你的 LLM 和 Burp 官方 MCP server 之间。两大核心理念:
### 1. 结构化输入,而非自由格式字符串
每个涉及 HTTP 的工具都接受类型化的字段——`method`、`path`、`set_headers`、`body`——以及一个*基线*(来自 Burp 历史记录的真实条目,或一个 URL)。wrapper 自行构建线路格式。正确的 CRLF,自动填充 `Host`,自动填充 `Content-Length`,默认 `User-Agent`,继承 cookies。LLM 实际上无法生成格式错误的请求,因为根本没有提供可以输入格式错误请求的 `content` 参数。
### 2. 针对繁琐内容的本地文件摄取
如果你已经使用附带的 `Deduped HTTP History + JS Exporter` Burp extension 对目标进行了分类筛选,wrapper 会索引磁盘上的导出文件。`dedup_search` 和 `js_search` 返回 file:line 和 60 字符的片段——这比每次模型想要查看过去的流量时都重新请求 Burp 要划算得多。完整内容仅在需要时按需获取。
## 架构
纯 Python stdio MCP server。通过 SSE 在 `localhost:9876` 与 Burp 的 `mcp-proxy-all` extension 通信。从磁盘读取 dedup/JS 导出文件。适用于任何 MCP host:Claude Desktop、Claude Code、Cursor、Continue 以及任何支持该协议的客户端。
## 功能特性
### 实时 Burp 交互
- **`list_history`** / **`search_history`** ——对代理历史记录进行分页或正则表达式搜索。返回精简摘要(id + method + url + status),而不是原始字节。
- **`inspect_history_entry`** ——精美打印单个条目的 headers、body、target。
- **`repeater_from_history`** ——克隆一个基线,修改 (method, path, headers, body) 的任意子集,推送到 Repeater。**所有其他 headers 均从基线中原样保留。** Cookies、auth token、Sec-Fetch-*、自定义 Anthropic-* / X-* headers——全部透传。
- **`repeater_from_template`** ——使用 URL 从头构建。可选择从历史基线继承 auth。
- **`send_request`** ——格式相同,但实际上会发送并返回响应。当你只想测试时,跳过 Repeater 的繁琐步骤。
- **`intruder_from_history`** ——推送到 Intruder,自动在你指定的子字符串周围包裹 `§…§` payload 标记。
- **`sitemap`** ——host → method → paths 树,根据历史记录综合生成。Burp 的 MCP 没有暴露 Target;我们来合成一个。
- **`collaborator_generate`** / **`collaborator_check`** ——OOB canary payload + 交互轮询。
### 本地去重文件摄取
指向由附带的 extension 生成的 `deduped_requests.txt`,模型即可搜索/重放过去会话中的 endpoint,而无需与 Burp 进行往返通信。
- **`dedup_load`** / **`dedup_list`** ——以某个名称注册文件。
- **`dedup_search`** ——对 `url` / `request` / `response` / `params` / `all` 进行正则表达式搜索。返回 60 字符的片段。
- **`dedup_get`** ——默认预览,按需提供完整的 request/response。
- **`dedup_to_repeater`** ——将存储的条目重放到一个新的 Repeater 标签页中,并支持可选修改。HTTP/2 行会自动强制转换为 HTTP/1.1。
### 本地 JS 导出摄取
指向由附带的 extension 的 JS Exporter 生成的 `_manifest.csv`,模型即可对为目标捕获的所有 JavaScript 进行 grep 搜索。
- **`js_load`** / **`js_list`** ——注册一个导出。
- **`js_files`** ——浏览清单,按 host 正则表达式进行过滤。
- **`js_search`** ——grep 搜索所有磁盘上的 JS。返回 file:line + 片段,每个文件最多 N 个匹配项(默认为 3)。透明解码旧版本 extension 生成的旧版 `array('b', [...])` byte-list 格式。
- **`js_read`** ——获取感兴趣的文件的完整内容。
### 针对真实世界的健壮性
- 容忍 Burp 无分隔符的 NDJSON 历史格式。
- 当 Burp 使用 `... (truncated)` 截断长响应时,恢复解析中途的数据。
- 针对主体字符串中的原始控制字节使用 `strict=False` JSON 解码。
- 为空输入、状态标记、格式错误条目提供具体的错误消息——引导模型调用下一个工具。
- 20 个测试涵盖了线路格式构建和边缘情况(运行它们不需要 Burp)。
## 安装
### 1. Burp 端
从 Burp 的 BApp Store 安装 **MCP Server**。确认它正在监听 `http://127.0.0.1:9876`(Output 标签页)。
如果你需要 dedup/JS 摄取功能,请安装附带的 extension:
1. 在 Burp → Settings → Extensions → Python environment 中配置 Jython 2.7。
2. Burp → Extensions → Installed → Add → Python → 选择本仓库中的 `burp-extension/deduped_history.py`。
3. 会出现两个新标签页:**Deduped History** 和 **JS Exporter**。
**在开始捕获之前,extension 需要完成两件事:**
- **设置你的目标范围。** Burp → Target → Scope → 添加你正在测试的 host(例如 `https://app.acme.com/.*`)。extension 仅对范围内的流量进行去重/导出,因此这可以保持输出整洁并避免摄取随机的第三方干扰(CDN、分析追踪等)。
- **为 JS Exporter 选择输出目录。** 在 **JS Exporter** 标签页中,在浏览前设置 output dir + project name。文件将保存到 `////.js`,并附带一个供 wrapper 索引的 `_manifest.csv`。
然后浏览目标。随着新 endpoint 的出现,Deduped History 标签页会被填充;随着新 `.js` / `.mjs` 响应的到来,JS Exporter 标签页会被填充。在 Deduped History 标签页中点击 **Export** 以写入 `deduped_requests.txt`。
### 2. Wrapper 端
需要 Python 3.11+ 和 [`uv`](https://docs.astral.sh/uv/)。
```
git clone https://github.com/titaniumtushar/burp-mcp-plus.git
cd burp-mcp-plus
uv sync
uv run pytest # offline tests; no Burp required
```
### 3. 将其接入你的 MCP host
**Claude Desktop**(macOS 上的 `~/Library/Application Support/Claude/claude_desktop_config.json`):
```
{
"mcpServers": {
"burp": {
"command": "/path/to/burp-suite-jdk/bin/java",
"args": [
"-jar", "/path/to/.BurpSuite/mcp-proxy/mcp-proxy-all.jar",
"--sse-url", "http://127.0.0.1:9876"
]
},
"burp-plus": {
"command": "/opt/homebrew/bin/uv",
"args": [
"run", "--directory", "/path/to/burp-mcp-plus", "burp-mcp-plus"
]
}
}
}
```
(示例见 [`examples/claude_desktop_config.json`](examples/claude_desktop_config.json)。)
重启 host。工具将以 `mcp__burp-plus__*` 的形式出现。
对于 **Claude Code CLI**、**Cursor**、**Continue**——配置格式相同,只是配置文件不同。MCP server 本身并不关心这些。
## 附带的 Burp extension
`burp-extension/deduped_history.py` 是我编写(并修复——见下文相当于 `CHANGELOG` 的说明)的一个 Jython extension,用于生成供 wrapper 索引的 dedup/JS 导出文件。
**标签页 1:Deduped History。** 监控代理流量。仅当出现新的 (method, host, path, parameters) 元组时才添加一行。当 endpoint 上出现新的查询/主体参数名称时会重新触发。将所有内容导出到 `deduped_requests.txt`。
**标签页 2:JS Exporter。** 监控 JavaScript 响应,将每个唯一的 JS 文件保存到 `
标签:AI辅助安全测试, Burp Suite, CISA项目, DLL 劫持, HTTP请求构造, MCP, Python, Token优化, Web安全, 代理拦截, 大模型安全, 大语言模型, 无后门, 流量去重, 网络安全, 蓝队分析, 隐私保护