利用Fiddler和Wireshark解密SSL加密流量


原文地址:http://kelvinh.github.io/blog/2014/01/12/decrypt-ssl-using-fiddler-and-wireshark/

Fiddler是一個著名的調試代理工具,它不僅能解析HTTP,而且還能解析加密的HTTPS流量。Wireshark則是一個非常強大的網絡包監控以及協議分析工具。 在本文中,只考慮使用SSL來加密HTTP,所以並不嚴格區分SSL和HTTPS,雖然從廣義上來講,將二者混為一談是非常不合理的 。

看到這里,大多數人都會很困惑:Fiddler不就能解密SSL流量嗎?為什么還需要Wireshark呢?

是的,在大多數情況下,用Fiddler來解密SSL已經足夠了,但在實際使用過程中,我們發現Fiddler在解決HTTP長連接時無能為力。對於特定的應用,比方說Office365的Microsoft MAPI over HTTP,它總是在Outlook和Office365 Exchange server之間維護一個HTTP長連接,並且利用HTTP chunk的特性,在有更新時返回一個chunk來達到實時將server端的變化告知給Outlook的目的。但是Fiddler不能很好地handle這種情況,它總是期望在HTTP response全部返回之后再顯示出來。所以,在上述應用中,Fiddler不僅不能實時顯示HTTP通信中的內容,而且,即使一個長連接斷開之后,它顯示的HTTP response也是無效的內容。

所以,我們就想到了Wireshark,它總是能實時監控網絡流量。可是我們要監控的HTTP流量是經過SSL加密的,所以它必須要加密SSL流量的private key,才能解密這個SSL流量。因此,直接攔截網絡流量是行不通的,因為server端的private key我們無法拿到。

於是,這兩種情況綜合一下,就促成了我們的解決方案:將Fiddler作為SSL代理以提供private key,然后用Wireshark實時監控以解密流量。

SSL介紹及SSL代理原理

SSL(Secure Socket Layer)是Netscape公司設計用來加密Internet通信流量的,最新版本更名為TLS(Transport Layer Security)。它采用X509證書加密來保證通信的保密性和可靠性。加密采用的證書通常由第三方證書頒發機構頒發,而這些機構是被信任的,也就是說,它們不會利用這些頒發的證書來進行竊聽等行為。基於此前提,SSL協議本身能夠保證:如果發生了竊聽,那么用來加密的證書必定是不受信任的(除非用戶將這些證書添加到其受信任證書列表中)。

SSL代理——換種說法,其實就是 Man-in-the-Middle 攻擊。SSL代理,即是用自己的證書替代原來server端的證書(SSL雖然支持通信兩方都提供證書,但目前絕大多數支持HTTPS的服務,都只是一方認證,即server提供證書,不要求client也提供受信任的證書,所以SSL代理只需要替代server端的證書即可),從而解密流量。但這樣一來client端就會發現server端證書不是受信任的,但因為這只是我們自己的測試,所以我們需要信任代理生成的證書。

設置解密環境

要同時使用Fiddler和Wireshark,我們需要兩台機器:機器A運行Fiddler作為代理,機器B運行Outlook,並且將系統代理設置成機器A以將所有流量導到機器A。然后在機器B上用Wireshark監聽。之所以不能只用一台機器,是因為Wireshark的Windows版本在默認情況下,不支持loopback監聽,簡單說來,就是對127.0.0.1的監聽。之於為什么、以及如何讓其實現loopback監聽,可以參看這里這里。最終的流程如下所示:

+------------+ +------------+ +-----------------+ | Computer A | Wireshark | Computer B | | | | +---------->| +------>| Exchange Server | | Outlook | | Fiddler | | | +------------+ +------------+ +-----------------+

設置Fiddler並導出根證書到受信任列表

Fiddler作為一個能夠代理所有HTTPS流量的工具,它需要提供所有網站的HTTPS證書。因此,最通用的做法,是自簽一個根證書,然后用這個根證書來簽發所有domain的證書,作為client,只需要信任這個根證書即可。這個方法也是流行的梯子工具——goagent所采用的。但是,Fiddler自己生成證書的工具 makecert.exe 並不提供導出其生成證書(包括根證書和生成的各個domain的證書)的private key的方法,因此,我們需要安裝一個Fiddler的插件—— CertMaker 來代替Fiddler作為證書生成工具,因為這個工具可以看到private key。

CertMaker插件並不影響Fiddler解密SSL的設置,它只是替換了Fiddler默認的證書生成過程。在Fiddler中執行以下設置:

fiddler SSL decryption settings圖1. SSL解密設置,這個會自動導入根證書到Windows證書管理器的受信任列表

fiddler remote proxy settings圖2. 打開“允許遠程連接”的選項,保存后需要重啟Fiddler

別忘了,我們有兩台機器,因此,在機器B上面也需要將根證書添加到受信任列表。打開機器B的Windows命令行,輸入 certmgr 打開證書管理器,然后將導出的根證書分別添加到Personal和Trusted Root Certification Authorities下面的Certificate里,具體操作為:在Certificate上點擊右鍵,選擇"All Tasks"->"Import",然后選擇證書存放的位置,確定即可。

導出Fiddler生成證書的private key

在使用了CertMaker插件之后,我們能看到Fiddler的根證書的private key了。 但需要注意的是,我們需要的,不是Fiddler的根證書的private key,而是監視網站的private key。例如,如果我們要監視和https://www.example.com的通信流量,我們需要Fiddler針對這個domain簽發的證書的private key 。所以,要做到這點,需要在Fiddler中設置一個屬性:

  1. 在Fiddler界面左下角輸入框輸入 about:config 並回車
  2. 在右側的about:config標簽中添加 fiddler.certmaker.bc.LogPrivateKeys ,並設置為 True

因為在還沒有連接要監聽的HTTPS網站時,Fiddler是不會自動為其生成證書的,而是在連接之后才會為其生成證書。所以,我們打開Wireshark,然后運行Outlook,在連接Exchange HTTPS服務器之后,Fiddler會為這個domain生成證書,現在在其Log標簽頁就可以看到這個證書了,是Base64編碼的,我們將其拷貝出來,保存成文件。 注意:直接保存到文件不符合pem證書文件的格式,我們需要在文件的開頭和結尾分別加上以下內容:

-----BEGIN PRIVATE KEY----- Base64 encoded private key here -----END PRIVATE KEY-----

導入private key到Wireshark

在Wireshark中,打開Edit->Preferences->Protocols->SSL,然后點擊RSA keys list的Edit按鈕,點擊New,添加一個新的Rule,IP和Port設置為代理機器A的地址和端口,然后Protocol設置為http,Key File選擇我們剛生成的文件,然后確定,如下圖:

wireshark SSL decryption settings圖3. 在Wireshark中添加新的SSL private key

好了,現在在Wireshark中,是不是就可以看到已經解密的綠色的HTTP流量了呢?


免責聲明!

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



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