Mitmproxy + Python 做攔截代理


  在測試過程中,我們經常用到Charles、Fiddler等抓包工具,通過抓取http請求進行相關的測試、問題排查。但是在一些特殊場景下,例如我們的數據傳輸是加密的,可能需要抓取到數據后再進行解密,這個使用抓包工具就不能完全符合我們的需求。

mitmproxy是什么

  mitmproxy 就是用於 MITM 的 proxy,MITM 即中間人攻擊(Man-in-the-middle attack)。用於中間人攻擊的代理首先會向正常的代理一樣轉發請求,保障服務端與客戶端的通信,其次,會適時的查、記錄其截獲的數據,或篡改數據,引發服務端或客戶端特定的行為。

  不同於 fiddler、Charles 或 wireshark 等抓包工具,mitmproxy 不僅可以截獲請求幫助開發者查看、分析,更可以通過自定義腳本進行二次開發。舉例來說,利用 fiddler 可以過濾出瀏覽器對某個特定 url 的請求,並查看、分析其數據,但實現不了高度定制化的需求,類似於:“截獲對瀏覽器對該 url 的請求,將返回內容置空,並將真實的返回內容存到某個數據庫,出現異常時發出郵件通知”。而對於 mitmproxy,這樣的需求可以通過載入自定義 python 腳本輕松實現。

  但 mitmproxy 並不會真的對無辜的人發起中間人攻擊,由於 mitmproxy 工作在 HTTP 層,而當前 HTTPS 的普及讓客戶端擁有了檢測並規避中間人攻擊的能力,所以要讓 mitmproxy 能夠正常工作,必須要讓客戶端(APP 或瀏覽器)主動信任 mitmproxy 的 SSL 證書,或忽略證書異常。

  mitmproxy簡單理解就是個抓包工具,它可以提供命令行界面、web界面,還可以通過python腳本實現自定義的請求攔截、篡改等自定義的操作。

mitmproxy模塊安裝

pip3 install mitmproxy

完成后,系統將擁有 mitmproxymitmdumpmitmweb 三個命令,由於 mitmproxy 命令不支持在 windows 系統中運行(這沒關系,不用擔心),我們可以拿 mitmdump 測試一下安裝是否成功,執行:

mitmdump --version

出現下面提示即安裝成功

Mitmproxy: 5.1.1
Python:    3.6.1
OpenSSL:   OpenSSL 1.1.1g  21 Apr 2020
Platform:  Darwin-16.7.0-x86_64-i386-64bit

mitmproxy啟動

要啟動 mitmproxy 用 mitmproxymitmdumpmitmweb 這三個命令中的任意一個即可,這三個命令功能一致,且都可以加載自定義腳本,唯一的區別是交互界面的不同。

啟動命令:

mitmdump -p 8889 -s run.py

-p 指定代理端口

-s 指定要執行的腳本文件

如果是啟動web界面, 可以在127.0.0.1:8081上看到

mitmproxy腳本

在啟動mitmproxy的時候可以指定腳本,腳本的使用規則如下:

import mitmproxy.http
from mitmproxy import ctx


class Counter():

    def __init__(self):
        self.num=0

    def request(self, flow: mitmproxy.http.HTTPFlow):
        self.num+=1

        if "api.pre.sanjieke.cn" in flow.request.url:
            ctx.log.info("we have seen %d flow " % self.num)

    def response(self, flow: mitmproxy.http.HTTPFlow):
        if "api.pre.sanjieke.cn" in flow.request.url:
            import json
            data = json.loads(str(flow.response.content, encoding='utf-8'))
            ctx.log.info("data = {}".format(data))


addons = [
    Counter()
]

  

1. 定義一個規則類,可以通過設置http生命周期方法來自定義相關代理設置,例如counter類中的request和response,即在http請求中的請求和返回

2.將類加入到addons數組中,啟動mitmproxy時帶上該py文件即可

當然除了request和response還有其它的階段,這兩個是常用的。

mitmproxy除了可以定義處理http請求生命周期各個階段,還可以處理tcp鏈接生命周期、websocket生命周期等

詳見:https://blog.wolfogre.com/posts/usage-of-mitmproxy/

基本常用的就是request、response這兩個。

腳本中可以通過ctx進行相關日志打印。

 

以上就是mitmproxy的簡單使用。

 


免責聲明!

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



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