如何使用mitmproxy來讀取和修改HTTPS流量

【翻譯:2013年的文章,也就是4年前】

How To: Use mitmproxy to read and modify HTTPS traffic - Philipps Tech Blog

在自己的機器上捕獲HTTP和HTTPS流量非常簡單:使用Wireshark或Firebug等工具,嗅探本地連接只需幾秒鐘。 但是若要捕獲+更改網路中其他計算機(如智能手機或其他筆記本電腦)的HTTP / HTTPS流量並不容易。

首先,特別是嗅探SSL加密的HTTPS連接似乎是不可能的。 但是呢,我們可以用mitmproxy以非常簡單和直接的方式實現這個目的。

這個小教程顯示瞭如何使用mitmproxy來透明地嗅探和改變你的手機或網路中的其他設備的(!)HTTPS連接。

內容

1. 原理

1.1。 攻擊HTTP連接

1.2。 攻擊HTTPS連接

1.3。 更多細節

2.安裝並運行mitmproxy

2.1。 安裝mitmproxy

2.2。 在手機中安裝mitmproxy CA證書

2.3。 啟用IP轉發和埠重定向

2.4。 啟動mitmproxy

2.5。 更改手機的標準網關

2.6。 捕獲並更改HTTP / HTTPS請求和響應

2.7。 停止mitmproxy並取消iptables更改

1. 原理

Mitmproxy是一個開源代理應用程序,允許任何HTTP(S)客戶端(如移動或桌面瀏覽器)和使用典型的中間人攻擊(MITM)的Web伺服器之間的HTTP和HTTPS連接進行攔截。

與其他代理(如Squid)類似,它接受來自客戶機的連接並將其轉發到目標伺服器。 然而,雖然其他代理通常通過緩存來集中於內容過濾或速度優化,但是mitmproxy的目標是讓攻擊者實時監控,捕獲和更改這些連接。

1.1。攻擊HTTP連接

對於未加密的HTTP連接,這是非常簡單的:mitmproxy接受來自HTTP客戶端的連接,例如手機瀏覽器,在屏幕上向攻擊者顯示請求(及其請求參數),並將請求轉發到目標Web伺服器攻擊者即將確認 - 也許在調整請求負載後有一點。

mitmproxy只是作為一個中間人:對客戶端來說,看起來好像mitmproxy伺服器只是簡單地中繼它的連接(像您的路由器或ISP的伺服器)。

而對於伺服器來說,它看起來像是客戶端的。

1.2。攻擊HTTPS連接

雖然攻擊未加密的HTTP流量可以完成,而無需處理X.509證書和證書頒發機構(CA),SSL加密的HTTPS連接會加密客戶端和伺服器端到端的每個請求和響應。而且由於傳輸的數據是用共享密鑰加密的,所以中間人(或代理)不能對交換的數據包進行解密。

當客戶端打開到安全Web伺服器的SSL / TLS連接時,它通過檢查兩個條件來驗證伺服器的身份:首先,它檢查其證書是否已被客戶端已知的CA簽名。其次,它確保伺服器的通用名稱(CN,也是:主機名)與其連接的名稱相匹配。如果兩個條件均為真,客戶端假定連接是安全的。

為了能夠窺探連接,mitmproxy充當證書頒發機構,但不是一個非常值得信賴的機構:mitmproxy不會向實際的人員或組織頒發證書,而是動態地生成證書到連接所需的任何主機名。

如果客戶想要連接到facebook.com,則mitmproxy會為「www.facebook.com」生成證書,並使用自己的CA進行簽名。如果客戶端信任此CA,則上述兩個條件均為真(可信CA,同一CN)

- 這意味著客戶端相信mitmproxy伺服器實際上是「www.facebook.com」。下圖顯示了此場景的請求/響應流程。這種機制稱為透明HTTPS代理。(Fiddle https proxy也是這樣用的)

為了保證這類攻擊成功,必須滿足一些條件:

Mitmproxy作為標準網關(HTTP和HTTPS):對於HTTP和HTTPS代理,運行mitmproxy的伺服器當然必須能夠攔截IP數據包 - 這意味著它必須位於數據包路徑的某處。 實現此目的的最簡單方法是將客戶端設備中的默認網關更改為mitmproxy伺服器地址。

可信的mitmproxy CA(僅限HTTPS):要使HTTPS代理工作,客戶端必須知道(並信任!)mitmproxy CA,即必須將CA密鑰文件添加到客戶端的信任存儲。

1.3。 更多細節

如果描述不夠詳細:在項目的官方網站上,有一個關於mitmproxy如何工作以及其不同模式的mitmproxy的解釋。

mitmproxy.org/doc/howmi

mitmproxy - home

2.安裝並運行mitmproxy

在這個小小的理論會話之後,讓我們下定決心。

2.1。安裝mitmproxy

