Mitmproxy 备忘清单

Mitmproxy 是一个免费开源的交互式 HTTPS 代理。这是 mitmproxy 的快速参考备忘单。

入门

使用

选项范例描述
-pmitmproxy -p 8001在端口 8001 上启动代理
-mmitmproxy -p 8001 -m reverse:http://127.0.0.1:40008001 端口反向代理到4000端口
-wmitmproxy -p 8001 -w traffic.mitm流到达时流向文件
-rmitmproxy -r traffic.mitm从文件中读取流
-Cmitmproxy -C traffic.mitm从保存的文件重放客户端请求
-Smitmproxy -S traffic.mitm从保存的文件重放服务器响应
-smitmproxy -s myScript.py执行脚本
-hmitmproxy -hmitmproxy 快速帮助

移动

        k                 Ctrl b
        ▲                   ▲▲
        │                   ││
h ◀ ─── + ─── ▶ l           ││ page
        │                   ││
        ▼                   ▼▼
        j             Ctrl f / Space 

:------
h, j, k ,l左、下、上、右
Ctrl b向上翻页
Space / Ctrl f向下翻页
g / G转到开头/结尾
Arrows上下左右

安装


$ brew install mitmproxy # macOS

代理模式

ArgumentEffect
-R REVERSE_PROXY, --reverse REVERSE_PROXY将所有请求转发到上游 HTTP 服务器:http[s]://host[:port]。客户端始终可以通过 HTTPSHTTP 进行连接,与服务器的连接由指定的方案决定
--socks设置 SOCKS5 代理模式
-T, --transparent设置透明代理模式
-U UPSTREAM_PROXY, --upstream UPSTREAM_PROXY将所有请求转发到上游代理服务器:http://host[:port]

复制到剪贴板

命令语法:

:export.clip format flow

例子:

描述命令示例
1. 复制为 curl 命令:export.clip curl @focus
2. 复制为 httpie:export.clip httpie @focus
3. 复制为原始文件:export.clip raw @focus
4. 复制为原始 HTTP 请求:export.clip raw_request @focus
5. 复制为原始 HTTP 响应:export.clip raw_response @focus

将流程导出到系统剪贴板

保存到文件

命令语法:

:export.file format flow path

例子:

描述命令示例
1. 导出到 /tmp/a.curl:export.file curl @focus /tmp/a.curl
2. 导出到 /tmp/a.httpie:export.file httpie @focus /tmp/a.httpie
3. 导出到 /tmp/a.raw:export.file raw @focus /tmp/a.raw
4. 导出到 /tmp/a.request:export.file raw_request @focus /tmp/a.request
5. 导出到 /tmp/a.response:export.file raw_response @focus /tmp/a.response

将流程导出到系统剪贴板

流(视图)

:------
A恢复所有拦截的流
D重复流
F设置焦点跟随
L从文件加载流
M切换查看标记流
S开始服务器回放
U取消设置所有标记
V还原对此流的更改
X杀死这个流
Z清除所有未显示的流
a恢复此拦截流
b将响应主体保存到文件
d从视图中删除流
e将此流导出到文件
f设置视图过滤器
m在此流程上切换标记
n创建新流程
o设置流列表顺序
r重播此流程
v反向流列表顺序
w将列出的流程保存到文件
|在此流上运行脚本
Ctrl l将剪辑发送到剪贴板

常见的快捷键

:------
q返回/退出
z清除流列表
:命令提示符
E查看事件日志
O查看选项
r重播此流程
Tab下一个
Enter选择

全局键绑定

:------
-循环到下一个布局
?查看帮助
B启动附加的浏览器
C查看命令
I切换拦截
K查看按键绑定
P查看流程详细信息
Q立即退出
W流式传输到文件
i设置拦截
Ctrl right聚焦下一个布局窗格
Shift tab聚焦下一个布局窗格

代理选项

:------
-b ADDR, --bind-address ADDR将代理绑定到的地址(默认为所有接口)
-I HOST, --ignore HOST忽略主机并转发所有流量而不对其进行处理。在透明模式下,建议使用 IP 地址(范围),而不是主机名。在常规模式下,仅忽略 SSL 流量并应使用主机名。提供的值被解释为正则表达式并匹配 ip 或主机名。可以多次通过
--tcp HOST与模式匹配的所有主机的通用 TCP SSL 代理模式。类似于 --ignore,但 SSL 连接被拦截。通信内容以详细模式打印到日志中
-n, --no-server不要启动代理服务器。用于离线分析以前捕获的流
-p PORT, --port PORT代理服务端口。默认值:8080
--http2, --no-http2显式启用/禁用 HTTP/2 支持。默认情况下禁用,直到主要网站正确实施规范。默认值将在未来版本中更改
--no-websocket, --websocket显式启用/禁用 WebSocket 支持。默认启用
--raw-tcp, --no-raw-tcp显式启用/禁用实验性原始 TCP 支持。默认情况下禁用。默认值将在未来版本中更改
--spoof-source-address使用客户端的 IP 进行服务器端连接。与 –upstream-bind-address 结合使用以欺骗固定源地址
--upstream-bind-address UPSTREAM_BIND_ADDRESS将上游请求绑定到的地址(默认为无)

Mitmproxy 过滤器

过滤器

:------
f设置视图过滤器 (在流视图页面上)

正则表达式是 Python 风格的,可以指定为带引号的字符串

运算符

:------
!一元非
&
|或者
(...)分组

表达式

:------
~a响应匹配资源:CSS、Javascript、Flash、图像。
~b regex主体 Body
~bq regex请求正文
~bs regex响应体
~c intHTTP 响应代码
~d regex
~dst regex匹配目标地址
~e匹配错误
~h regex标头
~hq regex请求头
~hs regex响应头
~http匹配 HTTP 流
~m regex方法
~marked匹配标记流
~q匹配请求无响应
~s匹配响应
~src regex匹配源地址
~t regex内容类型标头
~tcp匹配 TCP 流
~tq regex请求 Content-Type 标头
~ts regex响应内容类型标头
~u regex网址
~websocket匹配 WebSocket 流(和 HTTP-WebSocket 握手流)

流选择器

表达式

:------
@all所有流程
@focus目前关注的流程
@shown当前显示的所有流程
@hidden当前隐藏的所有流程
@marked所有标记流
@unmarked所有未标记的流

mitmproxy 有一组方便的流选择器,可以在当前视图上操作

示例

包含“google.com”的网址

google\.com

正文中包含字符串“test”的请求

~q ~b test

除了带有 text/html 内容类型的请求之外的任何内容:

!(~q & ~t "text/html")

替换请求中的整个 GET 字符串(需要引号才能使其工作):

":~q ~m GET:.*:/replacement.html"

Mitmproxy 脚本

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,  # (optional) status code
            b"Hello World",  # (optional) content
            {"Content-Type": "text/html"}  # (optional) headers
        )

从代理发送回复而不向远程服务器发送任何数据

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 标头

另见