利用中間人解密HTTPS數據
一、HTTPS協議
HTTPS協議網上有很多介紹的文章,這裏引用http://www.cnblogs.com/zhuqil/archive/2012/07/23/2604572.html(作者:朱祁林 出處:http://zhuqil.cnblogs.com 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。)的內容。
HTTPS其實是有兩部分組成:HTTP + SSL / TLS,也就是在HTTP上又加了一層處理加密信息的模塊。服務端和客戶端的信息傳輸都會通過TLS進行加密,所以傳輸的數據都是加密後的數據。具體是如何進行加密,解密,驗證的,且看下圖。
圖一 HTTPS協議會話過程
1. 客戶端發起HTTPS請求
這個沒什麼好說的,就是用戶在瀏覽器裏輸入一個https網址,然後連接到server的443端口。
2. 服務端的配置
採用HTTPS協議的服務器必須要有一套數字證書,可以自己製作,也可以向組織申請。區別就是自己頒發的證書需要客戶端驗證通過,纔可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面(startssl就是個不錯的選擇,有1年的免費服務)。這套證書其實就是一對公鑰和私鑰。如果對公鑰和私鑰不太理解,可以想象成一把鑰匙和一個鎖頭,只是全世界只有你一個人有這把鑰匙,你可以把鎖頭給別人,別人可以用這個鎖把重要的東西鎖起來,然後發給你,因爲只有你一個人有這把鑰匙,所以只有你才能看到被這把鎖鎖起來的東西。
3. 傳送證書
這個證書其實就是公鑰,只是包含了很多信息,如證書的頒發機構,過期時間等等。
4. 客戶端解析證書
這部分工作是有客戶端的TLS來完成的,首先會驗證公鑰是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那麼就生成一個隨即值。然後用證書對該隨機值進行加密。就好像上面說的,把隨機值用鎖頭鎖起來,這樣除非有鑰匙,不然看不到被鎖住的內容。
5. 傳送加密信息
這部分傳送的是用證書加密後的隨機值,目的就是讓服務端得到這個隨機值,以後客戶端和服務端的通信就可以通過這個隨機值來進行加密解密了。
6. 服務段解密信息
服務端用私鑰解密後,得到了客戶端傳過來的隨機值(私鑰),然後把內容通過該值進行對稱加密。所謂對稱加密就是,將信息和私鑰通過某種算法混合在一起,這樣除非知道私鑰,不然無法獲取內容,而正好客戶端和服務端都知道這個私鑰,所以只要加密算法夠彪悍,私鑰夠複雜,數據就夠安全。
7. 傳輸加密後的信息
這部分信息是服務段用私鑰加密後的信息,可以在客戶端被還原
8. 客戶端解密信息
客戶端用之前生成的私鑰解密服務段傳過來的信息,於是獲取瞭解密後的內容。整個過程第三方即使監聽到了數據,也束手無策。
二、HTTPS中間人思路
圖二 HTTPS的中間人模型
將Attacker插入到客戶端和服務器的通信鏈路上,對客戶端扮演服務器角色,對服務器扮演客戶端角色。如上圖所示,前面5個步驟和正常的HTTPS通信一致,後面的過程解釋如下:
1、圖一中第6步的crypt content with key,在圖二的第6步中並沒有,因爲Attacker並沒有真正的內容提供給Client,它需要扮演客戶端角色從Server獲取內容後再發送給Client;
2、7-12是一個正常的HTTPS請求過程(可參考圖一),其會話密鑰是key1;
3、第13步用key1 Decrypt之後得到明文的Response內容,並用key0對其加密後發送給Client;
4、第14步Client用key0解密Response內容,得到請求返回的內容。
三、解密SSL數據
由圖二可知,對於Attacker來說,它有會話密鑰key0和key1,可以利用key0解密得到Client與Attacker之間的HTTPS數據,也利用key1解密得到Attacker與Server之間的HTTPS數據,兩者效果一樣。
四、實現
假設Client爲Windows操作系統,Server爲www.server.com(IP:xxx.xxx.xxx.xxx),Attacker運行Linux操作系統。
1、DNS欺騙
本文不介紹DNS欺騙技術,而是利用hosts文件進行域名重定向來達到測試的目的。在C:\WINDOWS\system32\drivers\etc\hosts文件中添加
xxx.xxx.xxx.xxx www.server.com
通過修改hosts文件,Client訪問www.server.com就會被重定向到Attacker,Attacker再負責訪問真正的www.server.com。
2、僞造證書
cert.sh www.server.com
cat sslcerts/www.server.com-cert.pem sslcerts/private/www.server.com.pem > ps.pem
第一個命令是根據www.server.com的證書僞造一個證書,當然,僞造的證書並沒有經過任何CA機構的簽名。第二個命令則把僞證書的公鑰和私鑰合併到一個文件中,以備後用。
3、構造通通
stunnel -p ps.pem -d 443 -r 8080
stunnel -c -d 8080 -r www.server.com:443
Stunnel是一個自由的跨平臺軟件,用於提供全局的TLS/SSL服務,具體用法請自行查閱文檔。第一條命令在本地監聽443端口,提供TLS/SSL服務,並將數據轉發到本地的8080端口;第二條命令在本地監聽8080端口,接收上一個stunnel進程發送過來的數據,然後把數據轉發到www.server.com的443端口,從www.server.com:443回來的數據也可以轉發到8080端口,並轉交給第一個stunnel進程。
4、解密數據
第三小節提到,stunnel有會話密鑰key0、key1,可解密數據,因此對於stunnel,可以看到明文的HTTPS數據。但是現在我們不想修改stunnel,我們不在stunnel的進程空間中,因此訪問不到key0、key1以及明文數據。不過Attacker有僞證書對應的私鑰,可以利用該私鑰解密Client發送過來的密鑰密文,得到密鑰key0,進而解密HTTPS數據。具體做法如下:
①在Attacker機器上運行wireshark,點擊Edit→Preferences→Protocols→SSL,然後點擊RSA keys list右邊的Edit,然後輸入Attacker的ip地址,443端口,http協議以及ps.pem的文件路徑。
②wireshark開始嗅探數據,如果有Client訪問Server,wireshark就會嗅到數據,並利用剛纔輸入的私鑰信息解密會話密鑰,進而解密會話數據。
說明:正如前文提到的那樣,僞造的證書並沒有經過CA機構簽名,因此客戶端瀏覽器認爲證書並不可信,會進行警告。只有用戶忽略瀏覽器警告,後續的解密流程才得以繼續。
參考:
[1] http://www.webos-internals.org/wiki/Decrypt_SSL_%28trusted_man-in-the-middle_technique%29