当前位置:   article > 正文

心脏滴血漏洞和攻击_tls心跳协议作用

tls心跳协议作用

心跳协议

  1. 心脏滴血漏洞时OpenSSL的TLS/SSL拓展实现的一个缺陷,安全传输层协议为相互通信的应用程序提供了安全信道,在该信道内传输的数据是受保护的,OpenSSL这个开源项目为TLS/SSL提供了一个商业级的全功能工具包。
  2. TLS引入了一个叫作心跳的拓展协议,这个协议很简单,它让通信双方不时地发送心跳包给对方,这样操作系统和防火墙就知道信道是活跃的,不会终极它,发送方发出的心跳请求包内装有载荷,但载荷的内容并不重要,接收方构建一个心跳回复包,把它返回给发送放,回复包应该携带和请求包相同的载荷内容,回复包的构建是心脏滴血攻击的原因。
  3. 构建回复包的代码如下所示:
unsigned int payload;
unsigned int padding = 16;
hbtype = *p++;
n2s(p,payload);
p1 = p;
if(hbtype == TLS1_HB_REQUEST)
{
	unsigned char *buffer,*bp;
	int r;
	buffer = OPENSSL_malloc(1 + 2 + payload + padding);
	bp = buffer;
	*bp++ = TLS1_HB_RESPONSE;
	s2n(payload, bp);
	memcpy(bp, p1, payload);
	bp + = payload;
	RAND_pseudo_bytes(bp,padding);
}	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 上述代码把指针p移动到发送方的载荷长度字段,得到该长度,然后把它存到变量payload中之后,程序为回复包构建了一个缓冲区,缓冲区的大小由payload和padding的值决定,一旦准备工作完成,程序用memcpy()函数把载荷内容复制到新创建的缓冲区中,仔细观察memcpy(bp,p1,payload)语句,这条语句从p1指向的内存开始复制payload个字节的数据到bp处的缓冲区。
  • 实现方法的缺陷:回复包的内容是请求包中的载荷复制而来的,但是具体复制多少数据不是由载荷的实际大小决定,而是发送方声称的大小决定的。

发动心脏滴血攻击

  1. 当这个包到达接收方时,分配该包的内存大小由其实际大小决定,而不是由载荷长度字段的值决定,因此,如果声称载荷的长度比实际载荷还要大,memcpy()函数除了会复制请求包中的数据,还会复制更多数据到回复包。
  2. memcpy()函数会超过载荷区域的边界继续从内存中复制数据到回复包,受影响的内存可能存储敏感信息,例如密码、信用卡账户或者用户的其他信息,导致这些数据被复制到回复包发送给攻击者。
  3. 搭建攻击环境
  • 基于Ubuntu12.04,使用了一个Elgg的开源社交网络应用,这个网络协议使用HTTPS方式部署的,网址时https://www.heartbleedlabelgg.com,HTTPS协议使用了OpenSSL库,虚拟机中的OpenSSL库的版本是还没有修复漏洞的旧版本,因此仍然存在心脏滴血攻击。
  • 为了从攻击者端访问部署在受害者端的Elgg网站,需要修改攻击者端的/etc/hosts文件,把www.heartbleedlabelgg.com映射到受害者端的IP地址,假设受害者端的IP地址为10.0.2.6,在/etc/hosts中添加如下条目:
10.0.2.6 www.heartbleedlabelgg.com
  • 1
  1. 请求包是一种特殊类型的TLS记录,它的第一个组成元素是TLS记录头,以下代码展示了如何构建一个心跳请求包:
def build_heartbeat(tls_ver):

    heartbeat = [

0x18,       # Content Type (Heartbeat)

0x03, tls_ver,  # TLS version

0x00, 0x29,  # Length

# Payload

0x01,       # Type (Request)

0x00, 0x16,  # Payload length

0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,

0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,

0x41, 0x41, 0x41, 0x41, 0x41, 0x42
0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C,

0x4D, 0x4E, 0x4F, 0x41, 0x42, 0x43, 0x44, 0x45
    ] 

    return heartbeat

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • TLS记录的大小是0x29(不包含记录头),这是TLS中载荷的大小,请求包在内存中所占空间大小基本上是由这个载荷大小决定的,在该TLS载荷中存放是一个心跳请求包,它有字节的头部、负载和填充,这个头部也有一个长度字段,它描述了心跳协议的载荷大小,决定有多少个字节需要复制到响应包中,在上述代码中长度字段的值是0x0016,这和载荷的实际长度相符。
  • 修改请求包头部的载荷长度字段:
$ attack.py www.heartbleedlabelgg.com -l 0x0016
  • 1
  • 使用上述命令时,可以尝试不同的值,0x0016是和实际载荷长度相符的值,因此不会从服务器得到更多的信息,如果增加这个值,就会得到更大的回复包,attack.py程序会把从服务器得到的数据的打印出来,如果把长度增加到0x4000,让它远远大于实际载荷的长度(22字节),会从服务器得到更多数据。
$ attack.py www.heartbleedlabelgg.com -l 0x4000
  • 1
  • 服务器可能会返回一些有趣的数据,例如admin的密码seedadmin,显然,admin用户登录到了网络服务器,因此他的用户名和密码仍然在内存中,当服务器构建心跳回复包时,他从内存中复制了很多敏感数据给攻击者。
  • 实际被返回的数据取决于请求包存放的地方已经服务器内存中当前存储的数据,如果在攻击之前没有用户登录服务器,那么内存中可能没有有价值的信息。

修复心脏滴血漏洞

  1. 修复心脏滴血漏洞并不困难,只需要更新操作系统的OpenSSL库即可:
$ sudo apt-get update
$ sudo apt-get upgrade
  • 1
  • 2
  • 第一行更新可获得的安装包以及它们的版本,包括OpenSSL库,但这个命令并不下载安装包,第二个命令对安装包进行下载和安装。
  1. OpenSSL是如何修复这个漏洞:
hbtype = *p++;
n2s(p, payload);
if( 1 + 2 + payload + 16 > s->s3->rrec.length)
	return 0;
p1 = p;
  • 1
  • 2
  • 3
  • 4
  • 5
  • s->s3->rrec.length是请求数据包的真实长度,1+2+payload+16是请求数据包的声称长度,如果声称长度大于真实长度,就丢弃数据包。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/741430
推荐阅读
相关标签
  

闽ICP备14008679号