Heartbleed bug

article/2025/11/9 11:55:26

该漏洞被归为缓冲过度读取。缓冲过度读取错误是软件可以读取比应该被允许还多的数据。

1. 概述
Heartbleed错误(CVE-2014-0160)是OpenSSL库中的严重实施缺陷,它使攻击者能够从受害服务器的内存窃取数据。 被盗数据的内容取决于服务器内存中的内容。 它可能包含私钥,TLS会话密钥,用户名,密码,信用卡等。此漏洞是在执行Heartbeat协议,SSL / TLS使用它来保持连接活动。 本实验的目的是让学生了解这个漏洞的严重程度,攻击的工作原理以及如何解决这个问题。 受影响的OpenSSL版本范围为1.0.1到1.0.1f。 我们的Ubuntu VM的版本是1.0.1。

2. 实验环境
在本实验中,我们需要设置两个虚拟机:一个称为攻击者计算机,另一个称为受害服务器。我们使用预构建的SEEDUbuntu12.04 VM。 VM需要使用NAT网络适配器进行网络设置。这可以通过转到VM设置,选择网络,然后单击适配器标记将适配器切换到NAT-Network来完成。确保两个VM位于同一NAT网络上。此攻击中使用的网站可以是使用SSL / TLS的任何HTTPS网站。然而,由于攻击一个真实的网站是非法的,我们已经在我们的VM中设置了一个网站,并对我们自己的VM进行攻击。我们使用一个名为ELGG的开源社交网络应用程序,并将其托管在以下URL中:https://www.heartbleedlabelgg.com。
我们需要修改攻击者计算机上的/ etc / hosts文件,以将服务器名称映射到服务器VM的IP地址。搜索/ etc / hosts中的以下行,并将IP地址127.0.0.1替换为承载ELGG应用程序的服务器VM的实际IP地址。 127.0.0.1 www.heartbleedlabelgg.com

