打开xshell, 登入linux服务器,开始wireshake抓包。
SSH抓包从测试如下:
一、3次握手建立tcp连接
1、 seq = 0表示客户端当前的TCP包序列号。
2、seq = 0,表示服务器端当前的TCP包序列号ack = 1(客户端seq + 1),表示对客户端第 seq = 0 的TCP包进行应答
3、seq = 1,表示客户端端当前的TCP包序列号ack = 1(服务器seq + 1),表示对服务器端第 seq = 0 的TCP包进行应答
二、ssh版本协议交换
4、服务器将自己的SSH协议版本发送到客户端,格式为:SSH-protoversion(版本号)-softwareversion(自定义) SP(空格一个,可选) comments(注释,可选) CR(回车) LF(换行)。如:SSH-2.0-OpenSSH_7.4
5、客户端将自己的SSH协议版本发送到服务器,格式为:SSH-protoversion(版本号)-softwareversion(自定义) SP(空格一个,可选) comments(注释,可选) CR(回车符) LF(换行符)。如:SSH-2.0-nsssh2_6.0.0037 NetSarang Computer, Inc.
三、协商出会话ID和会话密钥
后面加解密用的是会话密钥。
四、然后接下来才是认证阶段
用账号名密码登入的是password认证。还有一种是公钥认证,这个是在免密登入的时候有用到。如果是password认证客户端会把账号密码和认证方法用会话密钥加密传输到服务端进行认证。
~/.ssh/authorized_keys
文件中,以后服务器都会接受客户端传过来的经过会话密钥加密过的公钥,然后解密得到公钥之后和本地authorized_keys
配置的公钥是否相等,如果是,则允许登陆。如果爱丽丝是客户端,鲍勃是服务端,但是其中如果伊芙假装成鲍勃跟爱丽丝通信,假装成爱丽丝和鲍勃通信?这也很好解释了为什么我们第一次登陆的时候,Shell终端总是会出现这个提示,你是否信任服务端公钥,这也是将确认权留给客户端自己去判断的一种策略,所以用这样保证客户端爱丽丝只对服务端鲍勃协商,而不会对伊芙协商,所以爱丽丝就不会把账号密码给伊芙。如果伊芙伪装成爱丽丝和服务端鲍勃通信,这个时候伊芙没有root账号、密码,最终肯定没有办法成功登入的。