mitmproxy 代理工具介紹:rewrite和map local實現


在接口測試中,會用到抓包工具或者代理工具,常用代理工具包括charles、 burpsuite、 fiddler、mitmproxy等,ssh -D參數 可實現socks5代理。網絡嗅探工具可以使用tcpdump 和 wireshark。

Charles工具可以實現mock測試(參考 接口測試代理工具charles mock測試),如果要自動化實現這些功能,mitmproxy工具是個不錯的選擇。

本文主要內容包括簡要介紹mitmproxy代理工具、mitmproxy安裝、SSL 證書安裝以及實現和charles一樣的功能:rewrite和map local。

mitmproxy簡介

mitm(man-in-the-middle) 即中間人攻擊,mitmproxy是主要基於Python平台開發的代理工具,功能強大,可滿足高度定制化需求。它是一個用於跟蹤流量的中間代理工具,具有截獲、篡改、重放等功能。

插件是mitmproxy非常強大的一部分,提供了一系列API,mitmproxy擴展:https://docs.mitmproxy.org/stable/addons-overview/

插件例子:https://docs.mitmproxy.org/stable/addons-examples/

mitmproxy支持5種代理模式:

  1. 正向代理(regular proxy)
  2. 反向代理(reverse proxy)
  3. 上行代理(upstream proxy)
  4. 透明代理(transparent proxy)
  5. socks5代理(socks Proxy)

本文主要介紹mitmproxy的正向代理使用過程
mitmproxy套裝包括3個工具:

  • mitmproxy:命令行交互工具
  • mitmdump:命令行非交互工具,提供類似 tcpdump的功能
  • mitmweb:基於Web的用戶界面

mitmproxy的代理流程:

圖片來源:https://docs.mitmproxy.org/stable/concepts-howmitmproxyworks/

mitmproxy安裝

mitmproxy官網:https://mitmproxy.org/

mitmproxy安裝方法參考:https://docs.mitmproxy.org/stable/overview-installation/

macOS:

brew install mitmproxy

Linux和Windows:在官網mitmproxy.org下載安裝

檢查是否安裝成功
mitmdump --version

C:\Users\10287>mitmdump --version
Mitmproxy: 5.1.1 binary
Python:    3.7.6
OpenSSL:   OpenSSL 1.1.1f  31 Mar 2020
Platform:  Windows-10-10.0.18362-SP0
C:\Users\10287>

python包安裝:
注意python版本 >= 3.6

python3 -m pip install --user pipx
python3 -m pipx ensurepath
pipx install mitmproxy

docker 安裝方法:
https://hub.docker.com/r/mitmproxy/mitmproxy/

docker pull mitmproxy/mitmproxy

SSL 證書安裝

和charles代理工具一樣,如果要抓取HTTPs報文,客戶端(APP 或瀏覽器)需要安裝SSL證書。

  1. 啟動服務
C:\Users\10287>mitmdump -p 8999
Proxy server listening at http://*:8999
  1. 瀏覽器設置代理
    使用SwitchyOmega插件添加mitmproxy代理,代理服務器地址設置為主機IP地址,代理端口8999
    SwitchyOmega插件下載地址:https://github.com/FelisCatus/SwitchyOmega/releases

  2. 瀏覽器輸入 mitm.it
    選擇對應系統的證書安裝

  3. 手機證書安裝方法同charles(地址為mitm.it)
    參考 charles SSL證書安裝

手機瀏覽器訪問百度,命令行窗口顯示https報文解析成功

mitmproxy錄制回放

錄制回放參考:https://docs.mitmproxy.org/stable/tute-clientreplay/

  1. 開始錄制,保存到文件baidusearch中
D:\ProgramWorkspace\TestingDemo\test_mitmproxy>mitmdump -p 8999 -w baidusearch
  1. 手機瀏覽baidu,進行百度搜索
  2. 停止錄制:Ctrl+c 停止
  3. 回放
    cmd命令行輸入如下命令:
mitmweb -p 8999

打開生成的baidusearch文檔,可以查看報文交互過程

Rewrite

要求:和charles一樣,修改招商銀行名稱及股票價格。見接口測試代理工具charles mock測試

  1. 啟動 mitmproxy 服務
C:\Users\10287>mitmdump -p 8999 
Proxy server listening at http://*:8999 
  1. 手機(或者模擬器)安裝ssl證書,設置代理
    charles SSL證書安裝

  2. 抓取雪球APP行情頁面數據包

C:\Users\10287>mitmweb -p 8999
Web server listening at http://127.0.0.1:8081/
Proxy server listening at http://*:8999

開啟抓包后,刷新雪球APP行情頁面,找到行情頁面報文,查看URL特征,用於下一步寫腳本來找到它。

  1. 寫一個腳本處理響應數據:

test_mitmproxy_response.py

#!/usr/bin/python3
#-*-coding:utf-8-*-
import json

def response(flow):
        """
	1. 找到行情頁面相關URL
	2. 修改第一條記錄(招商銀行)的名稱和股票價格
	3. 將數據寫入響應數據中
	"""
    if "quote.json" in flow.request.pretty_url and "x=" in flow.request.pretty_url:
        data = json.loads(flow.response.content)
        data['data']['items'][0]['quote']['name'] = data['data']['items'][0]['quote']['name'] + "test"
        data['data']['items'][0]['quote']['current'] = '50'
        flow.response.text = json.dumps(data)
  1. 運行腳本
D:\ProgramWorkspace\TestingDemo\test_mitmproxy>mitmdump -p 8999 -s test_mitmproxy_response.py

  1. 刷新雪球APP行情頁面

修改成功

Map Local

要求和接口測試代理工具charles mock測試一樣,我們直接使用數據倍增后的數據stock2.json,如果要實現自動化,可以使用python腳本對響應數據進行處理。

股票數據可以在上一節Rewrite 第3步中直接保存,或者通過charles獲取數據。

參考官方文檔提供的mitmproxy插件http-reply-from-proxy.py:https://docs.mitmproxy.org/stable/addons-examples/#http-reply-from-proxy

  1. 編寫響應數據處理腳本test_request.py
#!/usr/bin/python3
#-*-coding:utf-8-*-

"""Send a reply from the proxy without sending any data to the remote server."""
from mitmproxy import http


def request(flow: http.HTTPFlow) -> None: 
    if "quote.json" in flow.request.pretty_url and "x=" in flow.request.pretty_url:
        with open("D:/ProgramWorkspace/TestingDemo/test_mitmproxy/stock2.json",encoding="utf-8") as f:
            flow.response = http.HTTPResponse.make(
                200,  # (optional) status code
                f.read(),  # (optional) content
                {"Content-Type": "application/json"}  # (optional) headers
            )

  1. 開啟服務,運行腳本
D:\ProgramWorkspace\TestingDemo\test_mitmproxy>mitmdump -p 8999 -s test_request.py
Loading script test_request.py
Proxy server listening at http://*:8999
  1. 刷新雪球APP行情頁面

修改成功

開啟服務后,可以直接修改stock2.json內容,不需要重新拉起。

--THE END--

文章標題:mitmproxy 代理工具介紹:rewrite和map local實現
本文作者:hiyo
本文鏈接:https://www.cnblogs.com/hiyong/p/14288354.html
歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!


免責聲明!

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



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