Mitmproxy 用於測試的“抓包神器”

語言: CN / TW / HK

點選“藍字”關注我們吧!

前言

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

Mitmproxy簡介

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

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

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連線將請求傳遞到伺服器。

實踐應用

解決多欄位校驗效率問題

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

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

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

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

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

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

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

①. mitmproxy攔截客戶端發起的請求並獲取某欄位

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

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

④. mitmproxy將加密的廣告返回給客戶端

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

總結

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