那個站在中間的男人,使用Python就能直接操控你的上網請求

不知道你有沒有聽過一個詞叫做:MITM, 也就是 man in the middle〔attack〕,意思就是中間人***。


比如你在跟你另一半(單身狗,暫時假設你有另一半圖片)網上聊天的時候,本來你們聊得好好的,哥們聊得挺嗨啊。突然間,小帥b在走進了你們兩的網絡通訊之間,並且跟你們兩同時建立了聯繫,這時候,你原本要發給你另一半的信息,被我攔截下來了,而這時候我還可以對你要發的數據進行篡改,然後再發給你的另一半。你們兩還全然不知,以爲就是對方說的話。



圖片



這就是中間的人,壞壞,這時候你可能想到了 fiddler 類似的抓包工具,但是這次,小帥b要跟你說一個牛逼的:mitmproxy,它不止是可以像 fiddler 那樣進行一些數據的請求分析,還可以直接使用 Python 寫一些腳本進行中間操控。



圖片



那麼,怎麼玩呢?

接下來就是:

學習python的正確姿勢




正是因爲 mitmproxy 這種比較牛逼的請求攔截定製化騷操作,使得它又一不小心成了我們爬蟲的一個工具,使用它我們可以更加方便的爬取一些 APP 上面的數據。


安裝起來特別簡單,pip install 下就可以了,使用如下命令安裝:


pip install mitmproxy



就是這麼一頓下載之後,你就成爲了中間的人了,這時候你的電腦就有了 mitmproxymitmdumpmitmweb 這三個牛逼的東西,其實它們本質都一樣,只是交互的方式不同:


mitmproxy 主要是以控制檯的方式交互




mitmdump  要是以命令行的方式交互





mitmweb 就是以 web 的形式進行交互





反正都差不多的,你用哪個都行:




這時候你想要啓動 mitm ,只需要直接輸入名稱就可以了,比如我這裏要啓動 mitmweb:




可以看到它就綁定了 8080 的端口,用來監聽,這時候我們如果使用 8080 端口進行代理上網,就可以直接獲取到請求數據了。


而 8081 這個端口就是用來運行 mitm 交互界面的,瀏覽器打開 127.0.0.1:8081 就是這個樣子:





想要使用 Chrome 以及 8080 端口代理運行,你可以使用命令行打開:



google-chrome --proxy-server=127.0.0.1:8080 --ignore-certificate-errors


  

如果你用的是 windows 系統的話,上面命令的 google-chrome 換成你的 chrome.exe 路徑,後面的 --ignore-certificate-errors 主要是忽略一下證書,打開之後我們輸入百度:





這個時候我們就可以在中間人(mitmweb)那裏看到百度的請求了:





點進去一個具體的請求,你會發現右邊的面板很清晰的給你展示了請求和返回的數據:





看到這裏,我知道你又想壞壞了,篡改一下請求和返回的數據?


簡單,在這裏定義你要修改的地方,比如我要對百度的請求的數據進行修改,那就在這裏輸入 baidu:





這時候我們重新在 8080 代理的 Chrome 請求一下百度,你會發現,中間人這邊先攔截了請求了:





這時候我們點擊右邊那支筆,就可以直接修改請求數據了:





因爲我這裏只是直接請求首頁,沒有表單數據,我就不修改了,直接讓它去請求百度的服務器,我們可以點擊上面 Flow 菜單下的 resume 按鈕就可以直接執行了:





服務器返回數據的時候,又被我們(中間人)攔截下來了,此時我們又可以修改服務器返回的數據了:





你看這標題:




我們改成:帥b老仙,法力無邊





寫完之後,右上角打個勾,然後再點擊一下上面的 resume :





可以看到瀏覽器的標題變了:










可能你看到這裏會想,這...和 fiddler 差不多嘛,好吧,接下來就給你展示一下,它真正厲害的地方,把 Python 當做中間人,對請求和返回數據進行操控。


開始擼一下代碼,我們創建一個 mitm_shuaib.py






在這裏我們把 mitmproxy 導進來,接着定義了 addons ,在這個列表裏面我可以定義一些實例,每個實例都可以自己去定義想要的中間操作。


實例裏面的定義的方法是和 mitmproxy 內部的機制掛鉤的,比如請求時會調用到 requests , 響應時會調用 response 方法,我們的腳本邏輯主要就是在這些地方實現的。


比如我們這裏用到了 request 方法,也就是當我們進行請求的時候,中間人在這裏就可以攔截到請求,每次訪問我們就 +1 ,然後打印一下。


保存好我們的腳本,然後使用 mitmweb 來執行:


mitmweb -s mitm_shuaib.py


這時候腳本就運行了,開了 8080 端口代理:



圖片



老樣子,我們開個 8080 端口代理的瀏覽器來訪問,這時候每次請求就被我知道了,看以下就是每次請求被我發現後打印的數據:



圖片



這就說明,我們的腳本已經可以了,但是這樣玩有點不過癮,我們繼續玩下 Python 腳本,在請求的時候,和數據返回的時候,來搞點事情怎麼樣?


來玩個有趣的,就是讓對方在百度搜索的時候,不管搜什麼內容,我們都把它改成搜 “世界上最帥的男人” ,然後把百度返回的結果改成“世界上最帥的男人是小帥b”。 


哈哈哈哈,先讓我笑一會~




圖片




我們先定義一個帥b實例:



圖片



然後我們再攔截一下百度的搜索請求,在這裏我們簡單的判斷一下,如果不是百度的請求我們就放行,如果是的話,我們就把搜索的關鍵詞給改了,不管他搜什麼,我們都改成去搜索:世界上最帥的人!



圖片



接着就是數據的返回,很簡單,把返回含有 “世界上最帥的人” 臭不要臉的改爲 “世界上最帥的人是小帥b”。



圖片



也就是這樣:



圖片



好了,我們來運行一波吧,執行腳本:



圖片



執行代理訪問,然後隨便搜索一下:



圖片



可以看到,本來搜索的是“hahah”,但都直接被改成搜索 “世界上最帥的人”,並且返回的是 “世界上最帥的人是小帥b” 了,哈哈哈。


這就是 mitmproxy 的牛逼之處,可以讓我們使用 Python 直接操作上網數據,可能你會問了:“如何操作手機上的請求數據呢?”、“怎麼使用它來爬取手機上的數據呢?”


把你的 賞/雞腿/在看 一條龍騷起來,且聽下回小帥b講解,peace!



更多精彩


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章