mitmproxy 是一款免费开源的交互式控制台工具、Web 界面和 Python 库,用于拦截、检查、修改和重放 HTTP/S 流量。对于处理 Web 应用、API 和移动端流量的开发者、安全研究人员和 QA 工程师来说,它是一个功能强大的中间人(man-in-the-middle)代理。
mitmproxy 概述
mitmproxy 作为代理服务器运行,位于客户端与目标服务器之间。所有经过该代理的 HTTP 和 HTTPS 流量都可以实时查看、过滤和修改。其核心功能支持深入检查请求与响应的头部、正文及其他属性。工具套件包括:
- mitmproxy:用于实时流量分析的交互式终端界面。
- mitmweb:基于浏览器的图形界面,功能与
mitmproxy相似,但通过 Web 浏览器访问。 - mitmdump:用于以编程方式修改和记录流量的命令行工具,适合脚本化和自动化。
核心功能
SSL/TLS 拦截
mitmproxy 会即时生成自己的 SSL/TLS 证书,从而解密并检查加密的 HTTPS 流量。这要求客户端信任 mitmproxy 的 CA 证书。
交互式界面
mitmproxy 和 mitmweb 都提供交互式环境来查看和管理流量。您可以过滤流量、搜索内容、编辑请求/响应,并标记特定流量以便后续分析。
流量修改
可以通过交互式界面或 Python 脚本即时修改请求和响应。这样便可测试边界情况、注入头部、篡改数据或模拟不同的服务器响应。
重放功能
mitmproxy 支持把已录制的客户端请求重放给服务器,或把服务器响应重放给客户端。这有助于在无需重复执行客户端操作的情况下测试特定场景,或模拟服务器行为。
脚本与自动化
mitmdump 提供 Python API,用于开发自定义脚本。这些脚本可按既定逻辑以编程方式检查、修改、重定向或丢弃流量,便于自动化测试和复杂的流量操作。
透明代理模式
mitmproxy 可以运行在透明代理模式下,此时客户端无需显式配置代理。网络流量在网络层被重定向到 mitmproxy,通常通过路由器规则或防火墙配置实现。
安装
可以使用 pip 安装 mitmproxy:
pip install mitmproxy
针对特定操作系统,mitmproxy 官网提供预编译的二进制文件,也可以通过 macOS 上的 Homebrew 等包管理器安装。
基本用法
启动 mitmproxy
启动交互式控制台界面:
mitmproxy
启动 Web 界面:
mitmweb
默认情况下,mitmproxy 监听 localhost:8080。
客户端配置
必须把客户端配置为使用 mitmproxy 作为其 HTTP/S 代理。
浏览器示例(Firefox):
1. 打开 Firefox 设置。
2. 进入网络设置或代理设置。
3. 选择“手动配置代理”。
4. 将 HTTP 代理设为 127.0.0.1,端口设为 8080。
5. 将 SSL 代理设为 127.0.0.1,端口设为 8080。
6. 确保勾选“为所有协议使用此代理服务器”,或对其他协议进行同样的配置。
操作系统(macOS):
1. 进入“系统设置 > 网络 > Wi-Fi > 详细信息”。
2. 选择“代理”。
3. 启用“网页代理(HTTP)”和“安全网页代理(HTTPS)”。
4. 两者的服务器均设为 127.0.0.1,端口均设为 8080。
SSL/TLS 证书安装
要解密 HTTPS 流量,客户端必须信任 mitmproxy 的 CA 证书。
1. 在 mitmproxy 运行时,用已配置好的客户端浏览器访问 http://mitm.it。
2. 下载并安装适用于该客户端操作系统或浏览器的 CA 证书。
3. 在 Android 或 iOS 等系统上需要特定的安装步骤,通常需要下载证书并在安全设置中手动将其标记为受信任。
进阶用法
修改请求与响应
在 mitmproxy 或 mitmweb 界面中:
1. 选择一条流量记录。
2. 按 e(edit)修改请求或响应。
3. 选择要编辑的部分(例如头部、正文、URL)。
4. 完成修改后按 q 保存并让流量继续。
使用 mitmdump 编写脚本
可以把 Python 脚本传给 mitmdump,实现流量操作的自动化。
示例:修改请求头
modify_header.py:
from mitmproxy import http
def request(flow: http.HTTPFlow):
if "example.com" in flow.request.pretty_host:
flow.request.headers["X-Modified-By"] = "mitmproxy-script"
print(f"Modified header for {flow.request.url}")
用 mitmdump 运行:
mitmdump -s modify_header.py
该脚本会为发往 example.com 的请求添加自定义头部 X-Modified-By。
示例:修改响应正文
modify_response.py:
from mitmproxy import http
def response(flow: http.HTTPFlow):
if "api.example.com/data" in flow.request.url and flow.response.content:
# 假设响应为 JSON
data = flow.response.json()
data["status"] = "modified_by_mitmproxy"
flow.response.set_json(data)
print(f"Modified response body for {flow.request.url}")
用 mitmdump 运行:
mitmdump -s modify_response.py
该脚本会拦截来自 api.example.com/data 的响应,将其解析为 JSON,修改其中一个字段,再把修改后的 JSON 发回客户端。
重放流量
mitmproxy 允许重放已捕获的 HTTP 流量。
重放客户端请求:
1. 在 mitmproxy 或 mitmweb 中选择一条流量记录。
2. 按 r 将客户端请求重放给服务器。这会原样重发该请求,无需客户端参与。
重放服务器响应:
1. 选择一条流量记录。
2. 按 R(shift+r)将服务器响应重放给客户端。这会把已录制的服务器响应发回客户端,跳过与真实服务器的交互。适合用特定的服务器响应测试客户端行为。
使用场景
- API 开发与调试:检查请求和响应,以了解 API 行为、验证数据格式并排查集成问题。
- 安全测试:通过篡改请求(例如注入 SQL、XSS 载荷)发现漏洞,测试身份验证机制,并分析加密流量。
- 移动应用分析:拦截并分析移动应用的流量,了解其后端通信、数据处理方式以及潜在的安全缺陷。
- 逆向工程:通过观察网络通信来剖析私有协议,或了解应用如何与远程服务器交互。
- 自动化测试:用
mitmdump脚本模拟特定网络状况、模拟 API 响应,或对应用行为执行自动检查。
mitmproxy 与其他代理工具对比
虽然多款工具都提供 HTTP/S 拦截能力,但 mitmproxy 凭借开源属性、强大的脚本能力和灵活的界面脱颖而出。
| 功能 | mitmproxy | Burp Suite Community Edition | Fiddler(Windows) |
|---|---|---|---|
| 许可证 | 开源(MIT) | 专有(免费/付费版本) | 专有(免费/付费版本) |
| 脚本能力 | Python API(mitmdump) |
有限(通过 Java/Python/Ruby 扩展) | FiddlerScript(JScript.NET)、.NET 扩展 |
| 界面 | 控制台(mitmproxy)、Web UI(mitmweb) |
桌面 GUI | 桌面 GUI |
| SSL/TLS | 完整拦截 | 完整拦截 | 完整拦截 |
| 流量修改 | 支持 | 支持 | 支持 |
| 重放 | 支持(客户端/服务器) | 支持(Repeater) | 支持(Composer) |
| 透明代理 | 支持 | 支持 | 支持 |
| 目标用户 | 开发者、安全研究人员、自动化 | 渗透测试人员、Web 应用安全 | 开发者、测试人员、Web 应用安全 |
| 平台 | 跨平台(Linux、macOS、Windows) | 跨平台(基于 Java) | Windows、macOS(通过 Fiddler Everywhere) |
这一对比凸显了 mitmproxy 在自动化和开源灵活性方面的优势,使其成为需要深度掌控流量分析流程的技术用户的可靠之选。
