Heartbleed心臟出血漏洞原理分析



Heartbleed心臟出血漏洞原理分析

1. 概述

   OpenSSL在實現TLS和DTLS的心跳處理邏輯時,存在編碼缺陷。OpenSSL的心跳處理邏輯沒有檢測心跳包中的長度字段是否和后續的數據字段相符合,攻擊者可以利用這一點,構造異常的數據包,來獲取心跳數據所在的內存區域的后續數據。這些數據中可能包含了證書私鑰,用戶名,用戶密碼,用戶郵箱等敏感信息。該漏洞允許攻擊者從內存中讀取多達64KB的數據。

2. 數據包分析

   SSL(Secure Socket Layer 安全套接層)及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網絡通信提供安全及數據完整性的一種安全協議。TLS和SSL在傳輸層對網絡連接進行加密。所以通過SSL或TLS協議加密后的數據包再通過wireshark軟件進行對數據包的抓取時,抓取到的數據也是經過加密處理的數據。
   DTLS(Datagram Transport Layer Security)數據包傳輸層安全協議。TLS不能用來保證UDP上傳輸的數據的安全,因此Datagram TLS試圖在現存的TLS協議架構上提出擴展,使之支持UDP,即成為TLS的一個支持數據報傳輸的版本。DTLS1.0基於TLS1.1,DTLS1.2基於TLS1.2
   心臟出血漏洞主要通過攻擊者模擬向服務器端發送自己編寫的Heartbeat心跳數據包,主要是HeartbeatMessage的長度與payload的length進行匹配,若payload_lenght長度大於HeartbeatMes sage的length,則會在服務器返回的response響應包中產生數據溢出,造成有用數據泄露。

TLS數據包格式

心跳包字段 長度 說明
ContentType 1byte 心跳包類型,IANA組織把type編號定義為24(0x18)
ProtocolVersion 2bytes TLS的版本號,目前主要包括含有心跳擴展的TLS版本:TLSv1.0,TLSv1.1,TLSv1.2
length 2bytes HeartbeatMessage的長度
HeartbeatMessageType 1byte Heartbeat類型 01表示heartbeat_request 02表示heartbeat_response
payload_length 2bytes payload長度
payload payload_length個bytes payload的具體內容
padding >=16bytes padding填充,最少為16個字節

DTLS數據包格式

心跳包字段 長度 說明
ContentType 1byte 心跳包類型,IANA組織把type編號定義為24(0x18)
ProtocolVersion 2bytes DTLS的版本號,DTLS1.0基於TLS1.1,DTLS1.2基於TLS1.2
epoch 2bytes 為一個計數器,每一個加密狀態改變時加一。主要用來區分在一個多次重新協商的情況,多個記錄包文可能會具有相同的序列號,因此再用這個域來區分,接收者可以用來區分不同的包。epoch初始值為0,每發送一個changeCipherSpec消息后加一
sequence_number 6bytes 記錄層的序列號,在每一個ChangeCipherSpec消息發送之后,sequence_number都設置為0
length 2bytes HeartbeatMessage的長度
HeartbeatMessageType 1byte Heartbeat類型 01表示heartbeat_request 02表示heartbeat_response
payload_length 2bytes payload長度
payload payload_length個bytes payload的具體內容
padding >=16bytes padding填充,最少為16個字節

2.1 探測數據包

   心臟出血漏洞必須在含有心跳擴展和漏洞沒有被修復的版本中存在,目前存在OpenSSL心血漏洞的OpenSSL版本有OpenSSL1.0.1,1.0.1a,1.0.1b,1.0.1c,1.0.1d,1.0.1e,1.0.1f,Beta 1 of OpenSSL1.0.2等。具體流程如下:

  • 搭建含有OpenSSL心臟出血漏洞靶機環境(具體靶機搭建操作詳情請看文檔:heartbleed靶機環境搭建)
  • 搭建擁有數據交互的https網站(Apache+MySQL+PHP5+HTTPS)
  • 心臟出血漏洞主要存在於OpenSSL的心跳機制里,判斷OpenSSL有沒有開啟心跳擴展,並開啟心跳擴展機制。
  • 在客戶端對虛擬機中搭建的靶場頁面進行訪問,同時在客戶端中通過POC程序對靶場進行攻擊
  • 通過wireshark對攻擊的請求包和響應包進行捕獲