3. 实验任务
在进行实验任务之前,您需要了解Heartbeat协议的工作原理。 Heartbeat协议由两种消息类型组成:HeartbeatRequest包和HeartbeatResponse包。 客户端向服务器发送HeartbeatRequest包。 当服务器接收到它时,它在HeartbeatResponse数据包中发送一个接收到的消息的副本。 目标是保持持续连接状态。 协议如图1所示。
这里写图片描述
3.1 任务1:启动Heartbleed攻击。
在这项任务中,学生将在我们的社交网站上启动Heartbleed攻击,并看看可以实现什么样的损害。 Heartbleed攻击的实际损坏取决于服务器内存中存储的是什么类型的信息。 如果服务器上没有太多活动,您将无法窃取有用的数据。 因此,我们需要作为合法用户与Web服务器进行交互。 让我们以管理员身份执行操作,并执行以下操作:
这里写图片描述
在作为合法用户进行了足够的交互后,您可以启动攻击,并查看可以从受害服务器中获取的信息。 编写程序以从头开始执行Heartbleed攻击并不容易,因为它需要Heartbeat协议的低级知识。 幸运的是,其他人已经写了攻击代码。 因此,我们将使用现有代码在Heartbleed攻击中获得第一手的体验。 我们使用的代码称为attack.py,它最初是由Jared Stafford编写的。 我们对教育目的的代码做了一些小的改动。 您可以从实验室的网站下载代码,更改其权限,以便文件可执行。 然后,您可以运行攻击代码,如下所示:
$ ./attack.py www.heartbleedlabelgg.com
您可能需要多次运行攻击代码以获取有用的数据。 尝试看看是否可以从目标服务器获取以下信息。
• 用户名和密码。
•用户的活动(用户做了什么)。
•私人消息的确切内容。
对于你从Heartbleed攻击中窃取的每一个秘密,你需要显示屏幕转储作为证明,并解释你是如何进行攻击,以及你的观察是什么。
3.2 任务2:查找Heartbleed漏洞的原因
在此任务中,学生将比较良性数据包的结果和攻击者代码发送的恶意数据包,以找出Heartbleed漏洞的根本原因。 Heartbleed攻击基于Heartbeat请求。这个请求只是发送一些数据到服务器,并且服务器将数据复制到其响应数据包,所以所有的数据被回送。在正常情况下,假设请求包括3个字节的数据“ABC”,因此长度字段具有值3.服务器将数据放置在存储器中,并将3个字节从数据开始复制到其响应包。在攻击情形中,请求可以包含3字节的数据,但是长度字段可以表示为1003.当服务器构造其响应分组时,它从数据的开始(即“ABC”)复制,但是它复制1003字节,而不是3字节。这些额外的1000个类型显然不是来自请求包;它们来自服务器的私有内存,它们可能包含其他用户的信息,密钥,密码等。
在这个任务中,我们将使用请求的长度字段。首先,让我们了解Heartbeat响应数据包是如何从图2构建的。当心跳请求数据包到来时,服务器将解析数据包以获取有效负载和有效负载长度值(在图2中突出显示)。这里,有效载荷只是一个3字节的字符串“ABC”,有效载荷长度值正好为3.服务器程序将盲目地从请求数据包中取这个长度值。然后通过指向存储“ABC”的存储器并将有效载荷长度字节复制到响应有效载荷来构建响应分组。这样,响应包将包含3字节字符串“ABC”。我们可以启动HeartBleed攻击,如图3所示。我们保持相同的有效负载(3字节),但将Payload长度字段设置为1003.当构建响应数据包时,服务器将再次盲取该有效负载长度值。这一次,服务器程序将指向字符串“ABC”,并将1003字节从内存复制到响应包作为有效载荷。除了字符串“ABC”,额外的1000字节被复制到响应数据包,这可能是来自内存的任何东西,如秘密活动,日志信息,密码等。
我们的攻击代码允许你使用不同的有效载荷长度值。 默认情况下,该值设置为相当大的值(0x4000),但可以使用命令选项“-l”(letter ell)或“–length”减小大小,如以下示例所示:
这里写图片描述
你的任务是使用不同有效载荷长度值的攻击程序,并回答以下问题:
•问题2.1:随着长度变量减少,您可以观察到什么样的差异?
•问题2.2:随着长度变量减小,输入长度变量有一个边界值。 在该边界处或以下,心跳查询将接收响应分组,而不附加任何额外数据(这意味着请求是良性的)。 请找到边界长度。 您可能需要尝试许多不同的长度值,直到Web服务器发送回应,没有额外的数据。 为了帮助您,当返回的字节数小于预期的长度,程序将打印“服务器处理的格式错误的心跳,但没有返回任何额外的数据。
3.3任务3:对策和错误修复
要修复Heartbleed漏洞,最好的方法是将OpenSSL库更新到最新版本。 这可以使用以下命令实现。 应该注意的是,一旦更新,很难回到脆弱的版本。 因此,请确保在执行更新之前完成了先前的任务。 您还可以在更新之前创建VM的快照。
这里写图片描述
任务3.1在更新OpenSSL库之后再次尝试您的攻击。 请描述你的观察。
任务3.2此任务的目标是找出如何修复Heartbleed错误在源代码中。 以下C风格结构(与源代码不完全相同)是Heartbeat请求/响应数据包的格式。
这里写图片描述
分组的第一字段(1字节)是类型信息,第二字段(2字节)是有效载荷长度,随后是实际有效载荷和填充。 有效载荷的大小应该与有效载荷长度字段中的值相同,但在攻击情形中,有效载荷长度可以设置为不同的值。 以下代码段显示了服务器如何将数据从请求数据包复制到响应数据包。

