【问题标题】:Creating a valid heartbeat request创建有效的心跳请求
【发布时间】:2014-04-15 21:58:07
【问题描述】:

我一直在处理 heartbleed 错误(主要是 cloudflare challenge)并且创建无效的心跳很容易,我一直发送如下:

### HEATBEAT ###

0x18,       # Content Type (Heartbeat)
0x03, 0x01,  # TLS version
0x00, 0x03,  # Length
# Payload
0x01,       # Type (Request)
0xff, 0xff  # Payload length
            # NO PAYLOAD

### END HEARBEAT ###

但是,当我尝试发送这个有效的心跳时,服务器没有响应。

### HEATBEAT ###

0x18,       # Content Type (Heartbeat)
0x03, 0x01,  # TLS version
0x00, 0x03,  # Length
# Payload
0x01,       # Type (Request)
0x00, 0x03  # Payload length
0x68, 0x61, 0x74, # Payload: hat

### END HEARBEAT ###

我尝试过调整有效载荷长度,但 +1 或 -1 都不起作用。即使长度明显高于实际长度也不起作用。关于我做错了什么有什么想法吗?

这是我的full code 供任何感兴趣的人使用(它基于this

编辑:响应@warren-dew,这也不起作用:

### HEATBEAT ###

0x18,       # Content Type (Heartbeat)
0x03, 0x01,  # TLS version
0x00, 0x03,  # Length
# Payload
0x01,       # Type (Request)
0x00, 0x03  # Payload length
0x68, 0x61, 0x74, # Payload: hat
0x34, 0x90, 0xf0, 0xf3, # PADDING
0xe3, 0xb4, 0x5c, 0x9c, # PADDING
0x80, 0xff, 0x95, 0x74, # PADDING
0x9d, 0x81, 0xfa, 0xa0  # PADDING
### END HEARBEAT ###

编辑:响应@warren-dew,再次调整但仍然不起作用:

### HEATBEAT ###

0x18,       # Content Type (Heartbeat)
0x03, 0x01,  # TLS version
0x00, 0x16,  # Length <- Changed
# Payload
0x01,       # Type (Request)
0x00, 0x03  # Payload length
0x68, 0x61, 0x74, # Payload: hat
0x34, 0x90, 0xf0, 0xf3, # PADDING
0xe3, 0xb4, 0x5c, 0x9c, # PADDING
0x80, 0xff, 0x95, 0x74, # PADDING
0x9d, 0x81, 0xfa, 0xa0  # PADDING
### END HEARBEAT ###

【问题讨论】:

  • 您无法在未加密的情况下发送此消息,因为它无法在握手期间发送。您需要先握手然后加密发送此消息。这意味着该消息被封装在一个 TLSCompressed 结构中,该结构本身被封装在一个 TLSCiphertext 结构中

标签: python ssl heartbleed-bug


【解决方案1】:

除了有效负载之外,合法的心跳消息还具有三个字节的元数据(消息类型和有效负载长度)以及至少 16 个字节的填充。因此,消息长度必须超过有效负载长度至少 19 个字节,而不仅仅是等于它。有关详细信息,请参阅 RFC 6520。

【讨论】:

  • 我在请求的末尾添加了 16 个字节的随机填充(如我上面的编辑所示),但请求仍然失败......
  • 消息长度仍然与有效载荷长度相同。您需要将消息长度调整为正确的值,现在是 22。
  • 不幸的是它仍然不起作用...编辑添加新消息。
【解决方案2】:

在我看来,只有在 tls 会话建立后才允许有效的心跳请求。我已经测试过(您可以使用 s_client 或您自己的工具进行测试,也许使用 BouncyCastle)在建立 TLS 会话后发送有效的心跳请求。 我建立了一个有效的 tls 会话并发送了一个加密的心跳,并且能够使用 java 和 bouncycastle 引发心跳响应。 我还没有清理代码,一旦我将其发布。 因此,根据经验,似乎即使在损坏的 OpenSSL 版本中,在 ServerHelloDone 之后的有效心跳请求也是不允许的。这就是在上面的示例中,没有收到心跳响应的原因。

【讨论】:

    猜你喜欢
    • 2013-01-16
    • 1970-01-01
    • 2016-11-23
    • 2015-08-18
    • 2013-08-25
    • 2018-07-22
    • 1970-01-01
    • 2015-12-14
    • 2021-06-05
    相关资源
    最近更新 更多