一个轻量级、开发者友好的中间人(MITM)HTTP/HTTPS 代理,使用 Go 编写。它支持 HTTP/1.1 和 HTTP/2、CONNECT 隧道、WebSocket 隧道(ws/wss)、带有灵活过滤器的磁盘响应缓存以及实时配置重载。

Go MITM Proxy 是一个拦截代理,用于调试、测试、学习和受控拦截 HTTP(S) 流量。当启用 MITM 时,它会动态生成由本地 CA 签名的每主机叶子证书,从而允许代理解密和检查 HTTPS 流量。当 MITM 禁用或针对排除的域名/端口时,它也可以作为透明 TCP 隧道工作。
重要提示: 此应用程序会执行主动的中间人(MITM)拦截,包括生成和使用 TLS 证书来解密 HTTPS 流量。根据您所在的司法管辖区和网络环境,在未获得所有受影响用户明确、事先同意的情况下拦截流量可能属于违法行为,并可能违反隐私、工作场所政策或监管要求。
在使用此软件除您本地机器以外的任何环境之前:
此代理可能拦截流量的任何网络上的所有用户必须明确告知将会发生 HTTP(S) 拦截和检查。同意应是明确的,并最好有书面记录。
请勿在您不拥有、不管理或未获得明确授权进行测试或监控的网络上运行此软件。
许多地区对用户数据的拦截、记录和存储有严格的法律规定(例如 GDPR、CCPA、窃听法)。您有责任确保您的使用符合所有适用法规。
生成的 CA 私钥(通常为 ca-key.pem)允许持有者冒充信任相应证书的用户中的任何域名。
此代理设计用于开发、调试、受控测试或教育目的 — 并非用于隐蔽监控或未经授权的监视。
使用此软件即表示您承认并承担全部责任,确保您的使用合法、合乎道德,并已适当告知所有受影响的用户。
Via 和自定义 x-<normalized-proxy-name>-uid 头部)config.json 轮询和热应用更改先决条件:
克隆并构建: ```bash git clone https://github.com/Welfordian/mitm-proxy.git cd mitm-proxy go build ./
这会在项目根目录生成一个 mitm-proxy(在 Windows 上为 mitm-proxy.exe)二进制文件。
## 快速开始
1) 使用默认设置运行代理(监听在 :8080): ```bash
./mitm-proxy
在首次启动时,将创建本地CA并保存到 ca-cert.pem 和 ca-key.pem。
将您的浏览器或 curl 配置为使用位于 http://localhost:8080 的代理。
在您的操作系统/浏览器中信任生成的CA证书(ca-cert.pem),以允许HTTPS拦截。请参阅信任本地CA。
通过代理访问HTTPS站点并观察日志。使用详细模式获取更多信息: ```bash ./mitm-proxy --verbose
## 用法
### 命令行标志
- --config string: 指向 config.json 文件的路径
- --listen string: 监听地址(覆盖配置)
- --ca-cert string: 现有 CA 证书的路径(覆盖配置)
- --ca-key string: 现有 CA 密钥的路径(覆盖配置)
- --mitm bool: 启用 MITM 拦截(默认为 true;设为 false 则强制隧道)
- --verbose bool: 启用详细日志记录
- --watch-config bool: 监视 config.json 文件变化并自动应用(默认为 true)
- --admin-enabled bool: 启用本地管理 API/仪表盘(默认为 true)
- --admin-addr string: 管理 API/仪表盘监听地址(默认 127.0.0.1:9090)
- --admin-token string: 管理 bearer 令牌(若省略则在启动时生成)
- --admin-read-token string: 仅用于 GET/HEAD/OPTIONS 管理访问的只读 bearer 令牌
- --admin-ui bool: 提供内嵌管理 UI(默认为 true)
- --admin-store string: 管理 SQLite 存储路径(默认为 dashboard.db)
CLI 标志在注明时覆盖配置文件的值。
### 配置 (config.json)
仓库中提供了一个示例 config.json 文件: ```json
{
"listen_addr": ":8080",
"proxy_name": "MITM-Proxy",
"ca_cert_path": null,
"ca_key_path": null,
"ca_cert_output_path": "ca-cert.pem",
"ca_key_output_path": "ca-key.pem",
"enable_mitm": true,
"admin_enabled": true,
"admin_addr": "127.0.0.1:9090",
"admin_token": "",
"admin_read_token": "",
"admin_ui": true,
"admin_store": "dashboard.db",
"excluded_domains": [],
"blocked_ports": [25, 445, 3389],
"blocked_domains": [],
"blocked_ips": [],
"block_action": "deny",
"block_response_status": 403,
"traffic_capture": {
"store_bodies": false,
"max_body_bytes": 32768,
"redact_bodies": true,
"store_headers": true,
"redacted_headers": ["Authorization", "Cookie", "Proxy-Authorization", "Set-Cookie", "X-Api-Key"],
"store_cookies": true,
"redacted_cookies": []
},
"proxy_auth": {
"enabled": false,
"realm": "MITM Proxy",
"require_auth_for_loopback": false,
"default_action": "allow"
},
"verbose_logging": true,
"log_requests": true,
"max_idle_conns": 200,
"idle_conn_timeout_seconds": 90,
"tls_handshake_timeout_seconds": 10,
"min_tls_version": "1.2",
"tls_next_protos": ["h2", "http/1.1"],
"cache": {
"enabled": true,
"directory": "/var/cache/mitm-proxy",
"include_domains": [],
"exclude_domains": [],
"include_extensions": ["jpg", "png", "webp", "css", "js"],
"exclude_extensions": [],
"ttl": 3600
}
}
注:
ca_cert_path 或 ca_key_path,代理会将生成的 CA 写入 ca-cert.pem 和 ca-key.pem。excluded_domains 支持通配符(参见 internal/config 中的 IsDomainExcluded)。admin_addr 默认值为 localhost。如果 admin_token 为空,则在启动时生成并打印一个每次运行不同的令牌。admin_read_token 用于只读仪表盘/API 客户端。traffic_capture.store_bodies 默认禁用;启用后,请求体示例将受到大小限制并默认进行脱敏处理。traffic_capture.store_headers 和 traffic_capture.store_cookies 控制是否持久化捕获的元数据。 会脱敏整个标头值,而 则在存储前匹配并脱敏单个 和 名称。管理服务器默认在 http://127.0.0.1:9090/admin/ 中提供仪表盘。API 路由需要 Authorization: Bearer <token>;对于本地浏览器使用,/admin/?token=<token> 会将令牌存储到浏览器本地存储中。
初始仪表盘/API 覆盖范围包括:
GET /api/health 和 GET /api/versionGET /api/auditGET /api/traffic、GET /api/traffic/stats、GET /api/traffic/{id}、GET /api/traffic/stream、DELETE /api/traffic 和 POST /api/traffic/{id}/replayGET /api/traffic/export?format=har 用于 HAR 格式导出GET/POST/PUT/DELETE /api/repeater/cases 和 POST /api/repeater/cases/{id}/send 用于保存的可编辑重放用例GET/POST/PUT/DELETE /api/scopes 以及用于流量和重放用例的作用域分配端点仪表盘包含首次运行时的负责任使用确认。CA 私钥绝不会通过管理 API 暴露。
仪表盘状态默认存储于 SQLite 数据库 dashboard.db 中。通过仪表盘更改的设置会立即生效,并写回已配置的 JSON 文件;若代理从默认设置启动,则写回 config.json。
管理前端是一个位于 internal/admin/ui 的 Vite/React 应用。其生产构建输出到 internal/admin/ui/dist,并嵌入到 Go 二进制文件中。要更新仪表盘资源:```bash
cd internal/admin/ui
npm install
npm run build
### 上游代理链
出站流量可通过上游 HTTP 或 HTTPS 代理进行链式传递,例如 Burp、ZAP 或企业出口代理。启用后,正常的 HTTP(S) 转发、CONNECT 直通隧道、WebSocket 以及 Repeater 发送都将使用此上游代理,除非目标主机匹配 `no_proxy`。```json
{
"upstream_proxy": {
"enabled": true,
"url": "http://127.0.0.1:8080",
"username": "",
"password_env": "UPSTREAM_PROXY_PASSWORD",
"no_proxy": ["localhost", "127.0.0.1", "*.internal"],
"chain_tunnels": true,
"apply_to_repeater": true
}
}
v1 仅支持 http:// 和 https:// 上游代理 URL。如果需要 Basic 认证,请设置 username 并通过命名的环境变量提供密码;嵌入在 URL 中的凭据会被拒绝且永远不会显示在仪表盘设置中。如果启用了上游代理但不可用,受影响的请求会显式失败,而不会静默回退到直连。
仪表盘的 访问控制 视图管理客户端代理用户和按顺序排列的允许/拒绝 ACL 规则。代理用户存储在 SQLite 中并带有 bcrypt 密码哈希;仅当创建或重置用户时才接受明文密码,且 API 永远不会返回它们。
通过 config.json 或设置视图中的 proxy_auth 启用 Basic 代理认证。启用后,除非环回客户端被豁免,否则客户端必须发送 Proxy-Authorization: Basic ...。ACL 规则按优先级评估,可以匹配用户名、源 IP/CIDR、主机或通配符主机、端口或端口范围、方法以及研究范围。空的匹配器列表表示“任意”。
Proxy-Authorization 在转发、上游链、流量捕获、缓存查找、威胁扫描和 Repeater 克隆之前被剥离。捕获的流量在可用时包含 proxy_user 归属,并且 Traffic 搜索框可以匹配代理用户名。
仪表盘的 Repeater 视图允许安全研究人员将捕获的 HTTP 流量克隆到已保存的可编辑案例中。一个案例存储方法、URL、头部、主体样本、超时以及可选的源流量流 ID。每次发送都会存储一个运行,包含状态、持续时间、响应头部、限制大小的响应主体样本以及任何上游错误。
捕获的请求主体仅在捕获时启用 traffic_capture.store_bodies 时才会预填。如果启用了主体编辑,repeater 接收编辑后的样本;未捕获的主体保持为空,可以手动编辑。
传统的 POST /api/traffic/{id}/replay 端点仍然可用于一次性重放,而 repeater 则用于可重复的请求变异和响应比较。
仪表盘的 Pentest Toolkit 视图从捕获的流量构建被动目标地图。重建地图仅分析所选范围内的已存储流量,按规范化路径对端点进行分组,提取查询/主体/cookie/头部参数,记录反射和感兴趣的参数,并添加被动提示,如缺少安全头部、cookie 属性缺失、宽松的 CORS 以及详细错误。
渗透测试地图持久化存储在 SQLite 中,可以独立删除。该工具包从不发送请求、爬取、模糊测试或变异目标;端点证据可以克隆到 Repeater 中进行手动测试。
仪表盘的 Scopes 视图允许研究人员使用主机、URL 子字符串和可选的方法模式定义命名的目标边界。捕获流量时自动匹配已启用的范围;匹配的流量流、克隆的 Repeater 案例和威胁扫描事件会收到一个唯一的 scope_id。
全局范围选择器过滤 Traffic、Repeater 和 Threat Scanner 视图,可以显示所有流量、选定的已启用范围或范围外的项目。删除范围会清除相关的 scope_id 值,但不会删除捕获的流量、Repeater 案例、运行或威胁数据。
范围过滤器可用于 GET /api/traffic、GET /api/repeater/cases 和 GET /api/threats/events,带有 scope_id=<id> 或 scope_id=__out_of_scope__。添加 include_out_of_scope=true 以在选择的范围旁边包含未划分范围的记录。
仪表盘的 AI Copilot 视图存储与 Traffic、Repeater 案例、运行、范围或威胁事件关联的 AI 生成的研究笔记。Traffic 详细信息可以要求 copilot 解释请求或建议下一步的手动测试;Repeater 可以为已保存的案例建议测试或比较最新的两次运行。
copilot 仅提供建议。它从不发送流量、编辑 Repeater 案例、更改范围、更改设置或清除数据。可以解释范围外的流量,但有意不提供主动测试建议。
通过 config.json 或设置视图中的 ai_copilot 启用它:```json
{
"ai_copilot": {
"enabled": true,
"provider": "openai",
"model": "gpt-5.4-nano",
"timeout_ms": 10000,
"max_body_bytes": 32768,
"redact_before_ai": true,
"openai_api_key_env": "OPENAI_API_KEY"
}
}
OpenAI API 密钥从配置的环境变量中读取,不会存储在仪表盘或配置文件中。当启用 `redact_before_ai` 时,敏感头部、请求体样本和查询值会在发送 AI 上下文之前被编辑(脱敏)。保存的注释包括模型、提示哈希、摘要和结构化的 AI 输出,但不包含完整提示。
### AI 威胁扫描
威胁扫描器可以使用本地启发式规则检查 HTTP 请求和响应,并且在配置后,可以在阻止可疑流量之前向 OpenAI 寻求第二意见。
1. 创建 OpenAI API 密钥并将其暴露给代理进程:```powershell
$env:OPENAI_API_KEY = "sk-..."
在macOS/Linux上:```bash export OPENAI_API_KEY="sk-..."
2. 在 `config.json` 中启用扫描器:```json
{
"threat_scanner": {
"enabled": true,
"mode": "suspicious_only",
"provider": "openai",
"model": "gpt-5.4-nano",
"second_opinion_model": "gpt-5.4-mini",
"scan_requests": true,
"scan_responses": true,
"max_body_bytes": 131072,
"max_ai_body_bytes": 32768,
"ai_timeout_ms": 750,
"block_threshold": 0.85,
"warn_threshold": 0.65,
"require_ai_confirmation_for_block": true,
"block_critical_local_on_ai_failure": true,
"fail_open": true,
"scan_content_types": [
"text/html",
"text/plain",
"application/json",
"application/javascript",
"text/javascript",
"application/xml"
],
"skip_content_types": [
"image/",
"video/",
"audio/",
"font/",
"application/octet-stream"
],
"trusted_domains": [
"accounts.google.com",
"login.microsoftonline.com",
"github.com"
],
"allowlist_domains": [],
"malicious_domains": [],
"malicious_file_hashes": [],
"threat_intel_updated": "",
"quarantine_dir": "quarantine",
"debug_log_path": "threats.log",
"redact_before_ai": true,
"store_bodies": false,
"openai_api_key_env": "OPENAI_API_KEY"
}
}
仪表盘的**威胁扫描器**视图显示扫描的请求/响应计数、AI调用次数、检测结果、判定详情、热门本地规则以及覆盖操作。
扫描器模式:
- `suspicious_only`:默认;本地启发式规则决定何时调用AI。
- `all_text`:对类似文本的流量调用AI。
- `paranoid`:也对类似文本的流量调用AI,适用于高灵敏度测试。
- `metadata_only`:使用头部、URL、主机和元数据,不进行AI主体审查。
- `off`:禁用扫描。
有用的安全和隐私控制:
- `redact_before_ai`:在将证据发送给OpenAI之前,脱敏处理常见机密和个人数据。
- `max_ai_body_bytes`:限制包含在AI证据中的主体样本大小。
- `require_ai_confirmation_for_block`:除非AI确认,否则阻止本地启发式规则进行拦截;但针对关键本地证据启用了`block_critical_local_on_ai_failure`的情况除外。
- `fail_open`:当扫描器失败时允许流量通过,除非启用了更严格的拦截设置。
- `trusted_domains`和`allowlist_domains`:减少已知良好主机的误报。
- `malicious_domains`和`malicious_file_hashes`:添加本地威胁情报匹配,无需等待AI。
- `debug_log_path`:将扫描器决策写入本地JSONL格式日志,用于调试。
若要为API密钥使用不同的环境变量名称,请设置`openai_api_key_env`,并在启动代理之前导出该变量。请勿将API密钥直接放入`config.json`中。
### 信任本地CA
要拦截HTTPS,请导入并信任操作系统/浏览器中的ca-cert.pem:
- macOS:钥匙串访问 → 登录/系统 → 证书 → 导入ca-cert.pem → 设置为始终信任。
- Windows:certmgr.msc → 受信任的根证书颁发机构 → 证书 → 导入ca-cert.pem。
- Linux(因发行版而异):例如,update-ca-certificates,或特定浏览器的存储(Firefox:设置 → 隐私与安全 → 证书 → 查看 → 证书颁发机构 → 导入)。
如果不信任该CA,浏览器将对被拦截的站点显示证书警告。
### 使用代理
将HTTP/HTTPS代理设置为监听地址(默认 http://localhost:8080)。
使用curl的示例: ```bash
# HTTP
curl -x http://localhost:8080 http://example.com/
# HTTPS (after trusting the CA for full MITM)
curl -x http://localhost:8080 https://example.com/
# Disable MITM and tunnel only
./mitm-proxy --mitm=false
# Change listen address
./mitm-proxy --listen=127.0.0.1:9090
WebSocket 说明:
缓存基于文件,启用时仅考虑 HTTP GET 请求。选择由以下参数控制:
缓存命中时,响应包含:
缓存目录在启动和配置更改时确保存在。如果未设置目录,则默认为 ./cache。
go build ./ ./mitm-proxy --config ./config.json
服务器绑定到配置的 listen_addr,并通过 ALPN 处理 HTTP + HTTPS。
## 路线图
- 代理认证(Basic/NTLM)与 ACL
- 上游代理/链式支持
- PAC 文件生成及辅助脚本
- 用于检查流量和缓存条目的用户界面
- TLS 指纹识别控制与 JA3 样式
- 指标/健康端点及 Prometheus 集成
## 贡献
欢迎提交 Issue 和 Pull Request。对于重大更改,请先开启一个 Issue 讨论范围和设计。
编码风格:保持更改最小化且专注;优先考虑清晰、小型且可组合的函数。
redacted_headersredacted_cookiesCookieSet-Cookieproxy_auth 启用基于 SQLite 管理用户和有序 ACL 规则的基本客户端代理身份验证。blocked_domains 支持精确域名和通配符模式(如 *.example.com);blocked_ips 支持单个 IP 和 CIDR 范围。cache.include_domains 与 cache.exclude_domains 互斥,include_extensions 与 exclude_extensions 同理。--config 指定的文件或默认的 ./config.json,并通过 Proxy.SetConfig 热应用更改。GET/POST/DELETE /api/pentest/maps 以及用于被动目标映射的端点克隆操作GET/POST/PUT/DELETE /api/proxy-auth/users 和 /api/proxy-acl/rules 以及 POST /api/proxy-acl/test 用于代理客户端访问控制POST /api/ai/traffic/{id}/explain、POST /api/ai/traffic/{id}/suggest-tests、POST /api/ai/repeater/cases/{id}/suggest-tests、POST /api/ai/repeater/cases/{id}/compare-runs 和 GET/POST/DELETE /api/ai/notes 用于 AI 研究助手笔记GET /api/certificates/ca、GET /api/certificates/ca/download、POST /api/certificates/ca/rotate、POST /api/certificates/ca/import 和 GET /api/certificates/leafGET/POST/DELETE 阻止规则GET /api/deployments/current、POST /api/deployments/current/reload、GET /api/logs、GET /api/cache(含缓存条目和命中/未命中计数)、POST /api/cache/purge 和 GET/PUT /api/settingsGET /api/threats/events、GET /api/threats/stream、GET /api/threats/config、POST /api/threats/test 及威胁覆盖端点GET /metrics 用于 Prometheus 兼容的进程/管理/威胁计数器