首頁 > 軟體

移動測試開發Mitmproxy用於測試抓包神器詳解

2022-06-21 14:08:44

1.前言

在移動商業廣告的測試的工作中,經常會需要對廣告請求進行捕獲和分析,常使用的有兩個測試工具:fiddler,Charles,這兩個工具都可以對廣告請求進行抓包,斷點偵錯,請求替換,構造請求等,但是這兩個工具都有一定的侷限性。首先,fiddler 只能在 windows 上執行,charles 雖然可以在 mac,windows 上執行,但是收費。其次,在商業廣告請求中經常會對介面協定進行加密處理,使用 fiddler 和 charles 就不容易解決了。最後,商業廣告測試中需要對廣告請求協定的各種欄位進行校驗,但業務涉及到多欄位修改的情況下,再利用 fiddler 和 charles 逐一校驗判斷顯然很浪費時間。經過調研和實際應用,我們發現 mitmproxy 這個工具非常靈活,它是基於 Python 開發的開源工具,提供了 Python API,可以通過載入自定義 python 指令碼輕鬆控制請求和響應。這是其它工具所不能做到的,通過自定義指令碼進行二次開發,能夠解決商業廣告測試過程中所遇到的問題。

2.Mitmproxy 簡介

MITM(Man In The Middle Attack)中間人攻擊,這種攻擊模式是通過各種技術手段將受入侵者控制的一臺計算機虛擬放置在網路連線中的兩臺通訊計算機之間,這臺計算機就稱為 “中間人”。mitmproxy 就是用於 MITM 的 proxy,用於中間人攻擊的代理。首先會向正常的代理一樣轉發請求,保障伺服器端與使用者端的通訊,其次,會適時的查、記錄其截獲的資料,或篡改資料,引發伺服器端或使用者端特定的行為。

mitmproxy 有兩個關聯元件。一個是 mitmdump,它是 mitmproxy 的命令列介面,利用它我們可以對接 Python 指令碼,用 Python 實現監聽後的處理邏輯。另一個是 mitmweb,它是一個 Web 程式,通過它我們可以清楚觀察 mitmproxy 捕獲的請求。

3.Mitmproxy 工作原理

mitmproxy 有 5 種代理模式,主要包含:正向代理,透明代理,反向代理,上游代理,socks 代理,在實際使用中經常用到正向代理,mitmproxy 作為正向代理是一個位於使用者端和原始伺服器 (origin server) 之間的伺服器,為了從原始伺服器取得內容,使用者端向 mitmproxy 代理傳送一個請求並指定目標 (原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容返回給使用者端。使用者端必須要進行一些特別的設定才能使用正向代理。

我們以 HTTPS 請求為例介紹一下 mitmproxy 作為正向代理抓包的過程:

①. 使用者端連線到 mitmproxy,並行出 HTTP 連線請求。

②. mitmproxy 響應建立了一個 200 的連線

③. 使用者端認為它正在與遠端伺服器通訊,並啟動 SSL 連線。使用 SNI 來指定它連線到的主機名。

④. mitmproxy 使用使用者端指定的 SNI 主機名與伺服器端建立一個 SSL/TLS 連線。

⑤. 伺服器使用匹配的證書進行響應,該證書包含生成攔截證書所需的 CN 和 SAN 值。

⑥. mitmproxy 生成攔截證書,並繼續跟使用者端 SSL/TLS 握手。

⑦. 使用者端通過已建立的 SSL/TLS 連線傳送請求。

⑧. mitmproxy 通過步驟 ④ 中啟動的 SSL/TLS 連線將請求傳遞到伺服器。

4.實踐應用

解決多欄位校驗效率問題:

商業廣告測試中有大量的重複性工作在打點校驗上,為了節省測試時間和解決易漏測的問題,我們可以利用 mitmproxy 二次開發,自定義業務相關的校驗規則,然後通過捕獲請求對協定中的各個欄位進行自動化校驗,這樣既可以提高測試效率,又避免了漏測問題。

以所測廣告業務為例,首先建立 addons.py 檔案,addons 是個列表,每個元素是一個類範例,這些類,稱為一個個 addon,這些類有若干方法,這些方法實現了某些 mitmproxy 提供的事件,mitmproxy 會在某個事件發生時呼叫對應的方法。如下圖所示為 addons 檔案內容,其中 SemiNativeCSJAd 則為 addon。

SemiNativeCSJAd 類中實現了 mitmproxy 提供的 request 和 response 事件,當觸發該事件的時候,就會呼叫對應的方法。

其中將所有型別的廣告打點中的公共欄位校驗抽取成公共方法 semiNativeCSJfieldCheck 呼叫。如下圖所示:

通過以上方式,簡單且有效的解決了多個欄位校驗問題。

解決商業廣告中加解密問題:

商業廣告有不同的渲染形態,例如:激勵視訊類,模板類,在實際測試過程中,需要測試人員 mock 不同的廣告進行測試,不僅如此,還會遇到需要對廣告進行加解密的情況,那麼具體應該怎麼解決呢?以所測的廣告業務為例需要做以下幾個步驟:

①. mitmproxy 攔截使用者端發起的請求並獲取某欄位

②. 利用 RSA 演演算法根據請求的某欄位解密獲取到祕鑰

③. 利用 AES 演演算法和 ② 步驟的祕鑰,對本地廣告內容進行加密

④. mitmproxy 將加密的廣告返回給使用者端

如下圖是實現的程式碼,此 mockMaxFile 函數還可以根據入參傳入不同廣告檔案即可實現不同廣告的 mock。

5.總結

以上就是 mitmproxy 的簡單介紹和在商業廣告測試中的應用,相比傳統的抓包工具,mitmproxy 可以通過載入自定義 python 指令碼輕鬆實現各種客製化化需求,提升測試效率和質量,不愧為 “抓包神器”。

更多關於移動測試Mitmproxy抓包的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com