/* Allocate memory for the response, size is 1 byte
2 * message type, plus 2 bytes payload length, plus
3 * payload, plus padding
4 */
5
6 unsigned int payload;
7 unsigned int padding = 16; /* Use minimum padding */
8
9 // Read from type field first
10 hbtype = *p++; /* After this instruction, the pointer
11 * p will point to the payload_length field *.
12
13 // Read from the payload_length field
14 // from the request packet
15 n2s(p, payload); /* Function n2s(p, payload) reads 16 bits
16 * from pointer p and store the value
17 * in the INT variable "payload". */
18
19
20 pl=p; // pl points to the beginning of the payload content
21
22 if (hbtype == TLS1_HB_REQUEST)
23 {
24 unsigned char *buffer, *bp;
25 int r;
26
27 /* Allocate memory for the response, size is 1 byte
28 * message type, plus 2 bytes payload length, plus
29 * payload, plus padding
30 */
31
32 buffer = OPENSSL_malloc(1 + 2 + payload + padding);
33 bp = buffer;
34
35 // Enter response type, length and copy payload
36 *bp++ = TLS1_HB_RESPONSE;
37 s2n(payload, bp);
38
39 // copy payload
40 memcpy(bp, pl, payload); /* pl is the pointer which
41 * points to the beginning
42 * of the payload content */
43
44 bp += payload;
45
46 // Random padding
47 RAND_pseudo_bytes(bp, padding);
48
49 // this function will copy the 3+payload+padding bytes
50 // from the buffer and put them into the heartbeat response
51 // packet to send back to the request client side.
52 OPENSSL_free(buffer);
SEED Labs – Heartbleed Attack 7
53 r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer,
54 3 + payload + padding);

请从清单1中的代码中指出该问题,并提供一个解决方案来修复该错误(即修复该错误需要进行哪些修改)。 你不需要重新编译代码; 只是描述如何解决您的实验报告中的问题。 此外,请对Alice,Bob和Eva关于Heartbleed漏洞的根本原因的以下讨论进行评论:Alice认为缓冲区副本中的根本原因是缺少边界检查; 鲍勃认为原因是缺少用户输入验证; Eva认为我们可以从包中删除长度值来解决一切。
4提交
学生需要提交详细的实验室报告,以描述他们做了什么和他们观察到了什么。 报告应包括支持观察的证据。 证据包括数据包跟踪,屏幕转储等。

原文地址:

http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Networking/Heartbleed/Heartbleed.pdf


http://chatgpt.dhexx.cn/article/rIPvFBNK.shtml

相关文章

CVE10大漏洞总结【网络安全】

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

sslscan工具在密评中的使用

一、 工具介绍 SSLScan是一个SSL/TLS快速扫描器,扫描结果默认将以不同颜色显示。其中,红色底色表示没有加密;红色表示可以破解的;黄色表示弱密码;紫色表示未知类型。 1、可以扫描出目标主机的所支持的SSL/TLS协议版本…

Android设备HeartBleed漏洞影响分析

