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. edit this cookie chrome插件 (HttpAnalyzerStdV3 获取Cookie 后,再用edit this cookie添加cookie)

    插件下载地址及安装方法:http://www.bkill.com/download/154494.html 博客提供下载地址:https://files.cnblogs.com/files/Fooo/ ...

  2. redis 双写一致性 看一篇成高手系列1

    首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用.在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作. 但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存.又或者 ...

  3. 【java】final修饰符介绍

    final: 最终,作为一个修饰符特点:1.可以修饰类,函数,变量2.被final修的的类不能被继承.因此类用final修饰可以避免被继承,被子类重写功能.3.被final修饰的方法不可以被重写.4. ...

  4. jekins构建触发器详解

    jenkins版本:2.89.2 1.触发远程构建 (例如,使用脚本):通过一个网址的访问来触发构建,这样就不需要登录jenkins系统也能触发构建了. 示例地址: http://localhost: ...

  5. Avalon Master 外设

  6. 如何查看安装python和numpy的版本

    命令行下查看python和numpy的版本和安装位置 1.查看python版本 方法一: python -V 注意:‘-V‘中‘V’为大写字母,只有一个‘-’ 方法二: python --versio ...

  7. Maven CXF wsdl2Java List<Xxx>生成ArrayOfXxx包装对象 解决方法

    添加-xjc-Xxew解决,同时还要给插件添加相应的jar包,如下: <plugin> <groupId>org.apache.cxf</groupId> < ...

  8. Python 多线程、进程

    本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...

  9. jenkins Manage and Assign Roles使用

    1.安装插件  Role-based Authorization Strategy 2.使用插件 3.进入 Manage and Assign Roles  配置Pattern 匹配项目, 如果要匹配 ...

  10. 剑指offer例题——二进制中1的个数

    题目:输入一个整数,输出该二进制表示中1的个数.其中负数用补码表示. 首先明确补码的定义: 原码 反码 补码 将最高位作为符号位(0表示正,1表示负), 其它数字位表达数值本身的绝对值的数字表示方式 ...