Python3+mitmproxy安裝使用教程(Windows)


一、安裝

1.1 安裝mitmproxy

直接使用pip安裝即可

pip install mitmproxy

pip本質上會一是安裝mitmproxy庫的相關代碼,二是安裝mitmproxy.exe/mitmdump.exe/mitmdump.exe三個可執行程序。

可執行程序被安裝在$PYTHON_HOME/Scripts文件夾下,如果是conda版本的python那可以用以下命令來查看當前使用的是哪個環境。

conda env list

 

1.2 安裝證書

和burpsuite類似mitmproxy默認只能攔截http,想要攔截https那就需要安裝證書。

首先到$PYTHON_HOME/Scripts目錄下運行一下mitmdump,完成之后在用戶家目錄下的.mitmproxy文件夾下即會生成證書,傳到手機點擊安裝即可。

mitmproxy-ca.p12----PKCS12格式證書私鑰

mitmproxy-ca.pem----PEM格式證書私鑰

mitmproxy-ca-cert.cer----PEM格式證書,與mitmproxy-ca-cert.pem相同只是改變了后輟,適用於部分Android

mitmproxy-ca-cert.p12----PKCS12格式證書,適用於Windows

mitmproxy-ca-cert.pem----PEM格式證書,適用於大多數非Windows平台

mitmproxy-dhparam.pem----PEM格式秘鑰文件,用於增強SSL安全性

Windows安裝證書:雙擊mitmproxy-ca-cert.p12----全部默認直接點“下一步”直到安裝完成。

 Android安裝證書:把mitmproxy-ca-cert.cer通過usb復制到手機上----點擊使用證書安裝器安裝證書(通過qq發送到手機上時提示無法讀取證書不懂什么原因)

 

二、網絡代理配置

2.1 確保手機和電腦處於同一局域網

運行mitmproxy的電腦和運行目標app的手機要同處一個局域網才能進行代理。

如果是有筆記本那么筆記本和手機同連到一個路由器上,或者在筆記本上開啟一個wifi然后用手機連上去,或者用Genymotion等模擬器運行app在模擬器設置代理,這三個方法都可以。

但如果是沒有無線網卡的台式機那似乎只能使用模擬器,要用其他兩種方法那得外接一個usb式無線網卡。

 我這里用的方法是台式機外接無線網卡使用360開啟一個wifi手機連上去,台式機ip為172.30.195.1手機ip為172.30.195.2。

 

2.2 電腦啟動代理

我這里是windows,mitmproxy.exe並不支持windows,但這並沒有很大關系,mitmproxy.exe本質就是一個窗口式的burpsuite的proxy+repeater。

如果要攔包改包我們用burpsuite更加好,用mitmproxy的意義在於代碼能獲取數據包,而這個功能是由mitmdump實現只要mitmdump.exe可運行即可。

和1.2一樣啟動mitmdump.exe

mitmdump.exe

 

2.3 手機配置代理

手機配置代理大同小異都在設置之中進行配置。比如我這里的路徑是:

設置----無線和網絡WLAN----長按wifi名----修改網絡----顯示高級選項----代理----手動---服務器主機名輸入172.30.195.1(根據自己電腦ip修改)服務器端口輸入8080----保存

 

2.4 代理效果查看

完成后在啟動mitmdump.exe的代理窗口上即可看到手機發送的所有數據包。

 

三、Python3使用mitmproxy

我們前邊2.2也提到使用mitmproxy的根本目的是想要python能修改發送的數據包,及截獲服務端返回的數據包。只是像2.4那樣打印出所有發送的請求對我們的目的而言是沒有什么用的。

python接觸發送數據包的途徑是在啟動mitmdump啟動時使用-s選項指定處理腳本,其中通過重寫request方法處理請求數據包,通過重寫response方法處理響應數據包。示例如下。

啟動命令:

mitmdump.exe -s example_script.py

exampl_script.py內容:

from mitmproxy import ctx

# 所有發出的請求數據包都會被這個方法所處理
# 所謂的處理,我們這里只是打印一下一些項;當然可以修改這些項的值直接給這些項賦值即可
def request(flow):
    # 獲取請求對象
    request = flow.request
    # 實例化輸出類
    info = ctx.log.info
    # 打印請求的url
    info(request.url)
    # 打印請求方法
    info(request.method)
    # 打印host頭
    info(request.host)
    # 打印請求端口
    info(str(request.port))
    # 打印所有請求頭部
    info(str(request.headers))
    # 打印cookie頭
    info(str(request.cookies))

# 所有服務器響應的數據包都會被這個方法處理
# 所謂的處理,我們這里只是打印一下一些項
def response(flow):
    # 獲取響應對象
    response = flow.response
    # 實例化輸出類
    info = ctx.log.info
    # 打印響應碼
    info(str(response.status_code))
    # 打印所有頭部
    info(str(response.headers))
    # 打印cookie頭部
    info(str(response.cookies))
    # 打印響應報文內容
    info(str(response.text))

如圖箭頭所指處正是經request方法處理,依次輸出請求url、請求方法、host頭、請求端口、所有頭部及cookies

 

四、評述

我們在電腦上寫爬蟲,關鍵操作是找到請求url、制定請求數據包、解析返回結果。

從這個角度出發對app我們根本需要的似乎其實只是攔截請求數據包和響應數據包、分析他們的格式,沒必要從app發出和接收數據包。

也就是似乎用burpsuite代理並進行數據包分析就完了,mitmproxy沒什么用(?)。

 

參考:

崔慶才----《Python3網絡爬蟲開發實戰》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM