一、mitmproxy的安裝
mitmproxy是一個抓包工具,類似於WireShark、Filddler,並且它支持抓取HTTP和HTTPS協議的數據包。另外,它還有兩個非常有用的組件,一個mitmdump,它是mitmproxy的命令行接口,利用它可以對接python腳本;另一個是mitmweb,它是一個web程序,通過它可以清楚的觀察mitmproxy捕獲的數據情況,優點類似於Chrome瀏覽器。
1、linux 安裝mitmproxy
pip3 install mitmproxy
2、windows下安裝mitmproxy
二、安裝中可能出現的問題
在windows系統安裝mitmproxy的時候,容易出現下面提示的錯誤
error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools”: http://landinghub.visualstudio.com/visual-cpp-build-tools
此時,可以在微軟官網直接下載 c++ 庫之類的軟件,然后再在命令行進行安裝 mitmproxy即可。也可以在網上搜索MicrosoftVCTools2017,進行下載。
三、mitmproxy證書配置
mitmproxy和Charles軟件一樣,需要進行證書配置,為什么要進行證書配置?由於我們要抓取的大部分App頁面都采用了HTTPS,也就是經過加密,若沒有證書,就無法識別抓取的數據。另外,需要注意的是,mitmproxy與Charles軟件一樣需要在PC和手機端安裝證書。
1、首先cmd運行一下以下命令,以便在windows系統中產生CA證書
mitmdump
2、接着在.mitmproxy目錄找到CA證書,如下圖所示
3、雙擊mitmproxy-ca.p12進入導入證書的頁面,點擊“下一步”
4、不用輸入密碼,直接“下一步”
5、選擇“將所有的證書都放入下列存儲”,接着選擇“受信任的根證書頒發機構”
6、最后,彈出警告窗口,直接點擊“是”
7、接着在手機(IOS)上配置證書,先將mitmproxy-ca-cert.pem文件發送至iphone,推薦用郵箱方式,接着在iphone上可以把直接點擊附件並安裝。最后在手機(ios)“設置”、“通用”、“描述文件與設備管理”,找到“證書信任設置”,信任即可。
四、設置手機端代理
1、可以在pc(windows)中用cmd命令行,輸入命令ipconfig,查看電腦ip,這里ip地址是192.168.31.43
2、接着在手機上設置代理,其實就是將pc電腦的ip192.168.31.43:8080,設置成代理即可。
3、配置代理,改為手動
五、腳本
addons機制具有一個速記,可以將模塊作為一個整體作為addon對象。這使我們可以將事件處理函數放在模塊范圍內。例如,這是一個完整的腳本,可向每個請求添加標頭。
def request(flow):
flow.request.headers["myheader"] = "value"
這是另一個截取對特定URL的請求並發送任意響應的示例:
from mitmproxy import http
def request(flow: http.HTTPFlow) -> None:
# pretty_url takes the "Host" header of the request into account, which
# is useful in transparent mode where we usually only have the IP otherwise.
if flow.request.pretty_url == "http://example.com/path":
flow.response = http.HTTPResponse.make(
200, # (optional) status code
b"Hello World", # (optional) content
{"Content-Type": "text/html"} # (optional) headers
)
六、命令行交互
1、mitmdump的啟動
mitmdump
2、mitmdump指定端口的啟動
mitmdump -p 8889
3、指定python腳本
mitmdump -p 8889 -s test.py
4、保存截獲數據
mitmdump -w test.txt
七、常用接口
#http.HTTPFlow 實例 flow
flow.request.headers #獲取所有頭信息,包含Host、User-Agent、Content-type等字段
flow.request.url #完整的請求地址,包含域名及請求參數,但是不包含放在body里面的請求參數
flow.request.pretty_url #同flow.request.url目前沒看出什么差別
flow.request.host #域名
flow.request.method #請求方式。POST、GET等
flow.request.scheme #什么請求 ,如https
flow.request.path # 請求的路徑,url除域名之外的內容
flow.request.get_text() #請求中body內容,有一些http會把請求參數放在body里面,那么可通過此方法獲取,返回字典類型
flow.request.query #返回MultiDictView類型的數據,url直接帶的鍵值參數
flow.request.get_content()#bytes,結果如flow.request.get_text()
flow.request.raw_content #bytes,結果如flow.request.get_content()
flow.request.urlencoded_form #MultiDictView,content-type:application/x-www-form-urlencoded時的請求參數,不包含url直接帶的鍵值參數
flow.request.multipart_form #MultiDictView,content-type:multipart/form-data
時的請求參數,不包含url直接帶的鍵值參數
#以上均為獲取request信息的一些常用方法,對於response,同理
flow.response.status_code #狀態碼
flow.response.text#返回內容,已解碼
flow.response.content #返回內容,二進制
flow.response.setText()#修改返回內容,不需要轉碼
八、參考
1、https://docs.mitmproxy.org/stable/concepts-certificates/
2、https://mitmproxy.org/
3、https://github.com/mitmproxy/mitmproxy/tree/master/examples/simple
4、https://docs.mitmproxy.org/stable/addons-scripting/
5、https://docs.mitmproxy.org/stable/addons-events/
6、https://www.jianshu.com/p/a495cc016682