從 Huli 這篇 人人都需要一個 HTTP proxy 來 debug 學到好用工具 - mitmproxy,頗有相見恨晚之感,特撰文分享。

在我多年射茶包的經驗中,瀏覽網頁出現疑難雜症,用 Chrome 或 Edge 的 F12 偵錯工具已幾可解決大半;但若為應用程式呼叫 WebAPI、網頁爬蟲工具,或是 Windows 整合驗證 (Kerberos/NTLM) 方面問題,就得靠 HTTP Proxy 類型偵錯工具上場救援。

HTTP Proxy 偵錯的原理是由工具軟體扮演網站代理伺理器,設定瀏覽器或應用程式將所有 HTTP/HTTPS 請求交給它轉發並允許偵錯工具攔截內容,達到分析傳輸資料甚至修改內容的目的。這類工具很早之前就有了,我過去主要是用 Fiddler,一劍在手,大小問題迎刃而解。例如:觀察整合式驗證先兩次 401 再 200 的過程查 IE 爆慢 Chrome 正常的怪事WebClient.UploadString() 第二送 Header 會變的鬼問題... 更多)。而 Fiddler HTTP Proxy 及可修改 Request 及回應的特性,也被我拿來偵錯 Mac Safari偷改網頁內容方便測試,搞過一些花式應用。對如何善用 HTTP Proxy 偵錯工具解決問題,我也算小有心得。

Fiddler 的歷史悠久,最早是 2003 年微軟 IE 研發經理 Eric Lawrence 的個人 Side Project,其後被 Telerik 收購,歷經二十多年改版演化(我也用了快 20 年),目前分為 Fiddler Classic (免費版) 及 Fiddler Everywhere (商業版)。依官方說法 Fiddler Classic 將不再積極開發,也不提供修補更新或技術技援 (Fiddler Classic is not in active development and offers no commitments for releases, patches or tech support.),即使今年 3 月仍有更新,但長遠來看,免費 HTTP Proxy 偵錯工具這個位置遲早要找到接班人。

Burp Suite 在資安領域名聲響亮,免費版 Community Edition 允許個人學習、研究或及企業內部商業使用(Internal Business Purpose,包含「以商業顧問身份為客戶提供客製化諮詢服務」),但拿掉了儲存功能及自動化測試 參考,要付費版 Professional Edition 才能火力全開。

相形之下,採用 MIT License 的 mitmproxy,100% 符合免費可商用的條件。即便風格偏向 CLI,對一般人來說不如 Burp Suite 的純 GUI 友善,但軟體攻城獅可不是一般人,像我就覺得敲指令比滑滑鼠更有 Fu。至於若要大量檢視比對內容的場合,mitmproxy 也有 mitmweb 提供網頁操作介面。

而 mitmproxy 開源專案非常活躍,去年 11 月推出 11.0 版,中間歷經 5 次小改版,4 月底就又推出 12.0,不用擔心跟不上 HTTP/2、TLS 規格演進。另外,mitmproxy 也逐步改用 Rust 開發 Contentview、Syntax highlighting 等模組,讓人對其效能及可靠性充滿期待。(延伸閱讀:YT 筆記 - Rust 程式語言在 JavaScript 生態圈的角色)。

總之,我是愈看愈滿意,小試了一下,果真好用。

我的主力平台是 Windows,這篇會以在 Winodws 環境使用為主。除了下載執行 Windows Installer,也可以用 Chocolatey 安裝:(延伸閱讀:指令式軟體安裝服務比較:Chocolatey、Scoop 與 winget](/blog/chocolatey-scoop-winget/)、我的 Windows 新裝機 Chocolatey 安裝清單)
註:mitmproxy 也支援用 Docker 執行,若要偵查手機 App 傳輸,用 Docker 架設更方便

