背景
在使用spug自动化部署程序的时候,会使用ssh协议远程执行脚本,但是ssh那一步会耗时比较旧,网上的解决方案五花八门. 问题可能可以解决,但是背后原理并不清楚,借此机会抓包将此问题彻底消化.
SSH协议握手过程
ssh 抓包MAC层包传输
序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。
确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。
控制位:
ACK:该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1 。
RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。
SYN:该位为 1 时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。
FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位为 1 的 TCP 段。
tcp握手抓包解释
No | 描述 | Seq | Win | ACK | 解释 |
214 | 第一次握手 | 0 | 14600 | \ | seq = 0表示客户端当前的TCP包序列号 |
215 | 第二次握手 | 0 | 14480 | 1 | seq = 0,表示服务器端当前的TCP包序列号ack = 1(客户端seq + 1),表示对客户端第 seq = 0 的TCP包进行应答 |
216 | 第三次握手 | 1 | 14720 | 1 | seq = 1,表示客户端当前的TCP包序列号ack = 1(服务器seq + 1),表示对服务器端第 seq = 0 的TCP包进行应答 |
三次握手的第一个报文- SYN包
第一个报文对应的抓包详情
三次握手的第二个报文- SYN+ACK包
第二个报文对应的抓包详情
三次握手的第三个报文- ACK包
第三个报文对应的抓包详情
ssh版本协议交换
No | 描述 | 解释 |
217 | server端协议版本协商 | 服务器将自己的SSH协议版本发送到客户端,格式为:SSH-protoversion(版本号)-softwareversion(自定义) SP(空格一个,可选) comments(注释,可选) CR(回车) LF(换行) |
219 | client协议版本协商 | 客户端将自己的SSH协议版本发送到服务器,格式为:SSH-protoversion(版本号)-softwareversion(自定义) SP(空格一个,可选) comments(注释,可选) CR(回车符) LF(换行符) |
密钥协商key阶段
221-228是SSH版本协议交换过程。
密钥协商过程从客户端和服务器相互发出Key Exchange Init请求开始,主要是告诉对方自己支持的相关加密算法列表、MAC算法列表等。
最后协商成功之后,将会生成一个对称加密会话密钥key以及一个会话ID,在这里要特别强调,这个是对称加密密钥key,不要和公钥相混淆了,公钥和密钥在上面开头已经着重强调两者的区别了,公钥是给客户端去验证服务器用的。
在这一步中,公钥会从服务器传送到客户端:
而会话密钥是通过D-H算法计算出来的,不会在网络上传输,其破解的难度取决于离散对数的破解难度,一般不会被破解的,有兴趣的可以自行了解该算法原理。
Key Exchange Init发送的请求包数据分析
No | 描述 | 解释 |
1 | kex_algorithms | 密钥交换算法,里边即包含我们使用的D-H算法,用于生成会话密钥 |
2 | server_host_key_algorithms | 服务器主机密钥算法,可以采用 ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,有公钥和私钥的说法,公钥即我们上面讲到的pub key,对于公钥私钥的概念,可以参见understanding public key private key concepts |
3 | encryption_algorithms_client_to_server | 对称加密算法,常用的有aes128-cbc,3des-cbc |
服务器首次ssh的指纹信息就是ecdsa-sha2-nistp256算法生成的.
看懂wireshark抓包数据的前置知识
tcp的格式
参考
【1】 参考此文章
【2】 小林codding