0

(首先我很抱歉我的英语不是我的母语)我尝试用wireshark理解ssh2(你可以在这里找到wireshark记录:https ://dl.dropboxusercontent.com/s/e9ut8z6v8oldg7g/ssh_wireshark .pcap?token_hash=AAGtkPMwKLt4IIr1Rlrht5_21HpMwQZBfeEFjGoRA85cjQ&dl=1 ) 和 rfc 4253 但我有一些困难:

在 SSH_MSG_KEXINIT 消息之后有 SSH_MSG_KEXDH_INIT (30) 和 SSH_MSG_KEXDH_REPLY (31)。

我的问题是对 SSH_MSG_KEXDH_INIT 和 SSH_MSG_KEXDH_REPLY 的理解。根据 rfc4253:

First, the client sends the following:

  byte      SSH_MSG_KEXDH_INIT
  mpint     e

The server then responds with the following:

  byte      SSH_MSG_KEXDH_REPLY
  string    server public host key and certificates (K_S)
  mpint     f
  string    signature of H

但是有了wireshark,我看到了:

from Client:

-SSH Version 2 (encryption:aes128-ctr mac:hmac-md5 compression:none)
    Packet Length: 76
    Padding Length: 5
    -Key Exchange
            Msg Code: Diffie-Hellman Key Exchange Init (30)
            Payload: 0000004104e2d6ad26e76531efa9ea(...)
            Padding String: 0000000000




from Server:
-SSH Version 2 (encryption:aes128-ctr mac:hmac-md5 compression:none)
    Packet Length: 292
    Padding Length: 8
    -Key Exchange
            Msg Code: Diffie-Hellman Key Exchange Reply (31)
            Multi Precision Integer Length: 104
            DH modulus (P): 0000001365636473612d73686(...)
            Multi Precision Integer Length: 65
            DH base (G): 04ead7f3936361df10c39d7d(...)
            Payload: 000000650000001365636473612d(...)
            Padding String: 0000000000000000

什么是“有效载荷”字段?如何协商基数“G”和模数“P”?ecdsa 公钥是质数还是合数?

这是我的分析:

a)wireshark 是错误的。

如果 rfc 正确,则有效载荷字段为 'e' 和 'f'!

但是有一个问题:如果 rfc 是正确的,模数 p 和基数 g 必须在 SSH_MSG_KEXDH_INIT 之前知道,因为我们需要它们来计算 'e';所以wireshark解码是错误的,因为wireshark告诉我P和G是在SSH_MSG_KEXDH_INIT之后传输的。

还有其他东西告诉我wireshark 是错误的:如果我解码我可以在/etc/....pub 文件中找到的base64,我可以看到wireshark DH_modulus 字段的值。所以 DH_modulus 字段不是真正的 DH_modulus 而是服务器公共主机密钥:rfc 是正确的,wireshark 是错误的!

在这种情况下,基数和模数不会通过“Diffie-Hellman 密钥交换回复”传输,那么“g”和“p”是如何传输的?它们在所有 ssh 客户端/服务器中是否“加前缀”并且从不传输?

b)wireshark 是对的

如果我们假设服务器公共主机密钥是一个素数,它可以是 DH_modulus 和 rfc 和 wireshark 是正确的。

但是在这里,又出现了一个问题:来自客户端的有效负载不能是“e”,因为有效负载是在 DH_modulus 和 DH_base 之前传输的...

那么什么是有效载荷字段?

什么时候发送'e'和'f'?因为就在“Diffie-Hellman 密钥交换回复”之后,我有“Newkeys 消息”,表示密钥交换结束

但另一方面,我有 4 个来自端口 22 的数据包,它们没有被解码为 ssh,但它可能是“e”和“f”?

前两个数据包长度为 48 字节,另外两个数据包长度为 64 字节。

'e' 和 'f' 在这 4 个 tcp 数据包中传输吗?也许 e 和 f 是 64+48=112 字节长度?

如您所见,我很困惑。你能帮我吗(也许不是所有的问题,但一些迹象可以帮助)

谢谢你。

4

1 回答 1

2

在这种情况下,Wireshark 错误地解释了公钥算法。来自服务器的数据包编号 13 已根据 RFC5656 ( https://www.rfc-editor.org/rfc/rfc5656 ) 正确格式化。它使用 ecdsa-sha2-nistp256 算法,这是一种椭圆曲线算法,有 2 个变量:q 和 r。

Wireshark 使用不同的 RFC(尽管不是严格意义上的 4253)不正确地解析此数据包。RFC5656 第 3.1 节将为您提供走上正轨所需的信息。为了您的信息,我将在此回复中发布变量 r 和 s。

实际上,包含的信息是:

服务器的公共主机密钥(字符串 K_S):字符串“ecdsa-sha2-nistp256”(其中“nistp256”是 [标识符])字节 [n] ecc_key_blob 字符串“nistp256”(再次作为 blob 的 [标识符] 部分重复)字符串 Q (其中Q如下)

Q (0073-00b3): 04 bb e6 6e 8e b6 b4 f8 29 8f e2 b1 ba a0 2f 24 a2 d6 33 74 d4 17 ce b2 17 73 da 95 1a ac c4 4b d7 a8 fc 92 6d c6 c1 38 95 a6 5b 1f da ec d2 29 df 2c 68 5c dc de 36 bc 8b 34 16 24 28 0c 57 e1 7e

服务器的临时公钥八位字节字符串(字符串 Q_S):

Q_S (00b8-00f8): 04 ea d7 f3 93 63 61 df 10 c3 9d 7d bb ff 4d 38 0d 78 53 ea 00 97 30 b9 f5 cb a0 ea 1f 59 68 5b c6 c6 de fb a8 16 f6 a9 e2 88 96 d8 e9 48 c4 c3 4a 24 bc 58 7f cd 6e b3 2f 4a 18 ac d7 68 d7 df 0b

交换哈希上的签名(字符串):字符串“ecdsa-sha2-nistp256”(同样,其中 nistp256 是 [标识符])字符串 ecdsa_signature_blob mpint r (011c-013c):00 84 0a a1 08 cf e8 2b a9 77 80 f2 82 99 59 e4 bb e4 f0 e8 bf 56 f2 ca 70 7a 4d 53 b0 6e b1 fc 0a

           mpint s (0141-0161):

00 bb 2a 08 c1 3e 41 ec 27 db 24 e8 1f 57 06 db 55 9f 5d e9 fa 48 87 b2 2e 97 3c 46 59 7a 14 c9 40

希望这有助于消除混乱。您仍然需要对 RFC5656 进行一些研究,并且可能会参考 RFC4253 来填补空白,但那是数据包的细分。

祝你好运!

斯科特在美国纽约

于 2013-09-16T20:42:45.270 回答