Mitmproxy 抓包与网络代理

精选 Mitmproxy 抓包与网络代理 常用指令与核心速查备忘单,涵盖高频用法、配置参数与实用技巧。

#入门指南

#用法 (Usage)

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

#Movement

        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 键盘方向键 上、下、左、右移动

#复制导出至剪贴板 (Copy to Clipboard)

命令语法格式 (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

将指定的数据流格式化导出至系统剪贴板中。

#保存写入至文件 (Save to File)

命令语法格式 (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

将指定的数据流格式化导出并保存至文件。

#常用快捷键 (Common Keybindings)

按键 功能说明
q 返回 / 退出当前视图
z 清空数据流列表 (Clear)
: 进入底栏命令输入框
E 查看事件日志 (Event log)
O 查看配置选项 (Options)
r 重新发送重放当前数据流
Tab 切换至下一项
Enter 确认选择当前项

#全局快捷键 (Global Keybindings)

按键 功能说明
- 循环切换下一个界面布局
? 查看按键帮助选项
B 启动已连接的浏览器实例
C 查看可用命令列表
I 开启/关闭请求拦截
K 查看快捷键绑定列表
P 查看当前数据流详细属性
Q 立即强制退出程序
W 实时流式保存写入文件
i 设置拦截表达式条件
Ctrl right 聚焦至下一个布局分屏
Shift tab 聚焦至下一个布局分屏

#数据流视图快捷键 (Flow View)

按键 功能说明
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 复制选择切片至剪贴板

#过滤表达式 (Mitmproxy Filter)

#视图过滤器 (Filter)

按键 功能说明
f 在数据流视图页面中设置筛选过滤器

  • [正则表达式备忘单 (/regex)](file:///d:/CodeXFolder/WarpNav/codex-workspace/warpnav-reference-qr/upstream/source/_posts/regex.md) (qr.warpnav.com)

匹配正则表达式采用 Python 语法风格,可以写为带引号括起来的文本字符串

#逻辑运算符 (Operators)

运算符 运算符含义
! 逻辑非 (NOT)
& 逻辑与 (AND)
| 逻辑或 (OR)
(...) 逻辑分组括号

#过滤表达式规则 (Expressions)

语法标识 功能与匹配内容说明
~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 握手数据包)

#目标数据流选择器 (Flow selectors)

表达式示例 (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"

#Python 拓展脚本 (Mitmproxy Scripts)

#自定义伪造响应 (Custom response)

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"}  # (可选) 请求头
        )

在代理层直接返回伪造的响应,无需将数据包发送至远端服务器

#动态添加 HTTP 报头 (Add header)

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 响应头中注入自定义计数器报头

#🔗 参考资源