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

測試開發小記發表於2021-02-14

在介面測試中,會用到抓包工具或者代理工具,常用代理工具包括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
歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!

相關文章