mitmproxy的安裝非常簡單,因為它是使用Python包管理系統(pip)打包的。 apt-get可以安裝其他的mitmproxy依賴項:

apt-get install python-pyasn1 python-flask python-urwid python-dev libxml2-dev libxslt-dev libffi-dev

pip install mitmproxy

2.2。在手機中安裝mitmproxy CA證書

接下來,您需要在要捕獲/更改HTTPS連接的設備中安裝mitmproxy生成的CA證書。這可以是桌面瀏覽器或手機(Android,iOS,...)。 mitmproxy文檔有一個很好的部分,告訴你如何做到這一點。

以下是摘要:(Android)

將位於?/ .mitmproxy / mitmproxy-ca-cert.cer的證書上傳到您的Android設備的/sdcard/Download/mitmproxy-ca-cert.cer。

轉到設置,安全性,然後單擊「從設備存儲安裝」

輸入「mitmproxy-ca-cert」(無後綴!),然後單擊「確定」

現在點擊「可信憑證」並選擇「用戶」標籤。證書現在應該出現在列表中。

2.3。 啟用IP轉發和埠重定向

mitmproxy應用程序內部運行在TCP埠8080上,但外部必須監聽埠80 / HTTP和443 / HTTPS。 因此,一般IP轉發(系統必須作為路由器),並且從8080到80和443的重定向對於所有到達的IP分組是必需的。

iptables的「nat」表可以很容易地做到這一點。 這也在mitmproxy手冊的Linux部分中描述。

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080

我不清楚為什麼應用程序不是綁定到埠80和443埠,但這是現狀,用就是了。

2.4。 啟動mitmproxy

如上所述,mitmproxy在埠8080上運行,但也需要綁定80和443,所有三個埠不能被任何其他應用程序同時使用。 所以只需停止可能阻止這些埠的任何東西(Apache Web伺服器,Tomcat,Glassfish等)。 如果您不確定,請查看netstat -ntap。

重要的注意事項:mitmproxy具有選項「-p」,它允許您選擇與8080不同的埠。當我嘗試此選項時,此選項對我來說不起作用。 雖然它在給定的埠聽,但沒有請求被攔截。 顯示器保持空白。 不幸的是,我花了三個小時找這個原因。

要實際啟動mitmproxy,只需運行以下命令:

mitmproxy -T --host

你會看到一個空白的黑色屏幕,底部有一個藍色的條形碼,沒有任何事情會發生,因為您的手機(或瀏覽器)尚未通過mitmproxy進行通信。 熟悉用戶界面,閱讀官方網站上的文檔,然後輸入幫助頁面。

2.5。 更改手機的標準網關

為了能夠窺探您的手機(或瀏覽器)HTTP / HTTPS連接,您需要將標準網關更改為mitmproxy伺服器的IP地址。

您可以在Android上執行此操作,如下所示:

轉到設置,Wi-Fi並長按所連接的網路。

選擇「修改網路配置」。

選中「顯示高級選項」,將IP設置設置為「靜態」,並手動將網關地址更改為mitmproxy伺服器地址。 點擊「保存」。

2.6。 捕獲並更改HTTP / HTTPS請求和響應

更改設置後,開始與設備進行交互(轉到facebook.com,更新您的WhatsApp狀態,打開瀏覽器)。 如果一切正常,您應該在mitmproxy屏幕上看到很多HTTP和HTTPS(!)請求。

您可以使用箭頭鍵上下導航。 如果你喜歡,按返回鍵更詳細地查看請求。

您會注意到,沒有機會更改任何請求。 發生後你可以簡單地看看他們。 要實際截取,更改然後發送請求(或響應),您必須設置一個截取過濾器。 要這樣做,請按i並輸入一個過濾器表達式,例如「facebook.com」(攔截其URL中包含「facebook.com」的所有請求)或簡單地「。*」(截取所有請求/響應)。

在UI中,被檢測的流將顯示為橙色。 在您接受(不管或不編輯它們)之前,它們將不被進一步處理。 要接受流量,請按a。 要接受所有持有流量,請按A.

也可以通過按返回鍵更詳細地檢查截取的流。 然而,與之前相反,也可以通過按e鍵進行編輯。 根據您選擇的模式,您可以編輯請求的不同部分:標題,正文等 - 使用vim或其他編輯器。

2.7。 停止mitmproxy並取消iptables更改

在停止mitmproxy之前,請確保您不想保存任何流。 如果你要保存那麼用w 若要退出,請按q然後按y。

要撤消我們之前做過的iptables更改,只需鍵入iptables -t nat -F(flush / delete整個表)。 如果您有任何其他nat表條目,您可能需要逐個刪除條目。 如果不確定,請先檢查iptables -t nat -L。

如果需要,也可以通過鍵入sysctl -w net.ipv4.ip_forward = 0撤銷IP轉發設置。


推薦閱讀:
相關文章