如何使用mitmproxy除錯 Android 上 HTTP流量(入門實踐篇)

發表於2015-01-30

之前寫了一篇部落格介紹了mitmproxy,不過有些同學對這個工具到底該怎麼使用還是有點不清楚,於是自己花了一天時間把自己對這個工具的理解和使用過程進行了一番整理,形成了這篇文章。接下來我就以一些簡單的場景來說明mitmproxy的用法。

實踐環境

iMac一臺、華為B199(Android 4.4)手機一部,這兩者都連著同一個wifi。mitmproxy安裝版本為0.11.3。iMac的ip地址為:192.168.0.104

mitmproxy安裝與設定

  1. 下載mitmproxy。推薦下載二進位制安裝包(當前版本為0.11.3),因為使用pip安裝會由於牆的原因安裝失敗。下載成功之後解壓,便可直接點選名為“mitmproxy”的檔案了。
  2. 在iMac上執行和設定mitmproxy。由於直接點選執行是沒有設定mitmproxy引數的,所以我們需要在命令列裡面輸入mitmproxy進行設定:
  3. 注意,此處的[YOUR_DOWNLOAD_PATH]為你下載mitmproxy二進位制檔案解壓後所對應的目錄,就我而言的目錄就是:~/Downloads/osx-mitmproxy-0.11.3 .  其中ip設定為iMac的ip,埠則按照你的個人喜好來。
    初始介面如下:

    輸入“?”便可檢視幫助介面(輸入“q”回到正常介面):

  4. 在Android上設定代理。按照之前的步驟將Android所連線的wifi代理ip設定為:192.168.0.1,埠設定為:9527 。現在Android已經連上代理,iMac端便開始展示它所抓取到的包了(我在刷微博:)):

mitmproxy常見操作

mitmproxy的操作主要是通過命令列來解決的,很多操作和vi相同。一般說來,“q”代表返回。當mitmproxy回到抓包列表介面時,輸入“q”就代表退出mitmproxy了。

清除抓包結果

當你處於抓包列表介面時,覺得太多的資訊讓你十分惱火,直接輸入大寫字母C便可以清楚所有的抓包結果。

檢視抓包

在步驟3中我們可以看到一個黃色的指標,我們可以通過上下箭頭(或者使用 “j”/”k”來上下選擇)。直接回車便可以檢視指標所選定的包的詳細資訊:

此時,我們可以使用tab鍵在“Request”和“Response”之間切換。這是“Response”的詳細資訊(這是一個張圖片,所以下面亂碼了):

當我們發現“Response”的資訊比較亂的時候,我們可以選擇合適的形式來展示,這個時候我們只要輸入“m”便可以看到mitmproxy提供的不同展現形式,輸入對應高亮的字母便可以看到相應的結果(輸入“s”便可以以json形式展示):

mitmproxy修改抓包

如果這個時候我們需要編輯“Request”怎麼辦,很簡單,輸入字母“e”即可(注意圖片最下方出現的提示(Edit request (query,path,url,header,form,raw body,method)?:

我從mitmproxy給出的提示中選擇了“method”,也就是編輯當前包的http方法,於是mitmproxy便給出了常見的方法:

在這些方法中,我要選擇“trace”,便輸入高亮的字母“t”即可,最後原來“Request”裡面的方法就變成了TRACE了:

但是這個時候修改的request還沒有生效,因為現在mitmproxy所展示的抓包資訊只是記錄了Android和server端之間的通訊,因此我們現在編輯的抓包是已經傳輸過了,所以怎麼辦呢?很簡單,重新request一下,輸入字母“r”(代表“replay”)。這個時候我們就可以看到我們修改過的request得到的結果了:

此時我們輸入“q”便可以回到之前的抓包列表了。這些都是歷史抓包紀錄,能不能實時地抓包呢?當然可以,這就是下面要說的攔截(Intercept)了。

mitmproxy攔截

何為攔截?之前開篇就介紹過mitmproxy是一箇中間人代理工具,它位於客戶端和Server 端之間,它可以獲取客戶端的Request然後修改,傳送給Server 端;Server端得到Request之後在發出相應的Response又會被mitmproxy攔截,如果你想修改response,便可修改後再發給客戶端。注意:這與之前修改抓包資訊不同的是,前者的抓包已經傳送給了伺服器,而mitmproxy攔截則是獲取了抓包,還未傳送給伺服器。也就是說如果我攔截了我手機上所有的request,那麼我的手機將無法獲取來自伺服器的response。

那麼我們如果進行攔截,怎麼進行特定的攔截?輸入字母“i”(代表Intercept filter)即可,此時介面便會讓你輸入想要攔截的條件:

mitmproxy的條件攔截在預設情況下是過濾抓包的URL的。也就是說當你直接輸入要攔截的條件(比如輸入“weibo”),那麼接下來要出現抓包會將匹配的抓包整體變黃:

這些橘黃色的資料包都代表被攔截了,還未傳送給伺服器,這個時候你就可以對這些資料包進行修改,我們選擇一個資料包enter進入:

與之前的類似,輸入“e”,進行request編輯模式,然後輸入“h”代表要編輯request的頭部:

輸入enter便可對高亮的User-Agent的值進行修改,上圖的weibo版本之前是5.0的,被我改成了6.0 。我們還可以對header進行新增屬性,輸入“a”即可,然後使用tab分別鍵入key和value。這裡我新增了“test-test”鍵值對:

至此,我對攔截的request header已經修改完畢,現在要做的就是我要認可接受這個修改,然後發給伺服器。所以我們輸入“a”(代表“accept”)即可,等到伺服器響應後,注意,mitmproxy便又了攔截伺服器發過來的response(注意那個“Response intercepted”):

現在如果你想修改這個response也可以,方式同上面修改request一樣。這個時候我再輸入“a”,代表我接受了這個response,然後這個response便可發給客戶端了:

更多型別的mitmproxy攔截

同時mitmproxy還支援不同型別的條件過濾,之前在攔截字串前面加上特定的引數比如我要攔截所有的POST request怎麼辦?輸入:~m POST 即可(m代表method):

攔截所有的request: ~q

攔截特定的header: ~h

攔截特定的domain: ~d

攔截特定的響應程式碼(404之類的): ~c

其他還有很多型別,請參看mitmproxy官方文件

最後的幾句話

在使用的過程中,雖然是命令列操作,但是mitmproxy都會在視窗的右下方給出醒目的提示,而且這些快捷鍵雖然多,但是都有對應的意思,只要我們理解一下,還是很好上手的。這些天接觸了mitmproxy這個工具之後,發現用它來除錯Android上的HTTP流量有點屈才了,它本身還提供了一個可供使用者呼叫的庫——libmproxy來定製自己的工具,它還提供了改進版的tcpdump——mitmdump。這個小玩意還真的挺不錯的,也歡迎各位體驗過後一起來交流交流。

相關文章