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

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抓包的資料請關註WalkonNet其它相關文章!

推薦閱讀: