使用 Wireshark + stunnel 來側錄 SSL 通訊

概述

起因是我想要看 VMware vSphere Client 的運作,但它有 SSL 保護着。

要看到它實際的通訊內容,就要在中間架一個 proxy ,強迫 client 使用 proxy (還要讓 client 接受 proxy 使用的假憑證),然後 proxy 再去跟原本的 server 溝通。

本來是這樣:client <—> server , client 會看到正常 server 的憑證

我要讓他這樣: client <—> proxy <—> server , client 與 proxy 之間使用的是 proxy 的假憑證(憑證是我們自己產生的,私鑰也在我們手上,所以可以解密 client 和 proxy 的通訊),proxy 和 server 之間則是使用正常的 server 憑證(我們沒有私鑰所以無法解密)。

我們要用 stunnel 來建 支援 SSL 的 proxy ,用 Wireshark 竊聽 client 和 proxy 之間的通訊,並將私鑰匯入 Wireshark ,使用 Wireshark 來解密。

環境:

  • client 跑在 KVM guest (虛擬機器)裏面,IP: 192.168.122.26 , windows 7
  • proxy 跑在 本機,同時也是 KVM host ,對 client 做 NAT ,對內 IP 是 192.168.122.1 (guest 的 default gateway 就設成這個), Ubuntu 12.04

設定 KVM guest 的簡單 NAT 我之後再寫一篇。總之先假設 KVM guest 的網路通了。

產生憑證

我是去 Webscarab 的 git repository 找到這個 script 來產生憑證的。

$ sh doc_cert.sh <servername>

這樣就可以產生憑證,servername 最好填真正 server 的 domain name ,如果沒有 FQDN ,就自己隨便寫一個 domain name 。

合併憑證和私鑰部分到同一個檔案以供 stunnel 使用:

$ cat sslcerts/servername-cert.pem sslcerts/private/servername-key.pem > blabla.pem

強迫 windows 使用 proxy

去 windows 的 hosts 檔案加入這一行:

192.168.122.1     <servername>

如此一來,這個 domain name 就會強制對應到我們 proxy 的 IP 。

啓動 proxy

有兩個部分,首先是啓動對 client 的 tunnel :

# stunnel -p blabla.pem -d 443 -r 8080

443 是要對 client listen 的 port ,8080 是要將 traffic redirect 到 port 8080

第二部分是 client mode 的 stunnel ( stunnel 假扮 client):

# stunnel -c -d 8080 -r servername:443

stunnel 自己扮演對 servername:443 建立 SSL 連線的 client ,traffic 來源是 port 8080

將私鑰匯入 wireshark

執行 Wireshark , 按 Ctrl+Shift+P 進入設定,在 Protocols 底下找到 SSL ,在 RSA keys list: 旁邊按 Edit , 然後按 新增 (Add) ;

IP address 填 proxy 的 IP ,192.168.122.1 ;

Port 填 proxy listen 的 port , 443 ;

Protocol 填解密後的 traffic 是什麼協定,Wireshark 解密後會呼叫這個 protocol dissector ,若不確定就填 data , Wireshark 就不會呼叫任何 dissector ;

Key File 填私鑰的路徑,/path/to/sslcerts/private/servername-key.pem

詳細說明見 Wireshark Wiki

開始竊聽

如果你要竊聽的 client 也是 KVM guest ,竊聽的界面請選 virbr0

若 Wireshark 沒有聽到完整的 SSL handshake 過程,就會無法解密哦,所以最好是開始竊聽之後再讓 client 開始發封包。

操作 client

就做你想要分析的動作就好了,像是登入之類的,在開始 SSL 連線的時候,client 應該會有一些警告說憑證有問題(未信任的憑證簽發者等等),這是當然的,因爲我們假造了憑證嘛,這時候只要按忽略就好啦。(不然 SSL 連線失敗的話你根本不能進行操作)

解密

做完你想要分析的動作,去 Wireshark 按 Stop Capture , 如果一切 OK , wireshark 應該就會直接把解密後的內容顯示出來囉。

不過我解密過程中的確是失敗了好幾次,有各種原因,需要瞭解 SSL 協定才能排除問題…之後再寫一篇吧。

成果

參考

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s