appsecco/mcp-client-and-proxy

GitHub: appsecco/mcp-client-and-proxy

一个支持代理拦截与多种连接模式的通用 MCP 客户端,用于安全测试中的流量监控与修改。

Stars: 17 | Forks: 3

# Appsecco MCP 客户端与代理 [![Appsecco](https://img.shields.io/badge/Built%20by-Appsecco-blue?style=for-the-badge&logo=security)](https://appsecco.com) [![License](https://img.shields.io/badge/License-MIT-green.svg?style=for-the-badge)](LICENSE) [![Python](https://img.shields.io/badge/Python-3.7+-blue.svg?style=for-the-badge&logo=python)](https://www.python.org/) ## 这是什么? **Appsecco MCP 客户端与代理** 是一个安全测试工具,允许你使用 **Burp Suite** 或 **ZAP** 等拦截代理来拦截、检查和修改 [模型上下文协议(MCP)](https://modelcontextprotocol.io/) 流量。 它充当一个通用的 MCP 客户端,可以连接到任何 MCP 服务器(本地或远程),并将所有流量路由到你选择的代理以进行安全分析。 ### 主要特性 - **Burp Suite / ZAP 集成** — 将所有 MCP 流量路由到你的拦截代理 - **多种连接模式** — 本地 stdio 服务器、通过 `mcp-remote` 的远程连接,或直接访问 HTTP/SSE 端点 - **完整的流量可见性** — 拦截本地中继流量和后端 HTTPS 流量 - **OAuth 2.1 支持** — 符合 MCP 规范的自动 OAuth 流程(带 PKCE) - **静态头部认证** — API 密钥、Bearer 令牌、自定义头部 - **HTTP/2 支持** — 直接远程连接使用 httpx 并启用 HTTP/2 - **Proxychains 集成** — 通过代理链路由子进程流量 - **会话日志记录** — 所有 CLI 输出同时写入带时间戳的日志文件,便于后续审查 - **交互式 CLI** — 选择服务器、列出工具、带参数调用工具 ## 安装 ### 先决条件 - Python 3.7+ - Node.js 18+ 和 npm(用于基于 `npx` 的 MCP 服务器) - [Proxychains](https://github.com/haad/proxychains)(可选,用于路由子进程流量) - Burp Suite 或 ZAP(用于流量拦截) ### 设置 ``` # 克隆仓库 git clone https://github.com/appsecco/mcp-client-and-proxy.git cd mcp-client-and-proxy # 创建并激活虚拟环境 python3 -m venv venv && source venv/bin/activate # 安装 Python 依赖 pip3 install -r requirements.txt # 安装 Node.js 依赖(用于后端流量拦截) npm install -g global-agent npm install undici ``` ### 安装 Proxychains(可选) - **macOS**: `brew install proxychains-ng` - **Ubuntu/Debian**: `sudo apt-get install proxychains` - **CentOS/RHEL**: `sudo yum install proxychains` ## 快速开始 ### 1. 配置 MCP 服务器 创建或编辑 `mcp_config.json`: ``` { "mcpServers": { "my-remote-mcp": { "url": "https://remote.example.com/mcp" } } } ``` ### 2. 启动 Burp Suite 启动 Burp Suite 并监听 `127.0.0.1:8080`(默认设置)。 ### 3. 运行工具 ``` # 对于远程 MCP 服务器(直接远程模式) python3 app.py # 对于本地 stdio / mcp-remote 服务器(在端口 3000 启动本地代理) python3 app.py --start-proxy ``` ### 4. 交互 该工具会显示一个交互式菜单: ``` 🔧 Appsecco MCP Client PST - Professional Security Testing ------------------------------------------------------------ Choose an option: 1. 🛠️ Call a tool 2. 📋 List tools again 3. 🔄 Switch server 4. 🚪 Exit 5. ℹ️ About Appsecco ``` 选择一个工具,提供参数,并观察流量在 Burp 中显示。 ## 连接模式 工具会根据 `mcp_config.json` 自动检测连接模式: | 模式 | 配置 | 是否使用子进程 | 用途 | |---|---|---|---| | **direct-remote** | `url` 字段(无 `command`) | 否 | 远程 HTTP/SSE MCP 端点 | | **mcp-remote** | `command: npx` 并包含 `mcp-remote` 参数 | 是 | 通过 npm 桥接远程 MCP | | **stdio** | `command` 加 `args` | 是 | 本地 MCP 服务器 | ### 直接远程连接 直接连接到一个 HTTP/SSE MCP 端点。不需要子进程或本地代理 — 请求直接通过 Burp 发送到远程服务器。 ``` { "mcpServers": { "my-remote-mcp": { "url": "https://remote.example.com/mcp" } } } ``` ### 本地 stdio 服务器 运行一个本地 MCP 服务器进程,并通过 stdin/stdout 通信。使用 `--start-proxy` 通过本地 HTTP 代理(端口 3000)将流量路由到 Burp。 ``` { "mcpServers": { "local-server": { "command": "python", "args": ["my_mcp_server.py"] } } } ``` ### 通过 mcp-remote 的远程连接 使用 `mcp-remote` npm 包作为远程端点的桥接。添加 `env` 变量以将后端流量路由到 Burp(参见 [拦截后端流量](#intercepting-backend-mcp-server-traffic-mcp-remote))。 ``` { "mcpServers": { "remote-via-bridge": { "command": "npx", "args": ["-y", "mcp-remote", "https://remote.example.com/mcp"], "env": { "NODE_EXTRA_CA_CERTS": "/path/to/burp-ca.pem", "NODE_OPTIONS": "--require /path/to/proxy-bootstrap.js", "GLOBAL_AGENT_HTTP_PROXY": "http://127.0.0.1:8080", "GLOBAL_AGENT_HTTPS_PROXY": "http://127.0.0.1:8080" } } } } ``` ## 认证 ### 静态头部 为每个请求添加 API 密钥、Bearer 令牌或自定义头部: ``` { "mcpServers": { "authenticated-mcp": { "url": "https://remote.example.com/mcp", "headers": { "Authorization": "Bearer your-api-key-or-token", "X-Custom-Header": "value" } } } } ``` ### OAuth 2.1(自动) 如果远程服务器返回 `401 Unauthorized` 并附带 `WWW-Authenticate: Bearer` 头部,该工具会自动运行 [MCP OAuth 2.1 流程](https://modelcontextprotocol.io/specification/draft/basic/authorization): 1. 发现受保护资源元数据(RFC 9728) 2. 获取授权服务器元数据 3. 如果未配置客户端 ID,则尝试动态客户端注册(RFC 7591) 4. 打开浏览器进行授权码 + PKCE 登录 5. 交换代码以获取访问令牌并重试请求 要使用预注册的 OAuth 凭据: ``` { "mcpServers": { "oauth-mcp": { "url": "https://remote.example.com/mcp", "oauth_client_id": "your-client-id", "oauth_client_secret": "your-client-secret" } } } ``` | 配置字段 | 是否必需 | 用途 | |---|---|---| | `headers` | 否 | 每个请求发送的静态 HTTP 头部 | | `oauth_client_id` | 否 | 预注册的 OAuth 客户端 ID(跳过动态注册) | | `oauth_client_secret` | 否 | OAuth 客户端密钥(用于机密客户端) | ## 数据流 ### 直接远程模式 ``` App → Burp (port 8080) → Remote MCP endpoint ``` ### stdio / mcp-remote 模式(带 --start-proxy) ``` App → Local Proxy (port 3000) → Burp (port 8080) → MCP Server (stdio) ↓ mcp-remote subprocess ↓ Burp (port 8080) → Remote MCP endpoint ``` ## 拦截后端 MCP 服务器流量(mcp-remote) 默认情况下,`proxychains` 无法拦截 Node.js 流量,因为 Node.js 使用自己的网络栈(libuv/undici),绕过了 `LD_PRELOAD`/`DYLD_INSERT_LIBRARIES` 钩子。此工具通过以下方式解决该问题: - **`HTTP_PROXY`/`HTTPS_PROXY` 环境变量** — 自动设置在 MCP 子进程上 - **`proxy-bootstrap.js`** — 同时修补 Node.js 的遗留 `http`/`https` 模块(通过 `global-agent`)和原生 `fetch`/`undici` 分发器(通过 `undici` 的 `ProxyAgent`) ### 设置步骤 **步骤 1:导出 Burp 的 CA 证书为 PEM 格式** 在 Burp Suite 中:`Proxy → Options → Import/export CA certificate → Export Certificate in DER format` ``` openssl x509 -inform DER -in burp-ca.crt -out burp-ca.pem ``` **步骤 2:查找 global-agent 的安装路径** ``` npm root -g # 例如 /usr/local/lib/node_modules ``` **步骤 3:更新 `proxy-bootstrap.js`** 编辑 `require(...)` 路径以匹配你的系统: ``` const { bootstrap } = require('/path/to/node_modules/global-agent'); bootstrap(); const { ProxyAgent, setGlobalDispatcher } = require('undici'); const proxyUrl = process.env.GLOBAL_AGENT_HTTPS_PROXY || 'http://127.0.0.1:8080'; setGlobalDispatcher(new ProxyAgent(proxyUrl)); ``` **步骤 4:配置 `mcp_config.json`** 向你的 MCP 服务器条目添加 `env` 块: ``` { "mcpServers": { "My MCP Server": { "command": "npx", "args": ["-y", "mcp-remote", "https://your-mcp-server.example.com/mcp"], "env": { "NODE_EXTRA_CA_CERTS": "/path/to/burp-ca.pem", "NODE_OPTIONS": "--require /path/to/proxy-bootstrap.js", "GLOBAL_AGENT_HTTP_PROXY": "http://127.0.0.1:8080", "GLOBAL_AGENT_HTTPS_PROXY": "http://127.0.0.1:8080" } } } } ``` | 字段 | 用途 | |---|---| | `NODE_EXTRA_CA_CERTS` | 信任 Burp 的 CA 证书,使 TLS 验证通过代理 | | `NODE_OPTIONS` | 在其他代码运行前加载 `proxy-bootstrap.js` | | `GLOBAL_AGENT_HTTP_PROXY` / `GLOBAL_AGENT_HTTPS_PROXY` | `global-agent` 和 `proxy-bootstrap.js` 的代理 URL | 配置完成后,所有流量(包括通过 `mcp-remote` 到远程端点的 HTTPS 流量)都会显示在 Burp 中。 ## CLI 选项 ``` python3 app.py [OPTIONS] Options: -h, --help Show help message --config CONFIG, -c CONFIG MCP config file (default: mcp_config.json) --proxy PROXY, -p PROXY Burp/ZAP proxy URL (default: http://127.0.0.1:8080) --start-proxy Start local HTTP proxy server for Burp inspection --proxy-port PROXY_PORT Local proxy server port (default: 3000) --no-burp Disable routing through Burp/ZAP proxy --no-proxychains Disable proxychains for subprocess traffic --no-ssl-bypass Keep SSL certificate verification enabled --no-analytics Disable anonymous usage analytics --debug Enable verbose debug output --log-file LOG_FILE, -l LOG_FILE Path to session log file (default: logs/session_.log) ``` ### 示例 ``` # 使用 Burp 拦截的标准用法(本地服务器) python3 app.py --start-proxy # 直接远程 MCP(无需本地代理) python3 app.py # 自定义配置文件 python3 app.py --config my_servers.json --start-proxy # 自定义代理 URL(例如端口 8081 上的 ZAP) python3 app.py --proxy http://127.0.0.1:8081 --start-proxy # 无 Burp(仅直接连接) python3 app.py --no-burp --no-proxychains # 调试模式用于故障排除 python3 app.py --debug --start-proxy # 将会话日志写入自定义路径 python3 app.py --log-file /tmp/my-session.log ``` ## 会话日志 每次运行都会将所有 CLI 输出(标准输出 + 标准错误)镜像到日志文件中,以便后续回顾或与团队成员共享发现。 - **默认路径**:`logs/session_.log`(`logs/` 目录会自动创建) - **覆盖**:`python3 app.py --log-file /path/to/session.log`(或 `-l`) - **内容**:终端打印的所有内容 — 横幅、菜单选择、工具调用、响应、错误 — 并去除 ANSI 颜色转义以便阅读 - **追加安全**:每次运行添加 `===== Session started (pid ) =====` 标题,使重复文件可追溯 - **Git 忽略**:`logs/` 和 `*.log` 已在 `.gitignore` 中,因此会话输出不会意外提交 ## 分析 该工具包含可选的匿名使用分析。 **记录内容**:启动参数、会话开始/结束、MCP 服务器数量、错误率、基本系统信息(操作系统、Python 版本) **不记录内容**:个人数据、URL、测试目标、流量内容、凭据 **退出分析**: ``` python3 app.py --no-analytics # 或 export MCP_ANALYTICS_DISABLED=true ``` **调试分析**(查看发送的数据): ``` export MCP_ANALYTICS_DEBUG=true ``` ## 我们为何构建此工具 [![观看视频](https://imgs.kloudle.com/apsc-public/why-did-we-build-universal-mcp-client.png)](https://youtu.be/A3DpnyEfC4M) 我们在为一家财富 500 强金融科技公司测试 MCP 服务器安全性时构建了此工具。它在我们的 Burp Suite 工作流中运行良好,我们认为安全社区的其他人也能从中受益。 ## 关于 Appsecco **Appsecco** 是一家专注于以下领域的领先网络安全公司: - **AI 代理、AI 优先应用和 MCP 服务器渗透测试** - **渗透测试与安全评估** - **应用程序安全测试** - **基础设施渗透测试** - **云安全评估** 此 MCP 客户端代理工具是我们专业安全工具包的一部分,旨在为安全研究人员、渗透测试人员和网络安全专业人士提供一款能够拦截和代理 MCP 本地和远程服务器流量的工具,通过 Burp/ZAP 等拦截代理进行操作。 ### 联系方式 - **网站**:[https://appsecco.com](https://appsecco.com) - **电子邮件**:[contact@appsecco.com](mailto:contact@appsecco.com) - **LinkedIn**:[https://linkedin.com/company/appsecco](https://linkedin.com/company/appsecco) - **博客**:[https://blog.appsecco.com](https://blog.appsecco.com) - **Twitter**:[@appseccouk](https://twitter.com/appseccouk) ## 许可证 本项目根据 MIT 许可证授权 — 详见 [LICENSE](LICENSE) 文件。 ## 感谢 由 **[Riyaz](https://github.com/riyazwalikar) & [Akash](https://github.com/makash)** 为网络安全社区构建。 **Appsecco — 我们在攻击者之前测试你的产品与基础设施**
标签:API密钥, Bearer令牌, Burp Suite, GNU通用公共许可证, HTTP/2, MCP客户端, MCP远程, MITM代理, Node.js, OAuth 2.1, PKCE, Proxychains, Python, SSE, STDIO, 中间人, 交互式CLI, 代理, 会话日志, 安全测试, 攻击性安全, 无后门, 无文件攻击, 模型上下文协议, 流量可见性, 流量拦截, 虚拟环境, 逆向工具, 静态头认证