2024-05-20 17:22:12 发布
网友
我遇到了this Python script测试服务器是否存在心血漏洞:
有人能解释一下“hello”的内容吗?发送的是什么?内容是如何构建的?
我不是想恶意使用这个脚本。我被要求测试Tomcat7.0.2服务器是否存在此漏洞:我验证了tcnative-1.dll确实使用了openssl 1.0.1d,但我尝试使用的一些独立测试工具报告服务器不存在漏洞。
This page对此解释了很多。
const unsigned char good_data_2[] = { // TLS record 0x16, // Content Type: Handshake 0x03, 0x01, // Version: TLS 1.0 0x00, 0x6c, // Length (use for bounds checking) // Handshake 0x01, // Handshake Type: Client Hello 0x00, 0x00, 0x68, // Length (use for bounds checking) 0x03, 0x03, // Version: TLS 1.2 // Random (32 bytes fixed length) 0xb6, 0xb2, 0x6a, 0xfb, 0x55, 0x5e, 0x03, 0xd5, 0x65, 0xa3, 0x6a, 0xf0, 0x5e, 0xa5, 0x43, 0x02, 0x93, 0xb9, 0x59, 0xa7, 0x54, 0xc3, 0xdd, 0x78, 0x57, 0x58, 0x34, 0xc5, 0x82, 0xfd, 0x53, 0xd1, 0x00, // Session ID Length (skip past this much) 0x00, 0x04, // Cipher Suites Length (skip past this much) 0x00, 0x01, // NULL-MD5 0x00, 0xff, // RENEGOTIATION INFO SCSV 0x01, // Compression Methods Length (skip past this much) 0x00, // NULL 0x00, 0x3b, // Extensions Length (use for bounds checking) // Extension 0x00, 0x00, // Extension Type: Server Name (check extension type) 0x00, 0x0e, // Length (use for bounds checking) 0x00, 0x0c, // Server Name Indication Length 0x00, // Server Name Type: host_name (check server name type) 0x00, 0x09, // Length (length of your data) // "localhost" (data your after) 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, // Extension 0x00, 0x0d, // Extension Type: Signature Algorithms (check extension type) 0x00, 0x20, // Length (skip past since this is the wrong extension) // Data 0x00, 0x1e, 0x06, 0x01, 0x06, 0x02, 0x06, 0x03, 0x05, 0x01, 0x05, 0x02, 0x05, 0x03, 0x04, 0x01, 0x04, 0x02, 0x04, 0x03, 0x03, 0x01, 0x03, 0x02, 0x03, 0x03, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, // Extension 0x00, 0x0f, // Extension Type: Heart Beat (check extension type) 0x00, 0x01, // Length (skip past since this is the wrong extension) 0x01 // Mode: Peer allows to send requests };
hello和hb以更可读的方式定义bytestrings。
hello
hb
h2bin(x)函数完成所有工作:
h2bin(x)
def h2bin(x): return x.replace(' ', '').replace('\n', '').decode('hex')
所以十六进制数字的字符串去掉了所有空格,然后从十六进制解码为字节:
>>> '16 03 02 00 dc'.replace(' ', '') '16030200dc' >>> '16 03 02 00 '.replace(' ', '').decode('hex') '\x16\x03\x02\x00\xdc'
这只是一种使用十六进制表示法和额外空格指定一系列字节的简洁方法。
十六进制数据本身只是一个普通的heartbeat protocol message,用原始字节表示。hello字符串包含一个TLS 1.1 record message,由第一个字节(16十六进制,十进制22)标识为握手记录,发送一个client_hello(第六个字节是01)。这只是设置一个TLS会话,告诉服务器客户端支持哪种密码。除了告诉服务器客户机支持Heartbeat扩展(消息末尾的一个00 0f字节对)之外,它实际上并不重要。
16
client_hello
01
00 0f
真正有趣的是hb消息:
hb = h2bin(''' 18 03 02 00 03 01 40 00 ''')
18是心跳内容类型记录,03 02标识TLS 1.1协议版本。00 03表示消息的有效负载有多大;3字节,或全部第二行。
18
03 02
00 03
消息本身的3个字节由心跳类型(01,或“请求”)和消息长度(40 00,16384字节)组成,后跟没有实际消息。这会导致损坏的SSL服务器发送回包含16kb内存的heartbeat响应;将回显不存在的0长度请求消息,并加上内存以构成请求长度。
40 00
This page对此解释了很多。
hello
和hb
以更可读的方式定义bytestrings。h2bin(x)
函数完成所有工作:所以十六进制数字的字符串去掉了所有空格,然后从十六进制解码为字节:
这只是一种使用十六进制表示法和额外空格指定一系列字节的简洁方法。
十六进制数据本身只是一个普通的heartbeat protocol message,用原始字节表示。
hello
字符串包含一个TLS 1.1 record message,由第一个字节(16
十六进制,十进制22)标识为握手记录,发送一个client_hello
(第六个字节是01
)。这只是设置一个TLS会话,告诉服务器客户端支持哪种密码。除了告诉服务器客户机支持Heartbeat扩展(消息末尾的一个00 0f
字节对)之外,它实际上并不重要。真正有趣的是
hb
消息:18
是心跳内容类型记录,03 02
标识TLS 1.1协议版本。00 03
表示消息的有效负载有多大;3字节,或全部第二行。消息本身的3个字节由心跳类型(
01
,或“请求”)和消息长度(40 00
,16384字节)组成,后跟没有实际消息。这会导致损坏的SSL服务器发送回包含16kb内存的heartbeat响应;将回显不存在的0长度请求消息,并加上内存以构成请求长度。相关问题 更多 >
编程相关推荐