今天給大家介紹個有意思的工具,不知道你有沒有聽說過中間人攻擊(Man-in-the-middle attack)簡稱 MITM,是一種“間接”的入侵攻擊,這種攻擊模式是通過各種技術手段將受入侵者控制的一臺計算機虛擬放置在網絡連接中的兩臺通信計算機之間,這臺計算機就稱為“中間人”,看下這張圖可能更容易理解。
mitmproxy
好了,下面就開始我們介紹我們今天的主角 mitmproxy ,它和其他抓包工具相比,不僅可以截獲請求幫助開發者查看、分析,更可以通過 Python 自定義腳本進行二次開發。而且由于 mitmproxy 工作在 HTTP 層,而且現在客戶端擁有了檢測并規避中間人攻擊的能力,所以并不會真的對無辜的人發起中間人攻擊,只能用來做開發或測試。好了,接下來我們就開始一起看他到底有什么本事。
安裝
安裝還是很簡單的,只需要用 pip 直接自動安裝就可以了,執行以下安裝命令:
$ pip3 install mitmproxy
如果沒有提示出錯,就算是安裝成功了。然后我們在分別運行以下三個命令,可以展示出相應的版本信息。
$ mitmproxy --versionMitmproxy: 5.0.1Python: 3.7.4OpenSSL: OpenSSL 1.1.0j 20 Nov 2018Platform: Darwin-16.7.0-x86_64-i386-64bit$ mitmdump --versionMitmproxy: 5.0.1Python: 3.7.4OpenSSL: OpenSSL 1.1.0j 20 Nov 2018Platform: Darwin-16.7.0-x86_64-i386-64bit$ mitmweb --versionMitmproxy: 5.0.1Python: 3.7.4OpenSSL: OpenSSL 1.1.0j 20 Nov 2018Platform: Darwin-16.7.0-x86_64-i386-64bit
mitmproxy、mitmdump、mitmweb 區別
其實 mitmproxy、mitmdump、mitmweb 這三個功能本質是一樣的,區別主要是它們的交互的方式不同。
- mitmproxy:主要是以控制臺的方式交互
- mitmdump:主要是以命令行的方式交互
- mitmweb:主要以 web 的形式進行交互
在這里可以看出,以 web 方式交互對我們來說應該是最簡單的,接下來就以 mitmweb 為基礎介紹它的功能。
啟動 mitmweb
直接執行命令 mitmweb 就可以啟動,啟動以后的效果如下,服務會監聽本機 8080 端口,并且通過 8081端口可以訪問 web 控制臺:
$ mitmwebWeb server listening at http://127.0.0.1:8081/Proxy server listening at http://*:8080
我們在瀏覽器地址輸入:127.0.0.1:8081,回車后返回如下頁面:
配置瀏覽器代理
服務啟動完成,現在就需要配置瀏覽器通過本地服務 8080 端口來聯網,從而使 mitm 達到做為“中間人”的目的。由于只是測試一下,所以可以使用命令行啟動瀏覽器,這里我用的 google Chrome,其他瀏覽器也差別不大,輸入以下命令即可:
linux:
google-chrome --proxy-server=127.0.0.1:8080 --ignore-certificate-errors
windows:
D:/google-chrome.exe --proxy-server=127.0.0.1:8080 --ignore-certificate-errors
macOS:
open -a /Applications/Google Chrome.app/Contents/MacOS/Google Chrome --args -proxy-server=127.0.0.1:8080 -ignore-certificate-errors
瀏覽器啟動完成后,會有一個安全提示,如下圖所示:
mitmproxy 的使用
下面我們以訪問百度首頁為例看下 mitmproxy 在中間是如何修改數據的。首先我們在 mitmweb 頁面配置下只攔截 baidu 相關的請求,如下圖所示:
現在我們通過瀏覽器再請求一下百度,這時我們再看下 mitmweb 頁面會出現黃色的請求提示,表明我們的請求已經被 mitmproxy 攔截,然后我們就可以通過點擊圖中靠右邊的小鉛筆圖標,就可以修改我們攔截的請求信息了,請看下圖:
當修改完需要把攔截的請求放行,則需要單擊工具欄中 Resume (綠色圖標)按鈕即可。請求信息發出去后,我們很快就會收到服務器返回的信息,返回的信息也一樣會被 mitmproxy 攔截,并且我們也可以對返回的信息進行修改,返回信息如下圖,多了個 Response 標簽頁面:
好了,在這里我試著改了下返回頁面的 title ,如下圖:
然后我們再單擊 Resume 按鈕,將返 回信息放行,就會在瀏覽器看到如下圖的效果:
好了,以上我們只是手動簡單操作了下,主要是可以讓大家明白它的原理,接下來我們就來演示,通過 Python 腳本來自動完成數據的操作。
Python 腳本示例
接下來我們通過 Python 寫一段腳本,實現在你用百度搜索任意內容時,都把你搜索的內容改為“建議使用Google搜索”,并且把請求返回內容里面,所有“百度”的字串都自動替換為“谷歌”,這個小腳本讓我們同時實現了修改請求和返回內容,現在就上代碼:
# baidu.py# 引入對應模塊import mitmproxy.httpfrom mitmproxy import ctx, httpclass Baidu: # 請求時需要處理 def request(self, flow: mitmproxy.http.HTTPFlow): if flow.request.host != "www.baidu.com" or not flow.request.path.startswith("/s"): return if "wd" not in flow.request.query.keys(): ctx.log.warn("can not get search word from %s" % flow.request.pretty_url) return # 打印日志 ctx.log.info("正在搜索: %s" % flow.request.query.get("wd")) # 替換搜索關鍵詞 flow.request.query.set_all("wd", ["建議使用Google搜索"]) # 請求返回時需要處理 def response(self, flow: mitmproxy.http.HTTPFlow): # 獲取請求返回的文本并替換 text = flow.response.get_text() text = text.replace("百度", "谷歌") flow.response.set_text(text)# 增加插件addons = [ Baidu()]
寫好代碼保存,接下來我們重新啟動 mitmweb ,這次命令后需要加上參數使 Python 腳本生效,在命令行輸入: mitmweb -s baidu.py ,啟動完成后我們回到瀏覽器打開百度隨便輸入個內容進行搜索,你會看到效果如下圖所示:
可以看到上面我們隨便個詞點搜索,返回的結果都是“建議使用Google搜索”,并且右上角“百度”也都被替換為了“谷歌”。
總結
本文為大家介紹了 mitmproxy 工具的安裝以及如何使用,并寫了一段小腳本簡單實現了用它如何修改攔截的請求和返回的內容。當然它的功能不止這么簡單,有了它我們可以做很多事情,有興趣的話后續再為大家介紹。