4.1.1 請求包


TLS數據包(Hex)

這里寫圖片描述
18 03 02 00 03 01 40 00 

分析 

由於SSL記錄協議位於某個可靠的傳輸協議(例如TCP)上面由於數據通過SSL加密處理后顯示亂碼,我們通過wireshark抓取的數據包主要通過16進制顯示,所以像heartbeat_Request的數據包主要分為四部分:(1)數據包幀頭部分(在數據包中占14個字節)
(2)IPv4網絡層部分(數據包中占20字節)
(3)TCP傳輸層部分(數據包中占20字節)
圖片中方框標注的部分即為通過SSL加密的心跳數據包部分:
Content Type:Heartbeat 24(0x18)
Version:TLS1.1(0x0302)
Length:3(0x0003)
HeartbeatMessage:
Type:Request(0x01)
payload Length:16384(0x4000)
payload
padding and HMAC
payload和padding都為空,利用漏洞將后面內存中的數據dump下來

2.1.2 響應包


TLS數據包(Hex) 
這里寫圖片描述

18 03 02 40 00 02 40 00 d8 03 02 53 43 5b 90 9d …@..@….SC[..
9b 72 0b bc 0c bc 2b 92 a8 48 97 cf bd 39 04 cc .r….+..H…9..
16 0a 85 03 90 9f 77 04 33 d4 de 00 00 66 c0 14 ……w.3….f..
c0 0a c0 22 c0 21 00 39 00 38 00 88 00 87 c0 0f …”.!.9.8……
c0 05 00 35 00 84 c0 12 c0 08 c0 1c c0 1b 00 16 …5…………
00 13 c0 0d c0 03 00 0a c0 13 c0 09 c0 1f c0 1e …………….
00 33 00 32 00 9a 00 99 00 45 00 44 c0 0e c0 04 .3.2…..E.D….
00 2f 00 96 00 41 c0 11 c0 07 c0 0c c0 02 00 05 ./…A……….
00 04 00 15 00 12 00 09 00 14 00 11 00 08 00 06 …………….
00 03 00 ff 01 00 00 49 00 0b 00 04 03 00 01 02 …….I……..
00 0a 00 34 00 32 00 0e 00 0d 00 19 00 0b 00 0c …4.2……….
00 18 00 09 00 0a 00 16 00 17 00 08 00 06 00 07 …………….
00 14 00 15 00 04 00 05 00 12 00 13 00 01 00 02 …………….
00 03 00 0f 00 10 00 11 00 23 00 00 00 0f 00 01 ………#……
01 6b 87 3c 2a f7 db 30 ef 5c d2 68 0f 8b c6 10 .k.<*..0..h….
37 2e 33 36 0d 0a 41 63 63 65 70 74 3a 20 74 65 7.36..Accept: te
78 74 2f 68 74 6d 6c 2c 61 70 70 6c 69 63 61 74 xt/html,applicat
69 6f 6e 2f 78 68 74 6d 6c 2b 78 6d 6c 2c 61 70 ion/xhtml+xml,ap
70 6c 69 63 61 74 69 6f 6e 2f 78 6d 6c 3b 71 3d plication/xml;q=
30 2e 39 2c 69 6d 61 67 65 2f 77 65 62 70 2c 2a 0.9,image/webp,*
2f 2a 3b 71 3d 30 2e 38 0d 0a 52 65 66 65 72 65 /*;q=0.8..Refere
72 3a 20 68 74 74 70 73 3a 2f 2f 31 39 32 2e 31 r: https://192.1
36 38 2e 31 39 37 2e 31 32 38 2f 63 68 65 63 6b 68.197.128/check
2e 70 68 70 3f 6e 61 6d 65 3d 79 61 6f 66 65 69 .php?name=yaofei
26 70 61 73 73 77 6f 72 64 3d 31 32 33 34 35 36 &password=123456
0d 0a 41 63 63 65 70 74 2d 45 6e 63 6f 64 69 6e ..Accept-Encodin
67 3a 20 67 7a 69 70 2c 20 64 65 66 6c 61 74 65 g: gzip, deflate
2c 20 73 64 63 68 2c 20 62 72 0d 0a 41 63 63 65 , sdch, br..Acce
70 74 2d 4c 61 6e 67 75 61 67 65 3a 20 7a 68 2d pt-Language: zh-
43 4e 2c 7a 68 3b 71 3d 30 2e 38 0d 0a 0d 0a 9d CN,zh;q=0.8…..
47 d4 f2 b4 2e dc 63 f7 4c 28 bb 43 71 41 ca 00 G…..c.L(.CqA..
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….

分析 

(上圖中為通過wireshark抓取的heartbeat_Response數據包的模塊化展示,同樣數據包分為幀頭部分,IPv4網絡層部分,TCP傳輸層部分以及SSL返回的數據部分)
圖下數據為返回的心跳數據包詳情展示,由於數據長度為16384個字節太長不好顯示這邊只截取一部分數據進行展示
18 03 02 40 00 02 40 00為響應包數據特征:
0x18表示SSL數據包類型為心跳包
0x0302表示TLS的版本號:Version(TLSv1.1)
0x4000表示返回的數據包長度(16384)
0x02表示返回的心跳消息類型(Response)
0x4000表示返回的payload_length(16384)
剩余的數據即為通過心臟出血漏洞從內存中dump下來的數據(payload和padding) 
由於請求包(Request)中的長度為0x0003(3)但是要返回的payload_length為0x4000(16384),所以響應包(Response)返回的數據長度為0x4000(16384)即漏洞攻擊成功。

3. 特征總結

   OpenSSL心臟出血漏洞(heartbleed)的產生主要由於OpenSSL的心跳處理邏輯沒有檢測心跳包中的長度字段是否和后續字段相吻合導致攻擊者構造異常數據包,來直接獲取心跳數據所在的內存區域的后續數據。主要特征有:

  • heartbleed漏洞主要存在於有心跳機制的OpenSSL協議中。
  • IANA組織把開啟心跳擴展機制的SSL數據包type類型定義為24(0x18)。
  • heartbleed漏洞主要存在於TLS和DTLS兩種協議中,在含有heartbleed漏洞的OpenSSL協議中需要開啟心跳擴展機制(beartbeat),而含有心跳擴展機制的TLS版本主要包含在TLSv1.0(0x0301),TLSv1.1(0x0302),TLSv1.2(0x0303)三種版本中。
  • heartbleed漏洞攻擊主要由於攻擊者構造異常的心跳數據包,即心跳包中的長度字段與后續的數據字段不相符合,來獲取心跳數據所在的內存區域的后續數據。

   綜上所述我們可以通過對線網中的數據首先進行判斷是否為含有OpenSSL的數據包,同時通過對數據包中的type類型判斷數據包是否為心跳數據包,然后對TLS的版本進行匹配找到相應的含有心跳擴展機制的心跳數據包,最后通過對心跳包中的數據實際長度與長度字段定義的值比較,如果實際長度小於定義的長度則該數據包即為含有heartbleed漏洞的數據包。

4. 含有SSL加密的協議

協議 默認端口 說明
SMTPS 465 (SMTP-over-SSL)協議發送郵件協議
HTTPS 443 安全套接字層超文本傳輸協議
NNTPS 563 通過安全套接字層的網絡新聞傳輸協議
LDAPS 636 通過安全套接字層的輕型目錄訪問協議
ftps 990 通過ssl加密的ftp協議
IMAPS 993 郵件接收協議
POP3S 995 郵件接收協議

5. 參考資料

   Openssl “心血” 漏洞分析.

   Ubuntu下Apache https安裝和配置.

   Openssl漏洞POC學習.


免責聲明!

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



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