(首先我很抱歉我的英语不是我的母语)我尝试用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 字节长度?
如您所见,我很困惑。你能帮我吗(也许不是所有的问题,但一些迹象可以帮助)
谢谢你。