mitmproxy是一個使用python編寫的中間人代理工具,跟Fiddle、Charles等等的抓包工具是差不多的,同樣可以用於攔截、修改、保存http/https請求。比起Fiddle、Charles,mitmproxy有一個最大的特點是支持python自定義腳本。
安裝mitmproxy工具的話直接到以下網址直接下載,一鍵安裝即可立即使用,也很簡單,移動端設置一下端口就直接可以抓包。
安裝完成后,系統會擁有3個命令mitmproxy、mitmdump、mitmweb,該三個命令的區別是交互界面不同而已。
mitmproxy是會直接提供一個命令行界面,可以實時看到請求的鏈接。
mitmdump是沒有界面,通過自定義腳本默默的按照自定義腳本工作。
mitmweb是通過web界面,實時看到請求的鏈接。
在命令行上直接輸入以上三個命令之一即可開始抓包
mitmproxy官網:https://mitmproxy.org
mitmproxy GitHub:https://github.com/mitmproxy/mitmproxy
以Windows安裝mitmproxy為例
一、抓包原理
與Fiddle,Charles一樣,mitmproxy運行於自己的PC上,mitmproxy會在PC的8080端口運行,然后開啟一個代理服務,這個服務實際上是一個HTTP/HTTPS的代理。
手機和PC在同一個局域網內,設置代理為mitmproxy的代理地址,這樣手機在訪問互聯網的時候流量數據包就會流經mitmproxy,mitmproxy再去轉發這些數據包到真實的服務器,服務器返回數據包時再由mitmproxy轉發回手機,這樣mitmproxy就相當於起了中間人的作用,抓取到所有Request和Response,另外這個過程還可以對接mitmdump,抓取到的Request和Response的具體內容都可以直接用Python來處理,比如得到Response之后我們可以直接進行解析,然后存入數據庫,這樣就完成了數據的解析和存儲過程。
二、Windows安裝mitmproxy
pip install mitmproxy
三、查看mitmproxy版本
啟動mitmproxy一共有三種命令方式
mitmproxy mitmdump mitmweb
mitmproxy
類似於vim編輯器,使用命令操作並查看每一個包的信息
mitmdump
mitmdump啟動的方式結合了mitmweb打印出的腳本信息和mitmproxy方式啟動的包信息,在命令行中查看可能會很難找目標信息,但不需要去進一步的去操作
mitmweb
會在本機上啟動一個web服務,以便在瀏覽器查看包信息,相比於命令行界面操作更加簡單,命令行則輸出腳本運行信息
Linux系統一般用命令行輸入mitmproxy mitmdump
mitmproxy --version
如果在Windows系統輸入 mitmproxy --version 報錯
Windows 命令一般用mitmdump 和 mitmweb
mitmdump --version
四、設置代理並安裝CA證書
手機或者雷電模擬器安裝證書
這里以安卓手機為例,安裝CA證書
Android機打開UC瀏覽器輸入或者自帶瀏覽器 IOS機同理
輸入mitm.it出現下圖選擇 Android 或者 Apple
開啟抓包:mitmdump 默認端口8080
mitmdump -p 8888
五、python腳本寫法
訪問請求
def request(flow):
ctx.log.warn(str(flow.request.headers))
print(flow.request.headers) # 打印請求頭
響應請求
def response(flow):
ctx.log.warn(str(flow.response.status_code)) # 獲取響應的狀態碼
print(flow.response.text) # 響應的文件
日志輸出
mitmdump提供了專門的日志輸出功能,可以設定不同級別以不同顏色輸出結果。我們把腳本修改成如下內容
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))
六、開始用python腳本抓包
python腳本可以隨便放哪,只要路徑正確就沒有問題
mitmdump -p 8888 -s D:/Yuan/mitmdata.py
抓包過程
七、mitmproxy腳本
# -*- coding: utf-8 -*-
import mitmproxy.http
class Counter:
def __init__(self):
self.num = 0
#設置上游代理
def request(self, flow: mitmproxy.http.HTTPFlow):
if flow.request.method == "CONNECT":
return
if flow.live:
proxy = ('http://121.228.53.238', '9990')
print(flow.request.host)
flow.live.change_upstream_proxy_server(proxy)
def response(self, flow: mitmproxy.http.HTTPFlow):
# 攔截包的信息
if 'https://mbd.baidu.com/newspage/data/landingpage' in flow.request.url:
print(flow.response.text)
self.num = self.num + 1
ctx.log.info("We've seen %d flows" % self.num)
addons = [
Counter()
]