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. 1.1.21 Word修改文章目录

    1.选中目录后,右键[编辑域],选择[索引和目录].选择[TOC],点击右侧的[目录]. 2.选中[目录]后,按照如下[1][2][3]顺序,按格式要求修改目录即可.

  2. 如何将极客时间课程制作成kindle电子书

    订阅了几个极客时间的专栏,一直没有时间去看. 最近,想着如果把内容制作成电子书,利用上下班时间学习一下,岂不是很方便? 在网上搜到一个很好用的开源软件,几分钟就可以把极客时间的专栏做成电子书,简直太棒 ...

  3. 由override 和 overload 引发的学习感悟

    工作已三年的我,竟然面试的时候去裸考了.想当然的认为有很多东西会在工作中不知不觉积累下来,现在想想,真是扯淡... 我的三年的工作经验是开发测试的工作,主要负责测试用例的自动化实现,稍深一些的是自动化 ...

  4. opencv::将两幅图像合并后,在同一个窗口显示;并将合并的图像流保存成视频文件

    /** * @file main-opencv.cpp * @date July 2014 * @brief An exemplative main file for the use of ViBe ...

  5. oData 排序字段生成

    跟踪SQL 发现生成的SQL中所有的字段都进行了排序,查看OData原代码,发现如果实体有Key,就按照Key asc 加上指定字段进行排序 属性 EnsureStableOrdering可以控制是否 ...

  6. [UE4]Menu Anchor,菜单锚点

    一.想要弹出某个菜单的时候,Menu Anchor可以做为菜单弹出的位置. 二.Menu Anchor本身不显示任何东西 三.Menu Class:选择要弹出的UI,可以是任意的UserWidget ...

  7. 刘志梅 201771010115 《面向对象程序设计(java)》 第八周学习总结

    实验六 接口的定义与使用 实验时间 2018-10-18 1.实验目的与要求 (1) 接口定义:接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义:由常量和一组抽象方法组成:接 ...

  8. μC/Probe尝鲜

    μC/Probe 1.添加文件 2.配置probe_com_cfg.h 2.1.选择接口 #define PROBE_COM_CFG_RS232_EN DEF_ENABLED /* Configure ...

  9. day32基于tcp协议的远程执行命令

    客户端 from socket import *import structimport json client = socket(AF_INET, SOCK_STREAM)client.connect ...

  10. IntelliJ IDEA 构建maven多模块项目

    我们在开发中 因为项目之间需要依赖 所以会在maven创建多个项目配置依赖,这种项目结构主要应用在大型项目中,多人协作开发 1.创建一个项目 File ->NEW -> Projec 2. ...