App爬蟲神器mitmproxy和mitmdump的使用

摘要?mitmproxy是一個支持HTTP和HTTPS的抓包程序,有類似Fiddler、Charles的功能,只不過它是一個控制臺的形式操作。 mitmproxy還有兩個關(guān)聯(lián)組件。一個是mitmdump,它是mitmproxy的命令行接口,利用它我們可以對接Python腳本,用Python實現(xiàn)監(jiān)聽后的處理。


mitmproxy是一個支持HTTP和HTTPS的抓包程序,有類似Fiddler、Charles的功能,只不過它是一個控制臺的形式操作。

mitmproxy還有兩個關(guān)聯(lián)組件。一個是mitmdump,它是mitmproxy的命令行接口,利用它我們可以對接Python腳本,用Python實現(xiàn)監(jiān)聽后的處理。另一個是mitmweb,它是一個Web程序,通過它我們可以清楚觀察mitmproxy捕獲的請求。

下面我們來了解它們的用法。

一、準(zhǔn)備工作

請確保已經(jīng)正確安裝好了mitmproxy,并且手機和PC處于同一個局域網(wǎng)下,同時配置好了mitmproxy的CA證書。

二、mitmproxy的功能

mitmproxy有如下幾項功能。

攔截HTTP和HTTPS請求和響應(yīng)。

保存HTTP會話并進(jìn)行分析。

模擬客戶端發(fā)起請求,模擬服務(wù)端返回響應(yīng)。

利用反向代理將流量轉(zhuǎn)發(fā)給指定的服務(wù)器。

支持Mac和Linux上的透明代理。

利用Python對HTTP請求和響應(yīng)進(jìn)行實時處理。

三、抓包原理

和Charles一樣,mitmproxy運行于自己的PC上,mitmproxy會在PC的8080端口運行,然后開啟一個代理服務(wù),這個服務(wù)實際上是一個HTTP/HTTPS的代理。

手機和PC在同一個局域網(wǎng)內(nèi),設(shè)置代理為mitmproxy的代理地址,這樣手機在訪問互聯(lián)網(wǎng)的時候流量數(shù)據(jù)包就會流經(jīng)mitmproxy,mitmproxy再去轉(zhuǎn)發(fā)這些數(shù)據(jù)包到真實的服務(wù)器,服務(wù)器返回數(shù)據(jù)包時再由mitmproxy轉(zhuǎn)發(fā)回手機,這樣mitmproxy就相當(dāng)于起了中間人的作用,抓取到所有Request和Response,另外這個過程還可以對接mitmdump,抓取到的Request和Response的具體內(nèi)容都可以直接用Python來處理,比如得到Response之后我們可以直接進(jìn)行解析,然后存入數(shù)據(jù)庫,這樣就完成了數(shù)據(jù)的解析和存儲過程。

四、設(shè)置代理

首先,我們需要運行mitmproxy,命令如下所示:

啟動mitmproxy的命令如下:

mitmproxy

之后會在8080端口上運行一個代理服務(wù),如下圖所示。

右下角會出現(xiàn)當(dāng)前正在監(jiān)聽的端口。

或者啟動mitmdump,它也會監(jiān)聽8080端口,命令如下所示:

mitmdump

運行結(jié)果如下圖所示。

將手機和PC連接在同一局域網(wǎng)下,設(shè)置代理為當(dāng)前代理。首先看看PC的當(dāng)前局域網(wǎng)IP。

Windows上的命令如下所示:

ipconfig

Linux和Mac上的命令如下所示:

ifconfig

輸出結(jié)果如下圖所示。

一般類似10.*.*.*或172.16.*.*或192.168.1.*這樣的IP就是當(dāng)前PC的局域網(wǎng)IP,例如此圖中PC的IP為192.168.1.28,手機代理設(shè)置類似如下圖所示。

這樣我們就配置好了mitmproxy的的代理。

五、mitmproxy的使用

確保mitmproxy正常運行,并且手機和PC處于同一個局域網(wǎng)內(nèi),設(shè)置了mitmproxy的代理,具體的配置方法可以參考官方文檔。

運行mitmproxy,命令如下所示:

mitmproxy

設(shè)置成功之后,我們只需要在手機瀏覽器上訪問任意的網(wǎng)頁或瀏覽任意的App即可。例如在手機上打開百度,mitmproxy頁面便會呈現(xiàn)出手機上的所有請求,如下圖所示。

這就相當(dāng)于之前我們在瀏覽器開發(fā)者工具監(jiān)聽到的瀏覽器請求,在這里我們借助于mitmproxy完成。Charles完全也可以做到。

這里是剛才手機打開百度頁面時的所有請求列表,左下角顯示的2/38代表一共發(fā)生了38個請求,當(dāng)前箭頭所指的是第二個請求。

