使用
-p |
mitmproxy -p 8001 |
在端口 8001 上啟動代理 |
-m |
mitmproxy -p 8001 -m reverse:http://127.0.0.1:4000 |
8001 端口反向代理到4000端口 |
-w |
mitmproxy -p 8001 -w traffic.mitm |
流到達時流向文件 |
-r |
mitmproxy -r traffic.mitm |
從文件中讀取流 |
-C |
mitmproxy -C traffic.mitm |
從保存的文件重放客戶端請求 |
-S |
mitmproxy -S traffic.mitm |
從保存的文件重放服務器響應 |
-s |
mitmproxy -s myScript.py |
執行腳本 |
-h |
mitmproxy -h |
mitmproxy 快速幫助 |
移動
k Ctrl b
▲ ▲▲
│ ││
h ? ─── + ─── ? l ││ page
│ ││
▼ ▼▼
j Ctrl f / Space
h, j, k ,l |
左、下、上、右 |
Ctrl b |
向上翻頁 |
Space / Ctrl f |
向下翻頁 |
g / G |
轉到開頭/結尾 |
Arrows |
上下左右 |
安裝
- mitmproxy 文檔 (mitmproxy.org)
- mitmproxy 開源倉庫 (github.com)
$ brew install mitmproxy # macOS
代理模式
-R REVERSE_PROXY, --reverse REVERSE_PROXY |
將所有請求轉發到上游 HTTP 服務器:http[s]://host[:port]。客戶端始終可以通過 HTTPS 和 HTTP 進行連接,與服務器的連接由指定的方案決定 |
--socks |
設置 SOCKS5 代理模式 |
-T, --transparent |
設置透明代理模式 |
-U UPSTREAM_PROXY, --upstream UPSTREAM_PROXY |
將所有請求轉發到上游代理服務器:http://host[:port] |
流(視圖)
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 |
設置視圖過濾器 (在流視圖頁面上) |
- RegEX 備忘清單 (jaywcjlove.github.io)
正則表達式是 Python/ target=_blank class=infotextkey>Python 風格的,可以指定為帶引號的字符串
運算符
! |
一元非 |
& |
和 |
| |
或者 |
(...) |
分組 |
表達式
~a |
響應匹配資源:css、JAVAscript、Flash、圖像。 |
~b regex |
主體 Body |
~bq regex |
請求正文 |
~bs regex |
響應體 |
~c int |
HTTP 響應代碼 |
~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 標頭
mitmproxy 文檔 mitmproxy.org