| Option | Example | Description |
|---|---|---|
-p |
mitmproxy -p 8001 | Start proxy on port 8001 |
-m |
mitmproxy -p 8001 -m reverse:http://127.0.0.1:4000 | Reverse proxy on port 8001 to port 4000 |
-w |
mitmproxy -p 8001 -w traffic.mitm | Stream flows to file as they arrive |
-r |
mitmproxy -r traffic.mitm | Read flows from file |
-C |
mitmproxy -C traffic.mitm | Replay client requests from a saved file |
-S |
mitmproxy -S traffic.mitm | Replay server responses from a saved file |
-s |
mitmproxy -s myScript.py | Execute a script |
-h |
mitmproxy -h | mitmproxy quick help |
k Ctrl b
▲ ▲▲
│ ││
h ◀ ─── + ─── ▶ l ││ page
│ ││
▼ ▼▼
j Ctrl f / Space
| - | - |
|---|---|
h, j, k ,l |
Left, Down, Up, Right |
Ctrl b |
Page up |
Space / Ctrl f |
Page down |
g / G |
Go to beginning / end |
Arrows |
Up, Down, Left, Right |
| 按键 | 功能说明 |
|---|---|
h, j, k ,l |
左、下、上、右方向移动 |
Ctrl b |
向上翻页 (Page up) |
Space / Ctrl f |
向下翻页 (Page down) |
g / G |
跳转至顶部开头 / 底部末尾 |
Arrows 键盘方向键 |
上、下、左、右移动 |
命令语法格式 (Syntax):
:export.clip format flow
示例用法 (Examples):
| 功能描述 | 命令示例 |
|---|---|
| 1. 导出为 cURL 命令行格式 | :export.clip curl @focus |
| 2. 导出为 HTTPie 命令格式 | :export.clip httpie @focus |
| 2. 导出为原始文本 Raw | :export.clip raw @focus |
| 2. 导出为原始 HTTP 请求包 | :export.clip raw_request @focus |
| 2. 导出为原始 HTTP 响应包 | :export.clip raw_response @focus |
将指定的数据流格式化导出至系统剪贴板中。
命令语法格式 (Syntax):
:export.file format flow path
示例用法 (Examples):
| 功能描述 | 命令示例 |
|---|---|
| 1. 导出为 /tmp/a.curl 文件 | :export.file curl @focus /tmp/a.curl |
| 2. 导出为 /tmp/a.httpie 文件 | :export.file httpie @focus /tmp/a.httpie |
| 2. 导出为 /tmp/a.raw 文件 | :export.file raw @focus /tmp/a.raw |
| 2. 导出为 /tmp/a.request 文件 | :export.file raw_request @focus /tmp/a.request |
| 2. 导出为 /tmp/a.response 文件 | :export.file raw_response @focus /tmp/a.response |
将指定的数据流格式化导出并保存至文件。
| 按键 | 功能说明 |
|---|---|
q |
返回 / 退出当前视图 |
z |
清空数据流列表 (Clear) |
: |
进入底栏命令输入框 |
E |
查看事件日志 (Event log) |
O |
查看配置选项 (Options) |
r |
重新发送重放当前数据流 |
Tab |
切换至下一项 |
Enter |
确认选择当前项 |
| 按键 | 功能说明 |
|---|---|
- |
循环切换下一个界面布局 |
? |
查看按键帮助选项 |
B |
启动已连接的浏览器实例 |
C |
查看可用命令列表 |
I |
开启/关闭请求拦截 |
K |
查看快捷键绑定列表 |
P |
查看当前数据流详细属性 |
Q |
立即强制退出程序 |
W |
实时流式保存写入文件 |
i |
设置拦截表达式条件 |
Ctrl right |
聚焦至下一个布局分屏 |
Shift tab |
聚焦至下一个布局分屏 |
| 按键 | 功能说明 |
|---|---|
A |
放行并恢复所有被拦截的数据流 |
D |
复制一份当前数据流 |
F |
设置自动跟进聚焦最新数据流 |
L |
从文件加载历史数据流 |
M |
开关只显示打标记的数据流 |
S |
启动服务端重放模拟 |
U |
取消所有数据流上的标记 |
V |
撤销对当前数据流的修改 |
X |
强制中断结束该数据流 |
Z |
清除所有未被筛选出的数据流 |
a |
放行恢复该条被拦截的数据流 |
b |
将响应体 (Response body) 保存至文件 |
d |
从视图列表中删除该数据流 |
e |
导出该数据流至指定文件 |
f |
设置视图筛选匹配过滤器 |
m |
为该数据流打上/取消标记 |
n |
伪造新建一条数据流 |
o |
设置数据流列表的排序规则 |
r |
重新发送/重放该数据流 |
v |
翻转反向数据流列表排序 |
w |
保存列表中的数据流至文件 |
| |
对该数据流执行 Python 脚本 |
Ctrl l |
复制选择切片至剪贴板 |
| 按键 | 功能说明 |
|---|---|
f |
在数据流视图页面中设置筛选过滤器 |
匹配正则表达式采用 Python 语法风格,可以写为带引号括起来的文本字符串
| 运算符 | 运算符含义 |
|---|---|
! |
逻辑非 (NOT) |
& |
逻辑与 (AND) |
| |
逻辑或 (OR) |
(...) |
逻辑分组括号 |
| 语法标识 | 功能与匹配内容说明 |
|---|---|
~a |
匹配静态资源响应:CSS, JS, Flash, 图像图片等 |
~b regex |
匹配请求或响应的主体 Body 内容 |
~bq regex |
匹配请求主体 (Request body) 内容 |
~bs regex |
匹配响应主体 (Response body) 内容 |
~c int |
匹配 HTTP 响应状态码 (HTTP response code) |
~d regex |
匹配域名 (Domain) |
~dst regex |
匹配目标请求地址 (Destination address) |
~e |
匹配报错数据流 (Error) |
~h regex |
匹配 请求/响应 报头 Header 内容 |
~hq regex |
匹配请求报头 (Request header) 内容 |
~hs regex |
匹配响应报头 (Response header) 内容 |
~http |
匹配 HTTP 数据流 |
~m regex |
匹配 HTTP 请求方法 (Method) |
~marked |
匹配被打上标记的数据流 |
~q |
匹配有请求但尚无响应的数据流 |
~s |
匹配包含响应的数据流 |
~src regex |
匹配源请求客户端地址 (Source address) |
~t regex |
匹配 Content-Type 报头内容 |
~tcp |
匹配 TCP 原始数据流 |
~tq regex |
匹配请求的 Content-Type 报头 |
~ts regex |
匹配响应的 Content-Type 报头 |
~u regex |
匹配完整 URL 链接地址 |
~websocket |
匹配 WebSocket 数据流(及 HTTP-WebSocket 握手数据包) |
表达式示例 (Expressions)
| 选择器名称 | 作用范围与说明 |
|---|---|
@all |
所有的抓包数据流 |
@focus |
当前处于光标聚焦状态的数据流 |
@shown |
界面上当前被筛选显示的数据流 |
@hidden |
界面上当前被隐藏掩盖的数据流 |
@marked |
所有被打上标记的数据流 |
@unmarked |
所有未打标记的数据流 |
mitmproxy 提供了一套非常便捷的选择器,用于对当前界面视图进行快捷批量操作
匹配 URL 中包含 "google.com" 的请求:
google\.com
匹配请求主体 Body 中包含 "test" 字符串的请求:
~q ~b test
匹配除了 text/html 类型的请求以外的所有数据流:
!(~q & ~t "text/html")
替换请求中完整的 GET 字符串(必须带引号):
":~q ~m GET:.*:/replacement.html"
from mitmproxy import http
def request(flow: http.HTTPFlow) -> None:
if flow.request.pretty_url == "http://example.com/path":
flow.response = http.HTTPResponse.make(
200, # (可选) HTTP 状态码
b"Hello World", # (可选) 返回正文内容
{"Content-Type": "text/html"} # (可选) 请求头
)
在代理层直接返回伪造的响应,无需将数据包发送至远端服务器
class AddHeader:
def __init__(self):
self.num = 0
def response(self, flow):
self.num = self.num + 1
flow.response.headers["count"] = str(self.num)
addons = [
AddHeader()
]
为每一个返回的 HTTP 响应头中注入自定义计数器报头