每個請求開頭都有一個GET或POST,這是各個請求的請求方式。緊接的是請求的URL。第二行開頭的數(shù)字就是請求對應(yīng)的響應(yīng)狀態(tài)碼,后面是響應(yīng)內(nèi)容的類型,如text/html代表網(wǎng)頁文檔、image/gif代表圖片。再往后是響應(yīng)體的大小和響應(yīng)的時間。

當(dāng)前呈現(xiàn)了所有請求和響應(yīng)的概覽,我們可以通過這個頁面觀察到所有的請求。

如果想查看某個請求的詳情,我們可以敲擊回車,進(jìn)入請求的詳情頁面,如下圖所示。

可以看到Headers的詳細(xì)信息,如Host、Cookies、User-Agent等。

最上方是一個Request、Response、Detail的列表,當(dāng)前處在Request這個選項上。這時我們再點擊TAB鍵,即可查看這個請求對應(yīng)的響應(yīng)詳情,如下圖所示。

最上面是響應(yīng)頭的信息,下拉之后我們可以看到響應(yīng)體的信息。針對當(dāng)前請求,響應(yīng)體就是網(wǎng)頁的源代碼。

這時再敲擊TAB鍵,切換到最后一個選項卡Detail,即可看到當(dāng)前請求的詳細(xì)信息,如服務(wù)器的IP和端口、HTTP協(xié)議版本、客戶端的IP和端口等,如下圖所示。

mitmproxy還提供了命令行式的編輯功能,我們可以在此頁面中重新編輯請求。敲擊e鍵即可進(jìn)入編輯功能,這時它會詢問你要編輯哪部分內(nèi)容,如Cookies、Query、URL等,每個選項的第一個字母會高亮顯示。敲擊要編輯內(nèi)容名稱的首字母即可進(jìn)入該內(nèi)容的編輯頁面,如敲擊m即可編輯請求的方式,敲擊q即可修改GET請求參數(shù)Query。

這時我們敲擊q,進(jìn)入到編輯Query的頁面。由于沒有任何參數(shù),我們可以敲擊a來增加一行,然后就可以輸入?yún)?shù)對應(yīng)的Key和Value,如下圖所示。

這里我們輸入Key為wd,Value為NBA。

然后再敲擊esc鍵和q鍵,返回之前的頁面,再敲擊e和p鍵修改Path。和上面一樣,敲擊a增加Path的內(nèi)容,這時我們將Path修改為s,如下圖所示。

再敲擊esc和q鍵返回,這時我們可以看到最上面的請求鏈接變成了:https://www.baidu.com/s?wd=NBA。訪問這個頁面,可以看到百度搜索NBA關(guān)鍵詞的搜索結(jié)果,如下圖所示。

敲擊a保存修改,敲擊r重新發(fā)起修改后的請求,即可看到上方請求方式前面多了一個回旋箭頭,這說明重新執(zhí)行了修改后的請求。這時我們再觀察響應(yīng)體內(nèi)容,即可看到搜索NBA的頁面結(jié)果的源代碼,如下圖所示。

以上內(nèi)容便是mitmproxy的簡單用法。利用mitmproxy,我們可以觀察到手機上的所有請求,還可以對請求進(jìn)行修改并重新發(fā)起。

Fiddler、Charles也有這個功能,而且它們的圖形界面操作更加方便。那么mitmproxy的優(yōu)勢何在?

mitmproxy的強大之處體現(xiàn)在它的另一個工具mitmdump,有了它我們可以直接對接Python對請求進(jìn)行處理。下面我們來看看mitmdump的用法。

六、mitmdump的使用

mitmdump是mitmproxy的命令行接口,同時還可以對接Python對請求進(jìn)行處理,這是相比Fiddler、Charles等工具更加方便的地方。有了它我們可以不用手動截獲和分析HTTP請求和響應(yīng),只需寫好請求和響應(yīng)的處理邏輯即可。它還可以實現(xiàn)數(shù)據(jù)的解析、存儲等工作,這些過程都可以通過Python實現(xiàn)。

1. 實例引入

我們可以使用命令啟動mitmproxy,并把截獲的數(shù)據(jù)保存到文件中,命令如下所示:

mitmdump-w outfile

其中outfile的名稱任意,截獲的數(shù)據(jù)都會被保存到此文件中。

還可以指定一個腳本來處理截獲的數(shù)據(jù),使用-s參數(shù)即可:

mitmdump-s script.py

這里指定了當(dāng)前處理腳本為script.py,它需要放置在當(dāng)前命令執(zhí)行的目錄下。

我們可以在腳本里寫入如下的代碼:

def request(flow): flow.request.headers['User-Agent'] ='MitmProxy'print(flow.request.headers)

