震惊全球的“心脏出血”漏洞 OpenSSL“心脏出血”漏洞是一个非常严重的漏洞。
这个漏洞使攻击者能够从内存中读取多达64 KB的数据,只要漏洞存在,无需任何特权信息或身份验证,就可以获取证书私钥、用户名与密码、聊天工具的消息、电子邮件以及重要的商业文档和通信等数据。
心脏出血(英语:Heartbleed),也简称为心血漏洞,是一个出现在加密程序库OpenSSL的安全漏洞,该程序库广泛用于实现互联网的传输层安全(TLS)协议。它于2012年被引入了软件中,2014年4月首次向公众披露。只要使用的是存在缺陷的OpenSSL实例,无论是服务器还是客户端,都可能因此而受到攻击。此问题的原因是在实现TLS的心跳扩展时没有对输入进行适当验证(缺少边界检查),因此漏洞的名称来源于“心跳”(heartbeat)。该程序错误属于缓冲区过读,即可以读取的数据比应该允许读取的还多。
OpenSSL在实现TLS和DTLS的心跳处理逻辑时,存在编码缺陷。OpenSSL的心跳处理逻辑没有检测心跳包中的长度字段是否和后续的数据字段相符合,攻击者可以利用这一点,构造异常的数据包,来获取心跳数据所在的内存区域的后续数据。这些数据中可能包含了证书私钥,用户名,用户密码,用户邮箱等敏感信息。该漏洞允许攻击者从内存中读取多达64KB的数据。数据包分析
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响应包中产生数据溢出,造成有用数据泄露。
探测数据包
心脏出血漏洞必须在含有心跳扩展和漏洞没有被修复的版本中存在,目前存在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对攻击的请求包和响应包进行捕获(这里我们要结合靶场实战进行讲解)
分析 :
由于SSL记录协议位于某个可靠的传输协议(例如TCP)上面由于数据通过SSL加密处理后显示乱码,我们通过wireshark抓取的数据包主要通过16进制显示,所以像heartbeat_Request的数据包主要分为四部分:
(1)数据包帧头部分(在数据包中占14个字节)
(2)IPv4网络层部分(数据包中占20字节)
(3)TCP传输层部分(数据包中占20字节)
图片中方框标注的部分即为通过SSL加密的心跳数据包部分:
Content Type:Heartbeat 24(0x18)
Version:TLS1(0x0301)
Length:3(0x0003)
HeartbeatMessage: Type:Request(0x00)
payload Length:65535(0xffff)
payload
padding and HMAC
payload和padding都为空,利用漏洞将后面内存中的数据dump下来
分析:
(上图中为通过wireshark抓取的heartbeat_Response数据包的模块化展示,同样数据包分为帧头部分,IPv4网络层部分,TCP传输层部分以及SSL返回的数据部分)
图下数据为返回的心跳数据包详情展示,由于数据长度为16384个字节太长不好显示这边只截取一部分数据进行展示
18 03 01 40 00 02 ff ff为响应包数据特征:
0x18表示SSL数据包类型为心跳包
0x0301表示TLS的版本号:Version(TLSv1)
0x4000表示返回的数据包长度(1448)
0x02表示返回的心跳消息类型(Response)
0xffff表示返回的payload_length(1448)
剩余的数据即为通过心脏出血漏洞从内存中dump下来的数据(payload和padding)
由于请求包(Request)中的长度为0x0003(3)但是要返回的payload_length为0xffff(1448),所以响应包(Response)返回的数据长度为0x4000(1448)即漏洞攻击成功。
特征总结:
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漏洞的数据包。
含有SSL加密的协议:
攻击流程:
1.探测目标所开放的端口
2.使用MSF对靶机进行漏洞探测
3.利用心脏滴血漏洞进行利用攻击
首先我们打开KALI里面的MSF漏洞检测利用工具然后设置好漏洞检测模块
use auxiliary/scanner/ssl/openssl_heartbleed
设置好他的基本配置
set RHOSTS
靶机ip地址
set RPORT
靶机的ssl端口(这里我使用的ssl端口为8443)
run或exploit
执行命令进行扫描是否存在此漏洞,如果有Heartbeat
response with leak的字样,证明该站存在HeartBleed漏洞
如果存在此漏洞我们继续设置一下VERBOSE,让VERBOSE为true这样我们才可以看到泄露的64kb数据
set VERBOSE true
设置好所有的东西以后我们就可以运行我们的漏洞利用模块了
首先我们打开bee-box靶场选择心脏滴血漏洞
查看一下他的ip地址
然后我们使用KALI中的MSF进行探测与攻击
目标存在心脏滴血漏洞,我们开始利用
可以看到一些泄露的数据,假如这是被攻击端正在输入一些私密的数据,我们就有可能获取到这些数据了。
在线漏洞检测地址:
https://filippo.io/Heartbleed/
修复方案:
更新OpenSSL到最新版本
漏洞复现成功,虽然说这个漏洞已经很古老了,但是我还是有必要讲解一下的,毕竟当年也是影响了一大批人的这么一个漏洞。