心脏滴血漏洞复现及流量分析

0x01 心脏滴血漏洞影响版本

1、openssl版本在1.0.1-1.0.1f(包含1.0.1f)以及 1.0.2-beta
2、openssl开启心跳机制

0x02 心脏滴血漏洞原理

TLS心跳指的是用户向服务器发送数据包,服务器返回一个相同的数据包以确定彼此在线,以支持持续通信功能。
用户向服务器发送的心跳数据中用两个字节表明有效负载数据长度,而服务器端OpenSSL将根据这个有效负载长度构造一个新的数据包会送给对端。

简单的说,服务器端得到数据包,数据包长度为plen_real,而数据包中包含一个字节表明有效负载数据长度plen_fake,数据包剩下的部分是有效负载数据,长度为plen_real-1。整个数据包存储在一个char型数组之中。而服务器端构造新数据包时,先分配一段plen_fake+1的内存空间,前两个字节存放plen_fake,之后使用memcpy从收到的数据包有效负载数据起始位置向新数据包拷贝plen_fake字节数据。正常情况下plen_fake = plen_real-1,当用户有意设置plen_fake大于实际有效负载长度plen_real-1时,服务器就会发送plen_fake长度的数据,其中包括plen_fake - plen_real-1长度的数据,这些数据可能是一些用户密码或者密钥,这些数据最大长度为64KB,2^16。

0x03 心脏滴血流量分析

利用vulhub-master中的漏洞容器和ssltest.py验证脚本测试。
1、tcp三次握手
2、客户端发送client hello
3、服务器发送Server Hello, Certificate, Server Key Exchange, Server Hello Done
4、客户端发送heartbeat request
心跳消息中payload length为16384即为伪造的长度,实际只有3个长度。
DeepinScrot-3913.png
5、服务器返回heartbeat response
服务器接收了heartbeat request后,误认为心跳消息的长度为16384,所以返回真实的16384字节数据,而实际心跳payload只有3字节,所以将泄露内存中的16381字节。
DeepinScrot-0607.png

0x04 攻击特征总结

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漏洞攻击主要由于攻击者构造异常的心跳数据包,即心跳包中的长度字段与后续的数据字段不相符合,来获取心跳数据所在的内存区域的后续数据。

0x05 如何手工检测心脏滴血漏洞

对于不便用脚本攻击的,可以手动登录服务器检测。
1、首先检测openssl版本

openssl version

2、检测是否开启了心跳扩展

openssl s_client -connect 你的网站:443 -tlsextdebug 2>&1| grep 'TLS server extension "heartbeat" (id=15), len=1'
参考文档:
https://www.cnblogs.com/zafu/p/9332327.html
https://blog.csdn.net/caozhk/article/details/23738971
https://segmentfault.com/a/1190000000461002
Last modification:December 4th, 2019 at 11:47 pm

Leave a Comment