我們定義了一個request()方法,參數(shù)為flow,它其實是一個HTTPFlow對象,通過request屬性即可獲取到當(dāng)前請求對象。然后打印輸出了請求的請求頭,將請求頭的User-Agent修改成了MitmProxy。

運行之后我們在手機端訪問http://httpbin.org/get,可以看到如下情況發(fā)生。

手機端的頁面顯示如下圖所示。

PC端控制臺輸出如下圖所示。

手機端返回結(jié)果的Headers實際上就是請求的Headers,User-Agent被修改成了mitmproxy。PC端控制臺輸出了修改后的Headers內(nèi)容,其User-Agent的內(nèi)容正是mitmproxy。

所以,通過這三行代碼我們就可以完成對請求的改寫。print()方法輸出結(jié)果可以呈現(xiàn)在PC端控制臺上,可以方便地進(jìn)行調(diào)試。

2. 日志輸出

mitmdump提供了專門的日志輸出功能,可以設(shè)定不同級別以不同顏色輸出結(jié)果。我們把腳本修改成如下內(nèi)容:

from mitmproxy import ctx

def request(flow): flow.request.headers['User-Agent'] ='MitmProxy'ctx.log.info(str(flow.request.headers))ctx.log.warn(str(flow.request.headers))ctx.log.error(str(flow.request.headers))

這里調(diào)用了ctx模塊,它有一個log功能,調(diào)用不同的輸出方法就可以輸出不同顏色的結(jié)果,以方便我們做調(diào)試。例如,info()方法輸出的內(nèi)容是白色的,warn()方法輸出的內(nèi)容是黃色的,error()方法輸出的內(nèi)容是紅色的。運行結(jié)果如下圖所示。

不同的顏色對應(yīng)不同級別的輸出,我們可以將不同的結(jié)果合理劃分級別輸出,以更直觀方便地查看調(diào)試信息。

3. Request

最開始我們實現(xiàn)了request()方法并且對Headers進(jìn)行了修改。下面我們來看看Request還有哪些常用的功能。我們先用一個實例來感受一下。

我們修改腳本,然后在手機上打開百度,即可看到PC端控制臺輸出了一系列的請求,在這里我們找到第一個請求??刂婆_打印輸出了Request的一些常見屬性,如URL、Headers、Cookies、Host、Method、Scheme等。輸出結(jié)果如下圖所示。

結(jié)果中分別輸出了請求鏈接、請求頭、請求Cookies、請求Host、請求方法、請求端口、請求協(xié)議這些內(nèi)容。

同時我們還可以對任意屬性進(jìn)行修改,就像最初修改Headers一樣,直接賦值即可。例如,這里將請求的URL修改一下,腳本修改如下所示:

def request(flow): url ='https://httpbin.org/get'flow.request.url=url

手機端得到如下結(jié)果,如下圖所示。

比較有意思的是,瀏覽器最上方還是呈現(xiàn)百度的URL,但是頁面已經(jīng)變成了httpbin.org的頁面了。另外,Cookies明顯還是百度的Cookies。我們只是用簡單的腳本就成功把請求修改為其他的站點。通過這種方式修改和偽造請求就變得輕而易舉。

通過這個實例我們知道,有時候URL雖然是正確的,但是內(nèi)容并非是正確的。我們需要進(jìn)一步提高自己的安全防范意識。

Request還有很多屬性,在此不再一一列舉。更多屬性可以參考:http://docs.mitmproxy.org/en/latest/scripting/api.html。

只要我們了解了基本用法,會很容易地獲取和修改Reqeust的任意內(nèi)容,比如可以用修改Cookies、添加代理等方式來規(guī)避反爬。

4. Response

對于爬蟲來說,我們更加關(guān)心的其實是Response的內(nèi)容,因為Response Body才是爬取的結(jié)果。對于Response來說,mitmdump也提供了對應(yīng)的處理接口,就是response()方法。下面我們用一個實例感受一下。

from mitmproxy import ctx

def response(flow): response =flow.response info=ctx.log.infoinfo(str(response.status_code))info(str(response.headers))info(str(response.cookies))info(str(response.text))

將腳本修改為如上內(nèi)容,然后手機訪問:http://httpbin.org/get。

這里打印輸出了Response的status_code、headers、cookies、text這幾個屬性,其中最主要的text屬性就是網(wǎng)頁的源代碼。

PC端控制臺輸出如下圖所示。

控制臺輸出了Response的狀態(tài)碼、響應(yīng)頭、Cookies、響應(yīng)體這幾部分內(nèi)容。

我們可以通過response()方法獲取每個請求的響應(yīng)內(nèi)容。接下來再進(jìn)行響應(yīng)的信息提取和存儲,我們就可以成功完成爬取了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容