概述
起因是我想要看 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 協定才能排除問題…之後再寫一篇吧。