一、HeartBleed漏洞的描述 近日,OpenSSL报出严重的安全漏洞,被称之为“心脏出血”漏洞。通常情况下,SSL/TLS加密用于互联网通信中,如Web、电子邮件、即时消息(IM)和一些虚拟专用网络(VPN&#x…

Philosophy of life: growing flowers in your heart

Growing flowers in your heart An aged man lived in a nice cottage(小屋、别墅) with a large garden in a town in England. He is seen busy looking after his flowers all time. 第一部分介绍的是: 有一个老人在英格兰的镇上有一个带大花园的屋子…

vulhub漏洞—Heartbleed

漏洞描述: 心脏出血是OpenSSL1.0.1版本至OpenSSL1.0.1f Beta1版本中存在漏洞,该漏洞中文名称为心脏滴血,英文名称为HeartBleed。其中Heart是指该漏洞位于心跳协议上,Bleed是因为该漏洞会造成数据泄露。即HeartBleed是在心跳协议上…

HeartBleed漏洞详解与利用

看一下流传的Python利用脚本。 #!/usr/bin/python # Quick and dirty demonstration of CVE-2014-0160 by Jared Stafford (jspenguinjspenguin.org) # The author disclaims copyright to this source code. import sys import struct import socket import time import selec…

利用 heartbleed 漏洞

一、Heartbleed的知识点 1.引言: 最初人们为了网络通信安全,就开始使用安全协议进行加密通信,SSL(Secure Socket Layer)就是一种安全协议。随着开源软件的流行,有人写了一款叫 OpenSSL 的开源程序供大家…

openssl HeartBleed漏洞复现

简介: 心脏滴血漏洞于2014年被爆出,攻击者可以通过构造特殊的数据包,远程读取特定服务器内存中64K的数据,获取内存中的敏感信息。因openssl应用广泛,故影响较大。 原理: 1、 什么是SSL? SSL(S…

openssl-heartbleed漏洞学习

了解漏洞 Heartbleed漏洞: Heartbleed漏洞是openssl的一个漏洞,这个严重漏洞(CVE-2014-0160)的产生是由于未能在memcpy()调用受害用户输入内容作为长度参数之前正确进行边界检查。攻击者可以追踪OpenSSL所分配的64KB缓存、将超出必要范围的字节信息复制…

Glass Hearts_ Brett

实验1.1 判断是否为回文数 气死我了这么个破题我居然想了很久我真的会气死 但小小的题也要学到东西呀 这里学到了int类型转变成string(因为strlen只能用在char string 这种上面) 但只有C11支持,我真的会无语 第一次当练手了搞了个这么简单的题还花这么久气死我了…

心脏出血(Heartbleed)漏洞浅析、复现

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

SEED-lab:Heartbleed Attack Lab

博客已迁移至:https://gls.show/ seedlab系列文章GitHub链接:https://github.com/LaPhilosophie/seedlab 实验准备 设置两个 VM: 攻击者机器 修改/etc/hosts 文件将服务器名映射到服务器 VM 的 IP 地址,在/etc/hosts 中搜索127.0.0.1 www.…

Heartbleed心脏出血原理及漏洞复现(CVE-2014-0106)

Heartbleed心脏出血原理及漏洞复现(CVE-2014-0106) 漏洞简介漏洞原理漏洞复现 漏洞简介 心脏出血是OpenSSL库中的一个内存漏洞,攻击者利用这个漏洞可以服务到目标进程内存信息,如其他人的Cookie等敏感信息。 漏洞原理 心脏出血…

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

【事件规则】 OpenSSL“心脏出血”漏洞是一个非常严重的问题。这个漏洞使攻击者能够从内存中读取多达64 KB的数据。也就是说,只要有这个漏洞的存在,在无需任何特权信息或身份验证的环境下,我们就可以从我们自己的(测试机上&#…

Says Of Heart!

心得: 步入大学生活已经两个多月了,在这期间,我面试过班委,面试过学生会,面试过小组,分别获得了不同的经验与感受,这使我收获颇多。 之前的我,是一个不爱参加任何活动的一…

Heartbleed漏洞的复现与利用

一、 1.Heartbleed漏洞是什么 Openssl在处理心跳包的时候检测漏洞,没有检测payload与实际的数据字段是否匹配,造成最大64KB的内存泄漏 2.基本背景和影响 OpenSSL是SSL协议以及一系列加密算法的开源实现,使用C语言编写。OpenSSL采用Ap…

Heart bleed 漏洞源码与过程解析

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

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

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

码元

码元:固定时长的信号波形,代表不同离散数值的基本波形(码元可以理解为一种信号) 固定时长中的时长可以称为码元宽度,如下图 上图信号只有0、1两种状态(1个码元携带0或1 1个码元携带1bit的信息量) 所以是二进制…

候选码、主码、外码、全码、超码

文章目录 1.候选码2.主码主属性非主属性 3.外码4.全码5.超码6.总结: 1.候选码 定义:能唯一标识关系中元组的一个属性或属性集。 2.主码 从多个候选键中选择一个作为查询、插入或者删除元组的操作变量,被选用的候选码称为主码。 每个关系必…