【问题标题】:HeartBleed python test scriptHeartBleed python 测试脚本
【发布时间】:2014-05-26 19:50:25
【问题描述】:

我遇到了this Python script,它测试服务器的 HeartBleed 漏洞:

谁能解释一下“你好”的内容,发送的是什么内容以及这个内容是如何构建的?

我并没有试图恶意使用这个脚本。我被要求测试 Tomcat 7.0.2 服务器的漏洞:我验证了 tcnative-1.dll 确实使用了 openssl 1.0.1d,但是我尝试测试服务器的一些独立测试工具报告它不是易受伤害的。

【问题讨论】:

  • 可能是服务器禁用了心跳协议扩展。
  • 这个bug其实是hb或者18 03 02 00 03 01 40 00触发的。 0x18 是contentType 24 或心跳消息。尾部的 0x4000 表示“我的心跳消息大小为 0x4000。请在响应时将 0x4000 字节复制回来”。

标签: python security openssl heartbleed-bug


【解决方案1】:

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'

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

十六进制数据本身只是一个普通的heartbeat protocol message,以原始字节为单位。 hello 字符串包含一个TLS 1.1 record message,由第一个字节(16 十六进制,22 十进制)标识为握手记录,发送一个client_hello(第六个字节为01)。这只是设置一个 TLS 会话,告诉服务器客户端支持哪种密码。其中包含什么并不重要,只是它告诉服务器客户端支持 Heartbeat 扩展(消息末尾的 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 00,16384 字节)组成,然后是没有实际消息。这会导致损坏的 SSL 服务器发回包含 16kb 内存的心跳响应;回显不存在的 0 长度请求消息加上内存以构成请求长度。

【讨论】:

  • "18 是心跳内容类型记录" => 那么在这种情况下(18)这个内容类型记录是什么?
  • 我不知道你在问什么。 18 是心跳扩展消息的注册类型。
  • 16 比如说它是握手类型,那么 18 呢?
  • 18 是心跳,见Heartbeat extension
  • 我至少读了 4 次 RFC,没有提到 18 条内容类型记录。
【解决方案2】:

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
};

【讨论】:

  • 很好的解释,@你。
猜你喜欢
  • 2020-03-01
  • 2011-08-23
  • 2015-01-23
  • 2016-04-12
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
相关资源
最近更新 更多