抓Https 加密數據,偷偷摸摸爽得很!

2022.09.02
抓Https 加密數據,偷偷摸摸爽得很!
Charles是可以抓取到HTTPS的明文信息的。在中間人場景中,它既作為客戶端發起請求,也作為服務端接收請求,然後在請求的轉發處獲取數據。

HTTPS是安全通道。如果瀏覽器導航欄前面有一個綠如A股的小鎖,那麼感覺就會非常的放心。

把自己見不得人的小心思和污言穢語,統統用這個小鎖鎖起來,為所欲為,想想就讓人激動。

但是等等,Charles為什麼能抓到HTTPS的包呢?

HTTPS簡單原理

我們希望數據傳輸過程,對用戶來說是個黑盒,對攻擊者來說也是個黑盒。這主要體現在兩方面。

  • 用戶不希望自己的敏感數據被獲取到。比如自己的賬號密碼,比如自己發給女友的聊騷數據。
  • 開發者不希望自己的數據被用戶獲取到。比如自己的驗簽方式,被破解了用戶就能幹很多非法的事情。

HTTP協議屬於一問一答的協議,在傳輸過程中是以明文方式傳遞的。

如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀懂其中的信息。比如通過代理方式或者局域網嗅探方式獲取了報文的內容。

相關的工具有很多,比如wireshark、tcpdump、dsniff等。

圖片

但如果傳輸的內容是加密的,那麼即使你把所有的數據報文都抓到了,那麼也沒有什麼價值。

HTTPS就是一種傳輸加密數據的協議。如果我們在TCP與HTTP中間,加入一個TLS/SSL​層,那麼就會變成HTTPS。

HTTPS包括握手階段和傳輸階段。其中握手階段是最重要的協商階段。

握手的目標,是安全的交換對稱密鑰,全程需要3個隨機數的參與。在Change Cipher Spec之後,傳輸的就都是加密後的內容了。

這個過程可以使用WireShark抓包工具輕易抓取,有大量的文章分析握手過程,在此不再贅述。

圖片

當然,HTTPS的效率是非常低的。這裡稍微擴展一下。

HTTP3,也就是谷歌的QUIC,除了解決了隊頭阻塞問題,還可以作為TCP+TLS+HTTP/2​的一種替代方案。HTTP3默認就是安全通道,採用UDP協議。在DH秘鑰交換算法的加持下,它可以減少連接建立時間- 在常見情況下為0 次RTT往返。

這比HTTPS的握手速度快多了。

圖片

Charles抓包

雖然HTTPS的傳輸過程是加密的,但如果我們就是請求的發起方,設備也在自己手裡,去抓包HTTPS連接中的內容,也是非常容易的。

這讓開發者很頭疼。比如我使用雲平台提供的AK、SK直接發起HTTPS調用,用戶是能夠抓到這兩個關鍵密碼的。所以一般開發者並不能直接把AK、SK在網絡上傳遞,即使這樣在功能上行得通。

我這里以在MacOS本機上抓包瀏覽器的HTTPS請求為例,來說明Charles的使用。

啟動Charles後,我們需要把它設置成系統代理。

圖片

然後,在Help/菜單下,找到Root證書進行安裝。

圖片

安裝完畢之後,我們還要信任這個證書。這樣,當你的瀏覽器訪問我們的Charles代理時,就可以暢通無阻。

安裝到System Keychains中,而且一定要信任它哦。

圖片

通常情況下,我訪問一個HTTPS連接,抓到的內容都是一團糟。

圖片

我們還差最後一步。默認情況下,Charles並沒有任何過濾,我麼還需要把要抓包的網址,加入HTTPS的代理配置中才可以。

右鍵找到這個連接,然後選擇啟動SSL代理即可。

圖片

此時,我們再看一下這些連接的內容,就能夠變成人眼能夠識別的了。

圖片

當然,電腦上的代理沒有什麼意義。我們做代理,一般是想要抓取手機上的應用產生的請求。

但方法是一樣的,你只需要把這個Root證書,安裝到你的手機中,然後信任它就可以了。

為什麼能夠抓到數據?

在這個案例中,Charles是作為中間人而存在的。對於Charles來說,對於服務端的請求,是由它發起的。

你可以把它想像成一個瀏覽器,它發出的請求和返回的內容,對於Charles自身來說自然是可見的。欺騙服務器很容易,重要的欺騙客戶端。

Charles通過偽造一個CA證書,來冒充一個服務端。當瀏覽器或者移動手機訪問Charles冒充的服務端時,Charles會攜帶CA證書返回給客戶端。

對於普通的CA證書來說,瀏覽器和客戶端是不信任的。這也是為什麼要進行HTTPS抓包,必須安裝CA證書的原因---我們需要把這個信任關係建立起來。

這兩部分是割裂的,可以說是由兩條完全不同的SSL通道。請求報文在全程是加密的,除了一個非常薄弱的交接點。

在通道的粘合處,所有的信息卻是明文的。Charles掌控了這個過程,自然就能夠把原始信息展示出來。

End

可以看到,Charles是可以抓取到HTTPS的明文信息的。在中間人場景中,它既作為客戶端發起請求,也作為服務端接收請求,然後在請求的轉發處獲取數據。

作為用戶,我們千萬不能隨意信任來歷不明的證書,否則你的很多隱私數據將暴露在陽光之下。

作為開發者,也不能把敏感數據直接放在URL或者請求體裡,防止用戶抓包獲取到這些信息,對服務造成破壞。

當然,在CN,隱私可能是個偽命題。就比如xjjdog,雖然我一直在隱藏自己,但還是有很多朋友知道我到底是不是帶把的。

這個時候,HTTPS就沒什麼用。

作者簡介:小姐姐味道 (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高並發世界,給你不一樣的味道。