Android 抓包,監控流量工具之 mitmproxy


轉:http://greenrobot.me/devpost/how-to-debug-android-http-get-started/

mitmproxy實踐教程之調試 Android 上 HTTP流量

之前寫了一篇博客介紹了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進行設置:

    注意,此處的[YOUR_DOWNLOAD_PATH]為你下載mitmproxy二進制文件解壓后所對應的目錄,就我而言的目錄就是:~/Downloads/osx-mitmproxy-0.11.3 .  其中ip設置為iMac的ip,端口則按照你的個人喜好來。
    初始界面如下:

     

    mitmproxy初始運行界面
    mitmproxy初始運行界面

    輸入“?”便可查看幫助界面(輸入“q”回到正常界面):

    mitmproxy幫助界面
    mitmproxy幫助界面
  3. 在Android上設置代理。按照之前的步驟將Android所連接的wifi代理ip設置為:192.168.0.1,端口設置為:9527 。現在Android已經連上代理,iMac端便開始展示它所抓取到的包了(我在刷微博:)):
    mitmproxy抓包顯示
    mitmproxy抓包顯示

     

mitmproxy常見操作

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

清除抓包結果

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

查看抓包

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

mitmproxy詳細信息
mitmproxy抓包的Request詳細信息

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

mitmproxy抓去response信息
mitmproxy抓去response信息

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

mitmproxy 展示模式
mitmproxy 展示模式

mitmproxy修改抓包

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

mitmproxy編輯request
mitmproxy編輯request

我從mitmproxy給出的提示中選擇了“method”,也就是編輯當前包的http方法,於是mitmproxy便給出了常見的方法:屏幕快照 2015-01-27 下午2.20.09在這些方法中,我要選擇“trace”,便輸入高亮的字母“t”即可,最后原來“Request”里面的方法就變成了TRACE了:

mitmproxy 修改request method
mitmproxy 修改request method

 

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

mitmproxy 抓包replay效果
mitmproxy 抓包replay效果

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

mitmproxy攔截

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

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

mitmproxy 攔截
mitmproxy 攔截

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

mitmproxy條件過濾效果
mitmproxy條件攔截效果

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

mitmproxy 攔截 選擇數據包
mitmproxy 攔截 選擇數據包

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

mitmproxy 編輯攔截包的頭部
mitmproxy 編輯攔截包的頭部

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

mitmproxy 攔截header添加鍵值對
mitmproxy 攔截header添加鍵值對

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

mitmproxy 攔截response
mitmproxy 攔截response

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

mitmproxy 攔截response之后accept
mitmproxy 攔截response之后accept

 

更多類型的mitmproxy攔截

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

mitmproxy 攔截特定的request 方法
mitmproxy 攔截特定的request 方法

攔截所有的request: ~q

攔截特定的header: ~h

攔截特定的domain: ~d

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

其他還有很多類型,請參看mitmproxy官方文檔

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM