原理
总来说:ssh连接大致是以下四个流程
1、tcp三次握手
2、客户端和服务端进行版本详细,加密算法、公钥、的相互交换确认
3、服务端发送新的密钥new keys 交换新的密钥,客户端使用该new key发送空字符串表示没问题
4、进行用户密码登入、以及通信交流,数据被封装在Encrypted Packet进行传输
- 前三次是TCP三次握手
- 客户端发送版本信息给服务器:Protocol: SSH-2.0-OpenSSH_for_Windows_7.7
- 服务器发送版本信息给客户端:Protocol: SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.6
- 客户端发送支持加密的加密算法
- 这里描述了客户端的秘钥初始化,长度为1386
Key Exchange (method:curve25519-sha256):描述了SSH协议中的密钥交换方法,这里使用的是curve25519-sha256
kex_algorithms: 包含了客户端和服务器之间支持的密钥交换算法的列表,这些算法用于在SSH连接的初始阶段协商密钥交换算法,curve25519-sha256就包含在其中
server_host_key_algorithms :表示服务器主机密钥算法的数量
server_host_key_algorithms string:服务器主机密钥算法的列表
encryption_algorithms_client_to_server string:包含了客户端到服务器的加密算法的列表
encryption_algorithms_server_to_client string: 包含了服务器到客户端的加密算法的列表
mac_algorithms_client_to_server string:包含了客户端到服务器的消息认证码算法的列表。这些算法用于验证数据的完整性和防止数据篡改
mac_algorithms_server_to_client string: 包含了服务器到客户端的消息认证码算法的列表。这些算法用于验证数据的完整性和防止数据篡改
compression_algorithms_server_to_client string: 包含了服务器到客户端的压缩算法的列表。在这个例子中,列表中只有一个值"none",表示不使用任何压缩算法。
- 这里描述了服务端的秘钥初始化,长度为1186
字段跟上面一样
- 客户端发送临时公钥,长度:114
ECDH client's ephemeral public key length: 客户端的临时公钥长度为32字节。
ECDH client's ephemeral public key (Q_C): 客户端的临时公钥为90513e71fdb978b2cef939b65e96e8b6cb18115179136b2a2f0918baf2120d10,用于与服务器进行密钥交换。
- 与上面类似,服务器发送公钥,进行公钥交换
Packet Length: 260: 表示整个数据包的长度为260字节。
Padding Length: 10: 表示填充字段的长度为10字节。
Key Exchange (method:curve25519-sha256): 表示使用curve25519-sha256算法进行密钥交换。
Message Code: Elliptic Curve Diffie-Hellman Key Exchange Reply (31): 表示这是一个椭圆曲线Diffie- Hellman密钥交换的回复消息。
KEX host key (type: ecdsa-sha2-nistp256): 表示使用ecdsa-sha2-nistp256算法进行主机密钥交换。
ECDH server's ephemeral public key length: 32: 表示服务器的临时公钥长度为32字节。
ECDH server's ephemeral public key (Q_S):
a04932d57ee031204f335a4521f303a378c4db6d3813b3490db5ad01532dad5c: 表示服务器的临时公
钥的具体数值。
KEX H signature length: 100: 表示KEX H签名的长度为100字节。
KEX H signature:
0000001365636473612d736861322d6e697374703235360000004900000020093be4329d…: 表示KEX H签名的具体数值。
Padding String: 00000000000000000000: 表示填充字段的具体数值。
服务器会回复一个 Message Code: New Keys (21) 表示确认秘钥
客户端用该秘钥发送空字符串表示确认
- 用户输入的账号密码在Encrypted Packet字段中,发送给服务器,后续的数据传输以及回显也在这个字段
Packet Length (encrypted): e3518438:表示加密后的数据包长度为e3518438,这是一个十六进制数。
Encrypted Packet: 63c74dba790639324c201a37c066205b5aac5e7c0c0b5756:表示加密后的数据包内 容,这是一个十六进制数。
MAC: 233043a44882f0d76368c6f5e9323b18:表示消息认证码,用于验证数据包的完整性和真实性。
SSH流量是加密的,所以在内容上是不好区分是否是登入成功还是登入失败
ssh爆破特征分析
这是登入失败的数据包
服务端返回 Server: Encrypted packet (len=44)、Server: Encrypted packet (len=52)
客户端请求 Client: Encrypted packet (len=44)、Client: Encrypted packet (len=60)
再输错一次密码的数据包
Client: Encrypted packet (len=148)
Server: Encrypted packet (len=52)
输入正确的账号密码发现 Encrypted packet 的长度没有52
因此:登入失败的数据包长度特征为52