mitmproxy簡介與使用說明
一、mitmproxy概述
mitmproxy是一款免費且開源的交互式代理工具,功能強大,支持HTTP、HTTPS、HTTP2、WebSockets以及TCP數(shù)據(jù)的攔截、查看、修改和重放操作。它提供了命令行(mitmproxy)、基于瀏覽器的圖形界面(mitmweb)以及可用于備份等功能的mitmdump工具,尤其以其靈活的Python腳本擴展能力備受開發(fā)者青睞,適用于開發(fā)、測試、安全研究等諸多場景。
二、安裝mitmproxy
- 依賴環(huán)境準備
- mitmproxy基于Python開發(fā),所以系統(tǒng)需預先安裝Python環(huán)境。多數(shù)Linux發(fā)行版自帶Python,也可通過官網(wǎng)(https://www.python.org/downloads/)下載安裝合適版本(建議Python 3.6及以上)。
- 確保
pip(Python包管理工具)已安裝且為最新版本,可使用命令pip install --upgrade pip更新。
- 安裝mitmproxy
- 在Linux系統(tǒng)(以Ubuntu為例),打開終端,執(zhí)行命令
sudo apt-get update更新軟件包列表后,輸入sudo apt-get install mitmproxy即可完成安裝。 - 也可通過
pip安裝,執(zhí)行pip install mitmproxy,此方式適用于多種操作系統(tǒng)及Python環(huán)境。
- 在Linux系統(tǒng)(以Ubuntu為例),打開終端,執(zhí)行命令
三、配置環(huán)境變量(使用apt install 則無需配置環(huán)境變量)
設置環(huán)境變量可方便在任意終端位置調(diào)用mitmproxy相關命令。
- Linux系統(tǒng)
- 編輯
~/.bashrc文件(若是使用zsh,則編輯~/.zshrc文件),添加如下內(nèi)容:
- 編輯
export PATH=$PATH:/usr/local/bin/mitmproxy # 根據(jù)mitmproxy實際安裝路徑調(diào)整
- 保存文件后,在終端執(zhí)行
source ~/.bashrc(zsh為source ~/.zshrc)使環(huán)境變量生效。
四、證書下載與安裝
- 生成證書
- 首次運行mitmproxy(如執(zhí)行
mitmproxy --version命令),它會在~/.mitmproxy/目錄下自動生成CA證書,名為mitmproxy-ca-cert.pem。 - 證書也可以通過啟動mitm后訪問 https://mitm.it/,下載證書
如果提示 “If you can see this, traffic is not passing through mitmproxy.” 說明本機的代理還沒有配置,需要第3步完成。
- 首次運行mitmproxy(如執(zhí)行
啟動(以下3種都可以,根據(jù)需要)
mitmproxy -p 8888 (命令行模式,默認是8080)
mitmdump -p 8888 -w /tmp/dump.log (文件保存模式)
mitmweb -p 8888 (網(wǎng)頁模式)
報錯: /usr/bin/xdg-open: 882: w3m: not found
xdg-open: no method available for opening 'http://127.0.0.1:8081/'
解決: mitmweb需要瀏覽器支持,在瀏覽器支持模式下會打開 http://127.0.0.1:8081
- 安裝證書到系統(tǒng)信任存儲
- 在基于Debian或Ubuntu的Linux系統(tǒng)中,執(zhí)行以下操作將證書添加到系統(tǒng)信任列表:
sudo cp ~/.mitmproxy/mitmproxy-ca-cert.pem /usr/local/share/ca-certificates/mitmproxy-ca-cert.crt
sudo update-ca-certificates
- linux環(huán)境下啟用代理
export http_proxy="http://127.0.0.1:8888"
export https_proxys="http://127.0.0.1:8888"
五、Java安裝證書
由于Java有獨立的證書信任存儲(不默認使用系統(tǒng)的證書,通常為$JAVA_HOME/jre/lib/security/cacerts),需額外將mitmproxy的CA證書添加進去,以便Java應用能信任由mitmproxy簽發(fā)的用于解密HTTPS流量的證書。
- 使用
keytool命令(keytool位于$JAVA_HOME/bin/目錄下),假設證書文件是mitmproxy-ca-cert.pem,執(zhí)行:
keytool -import -alias mitmproxy -file mitmproxy-ca-cert.pem -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
- 注意,這里
storepass是證書存儲的默認密碼,Java默認通常為changeit,執(zhí)行過程中按提示確認添加操作。 - 在windows環(huán)境下是 %JAVA_HOME%
六、使用mitmproxy進行OkHttp代理訪問
- 配置OkHttp客戶端代碼
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
public class Main {
public static void main(String[] args) {
// 設置代理,假設mitmproxy運行在本地(127.0.0.1)端口8888
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8888));
OkHttpClient client = new OkHttpClient.Builder()
.proxy(proxy)
.build();
Request request = new Request.Builder()
.url("https://example.com")
.build();
try {
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 因okhttp和httpclient 允許應用啟用代理模式,因此,環(huán)境中的代理依然不被認可。
- 運行Java程序
- 編譯并運行上述Java代碼,此時Java應用通過OkHttp發(fā)送的請求就會經(jīng)過mitmproxy代理,mitmproxy可攔截、查看和分析請求與響應數(shù)據(jù),輔助開發(fā)調(diào)試、安全檢測等工作。
- 注意,有可能有緩存,會發(fā)現(xiàn)啟用了沒生效,需要重啟應用,防止因啟動前訪問過,增加session代理后出錯,錯誤類似:not first session。
- 因會經(jīng)過mitmproxy在中間代理人來一層,整個響應會變慢且是python,僅適合測試開發(fā)用。
通過以上步驟,即可完成mitmproxy的安裝、配置以及結合Java的OkHttp實現(xiàn)代理訪問,充分利用其強大功能助力網(wǎng)絡請求相關工作。
mitmproxy 的Script
mitmproxy是使用python代碼寫的,也支持加載應用自己寫的python腳本,執(zhí)行url過濾,整理寫入。以下是一個使用 mitmproxy 進行網(wǎng)絡請求攔截的 Python 腳本示例,它可以實現(xiàn)對特定 URL 的請求進行攔截,并對請求和響應進行一些簡單的處理和分析:
import mitmproxy.http
def request(flow: mitmproxy.http.HTTPFlow):
"""
處理請求的函數(shù)
在請求發(fā)送到服務器之前被調(diào)用
"""
# 檢查請求的URL是否包含特定字符串,這里以"example.com"為例
if "example.com" in flow.request.url:
print(f"攔截到對 {flow.request.url} 的請求")
# 可以在這里對請求進行修改,比如修改請求頭
flow.request.headers["User-Agent"] = "Modified User-Agent"
def response(flow: mitmproxy.http.HTTPFlow):
"""
處理響應的函數(shù)
在收到服務器響應之后被調(diào)用
"""
if "example.com" in flow.request.url:
print(f"收到來自 {flow.request.url} 的響應,狀態(tài)碼: {flow.response.status_code}")
# 可以在這里對響應進行查看或修改,比如查看響應內(nèi)容
print(f"響應內(nèi)容: {flow.response.text}")
mitmproxy -s intercept_script.py
這樣就可以攔截一個 example.com的請求。
浙公網(wǎng)安備 33010602011771號