7

I came across this Python script that tests the server for the HeartBleed vulnerability:

Would someone be able to explain the content of the "hello", what is being sent and how was this content constructed?

I am not trying to use this script maliciously. I was asked to test a Tomcat 7.0.2 server for the vulnerability: I verified that tcnative-1.dll does use openssl 1.0.1d, but a few of the standalone test tools that I tried testing the server with report that it is not vulnerable.

4

2 回答 2

12

hellohb以更易读的方式定义字节串。

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'

这只是一种使用十六进制表示法和额外空格指定一系列字节的紧凑方式。

十六进制数据本身只是一个普通的心跳协议消息,以原始字节为单位。该hello字符串包含一个TLS 1.1 记录消息,由第一个字节(16十六进制,十进制 22)标识为握手记录,发送一个client_hello(第六个字节是01)。这只是设置一个 TLS 会话,告诉服务器客户端支持哪种密码。其中包含什么并不重要,只是它告诉服务器客户端支持心跳扩展(00 0f消息末尾的字节对)。

这是一个有趣的hb信息,真的:

hb = h2bin(''' 
18 03 02 00 03
01 40 00
''')

18是心跳内容类型记录,03 02标识 TLS 1.1 协议版本。表示消息的00 03有效负载有多大;3 个字节,或全部第二行。

消息本身的 3 个字节由心跳类型(01或“请求”)和消息长度(40 0016384 字节)组成,后面没有实际消息。这会导致损坏的 SSL 服务器发回包含 16kb 内存的心跳响应;回显不存在的 0 长度请求消息加上内存以构成请求长度。

于 2014-04-12T16:42:11.730 回答
6

该页面对此进行了很多解释。

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
};
于 2014-04-12T17:27:48.550 回答