mitmproxy 主要有四種運作模式:參考

  • HTTP/HTTPS Proxy
    在 OS 或程式指定 Proxy (預設:http://localhost:8080) 改透過 mitmproxy 存取網站,這是最傳統做法。缺點是要設定 Proxy,不同應用程式的設定方式不盡相同。
  • Local Capture
    從 OS 層攔截 HTTP/HTTPS 傳輸,不用設 Proxy,甚至可以指定只攔截特定程序,是我覺得最方便的做法。
  • WireGuard
    mitmproxy 會扮演一台 WireGuard VPN Server,客戶端安裝執行 WireGuard VPN Client,之後所有流量會經過 mitmproxy,App 與 API 間的互動不再是祕密。
  • Reverse Proxy
    擔任指定網站的 Reverse Proxy,從中攔截傳輸內容

安裝好第一次使用前需先安裝 mitmproxy 的中間人 CA 根憑證,憑證會安裝後動態產生,每台機器不同,以降低被惡意使用的風險。安裝方法是開 CMD 跑 mitmproxy --mode local (建議將 C:\Program Files\mitmproxy\bin\ 加入 PATH) 後開瀏覽器連上 http://mitm.it/,依說明安裝。

【資安提醒】安裝並信任 CA 憑證代表特定軟體可以檢視 HTTPS 加密傳輸內容,此一動作影響重大,請確認憑證來源可靠並知道背後可能的風險再繼續。

接著來幾個簡單練習。

  1. 攔截對特定網站的存取
    mitmproxy --mode local --allow-hosts ip-api.com
    
    啟動後分別用 curl 及 PowerShell 存取 curl http://ip-api.com/json/8.8.8.8,可觀察到兩次 GET 存取:

    打開每一筆 GET 可檢視 Request/Response 詳細內容
  2. HTTPS 憑證信任問題
    在 Windows 信任 mitmproxy 的自訂 CA 根憑證,Windows 體系的應用程式便會自動信任 mitmproxy ,但如 curl、Java 則需另外信任憑證。 設定方式可參考官方說明
    測試 curl 時遇到一個眉角,一般來說使用 curl --cacert C:\Users\<userName>\.mitmproxy\mitmproxy-ca-cert.pem https://www.github.com 即可讓 curl 信任 mitmproxy,但 Windows 內建的 curl 使用 Schannel 處理 TLS 而非 openssl,若已在 Windows 信任過 mitmproxy CA 憑證,便不需特別指定。但實測會遇到 CertGetCertificateChain trust error CERT_TRUST_REVOCATION_STATUS_UNKNOWN 錯誤,究其原理是 Schannel 會要求檢查憑證撤銷資訊,mitmproxy 預設不支援。解法有二:1) curl 加上 --ssl-no-revoke 參數、2) 為 mitmproxy 設定憑證撤銷檢查。參考
  3. 攔截特定程序的 HTTP/HTTPS 傳輸
    mitmproxy --mode local:curl
    
    用以上指令,只會攔截 curl 程式的傳輸,如下圖所示,我分別試了 curl、PowerShell 及瀏覽器連網站,只有 curl 的請求被捕追到,瀏覽器檢視憑證也是未更換狀態,代表 mitmproxy 未插手。

    另外執行 mitmproxy --mode local:chrome 對照,HTTPS 傳輸若經過 mitmproxy 時,憑證的發行者將變成 mitmproxy。
  4. 若你想用 GUI 介面檢視傳輸內容,將以上操作中的 mitmproxy 換成 mitmweb 即可,例如:mitmweb --mode local:chrome
  5. 依理來說,Local Capture 模式可以捕捉連到 localhost/127.0.0.1 的流量,但我在 Windows 上實測不成功,替代方案是跑 mitmweb --mode reverse:http://locahost:80,之後連上 http://localhost:8080 會被導向本機 80 Port,過程也將被側錄。
    剛好利用這些機會玩玩 Reverse Proxy 模式,小試 Windows 整合登入 IIS,成功抓到經典的兩個前置 401:

以上差不多已涵蓋日常 HTTP/HTTPS 偵錯的基本技巧,熟悉後便足以提著 mitmproxy 上場挑戰疑難雜症。至於 mitmproxy 更強大的程式化資料分析及修改功能,未來會再專門做一集跟大家講解。(老高上身)

【2025-05-05 補充】

mitmproxy Windows 版依賴開源程式套件 WinDivert, Windows Packet Divert 補捉封包,該元件被廣泛應用於 Windows 平台的網路分析偵錯及資安工具,但由於功能強大能被拿來做壞事,故被少數防毒或資安軟體視為惡意程式,在 VirusTotal 分析報告中,72 項檢測中有 4 項將其判定有害:

上述結果可能導致實務使用時觸發防毒或資安告警。我的解讀是工具本身是中性的,可以救人也可以拿來害人,無奈「可能作惡就禁用」是常見的資安策略,只能習慣...

Learn how mitmproxy, a free and open-source HTTP proxy tool, aids debugging by intercepting HTTP/HTTPS traffic, offering CLI and web interfaces for detailed analysis. Ideal for developers preferring command-line operations over GUI.


Comments

Be the first to post a comment

Post a comment