实验基础
SSH有两种级别的安全认证
- 基于口令的安全认证
- 基于密匙的安全认证
SSH2的三个子协议
- 传输层协议
- 用户认证协议
- 连接协议
这里主要对基于口令的安全认证的传输层协议和用户认证协议进行分析
实验环境
client端是使用的是基于ssh2的Termius
server端是一台运行ubuntu的ecs,同样是基于ssh2的openssh
实验过程
我们建立ssh连接的时候到底发生了什么?
- 当你尝试与服务器建立ssh连接,首先会在c-s两端之间建立一个加密通道,用于包的传输
- 建立加密通道之后,你输入的用户密码就会通过整个通道加密传输到服务器进行认证
- 认证完成之后就在c-s之间成功建立了连接,而包的传输还是基于在第一步的trans-layer建立的加密通道进行传输
接下来通过抓包来对ssh协议进行分析
对抓到的包一步一步进行分析
- 首先,在第一个包中,client会告诉server它使用的ssh版本
- 同样的,server会返回一个包给client,告诉client它用的是什么版本的ssh协议。这两部其实是双方协商ssh协议,不过现在基本用的都是ssh-v2,这两部就相当于互相响应一下版本罢了。
- 这一步,两端开始建立连接,首先client会发给server一个包,告诉server自己支持什么加密算法
- 同样的,server也会返回一个包,告诉client自己支持什么加密算法,至此,两者协商出一个算法
- 下一步会发生一个很有意思的东西,client会确认server的公钥,就是我们所知道的指纹,如果是第一次连接,client会将这个指纹保存到本地,供下一次ssh连接确认使用。
- 接下来两个包用于是client和server之间发送Diffie-Hellman密钥交换算法的公钥,这一部之后,client和server确认了用于会话的密钥。//对这个算法这里不做详细说明,有兴趣的可以自行去知乎看看。
- 下一步client会发给server一个包: new keys,说明两端的加密通道已经建立。至此,SSH-TRANS的工作已经完成。
- 接下来就轮到SSH-AUTH,在这一步,其实就是我们输入密码并回车之后的阶段。接下来的包都是c-s之间用于认证的,没有什么好说的了。
实验总结
基于口令认证的ssh到底安不安全,记得前面说过的指纹吗,在第一次进行ssh连接的时候,client会将指纹保存在本地,第二次进行连接时候,client会将本地保存的指纹与server发送的进行对比。那么这里就是关键的地方了,如果一个黑客劫持了client与server的通信,伪装成server与client进行通信,问题就来了,如果客户不知道指纹发生了更改,选择继续通信,那么接下来相当于,客户的PC就与黑客的PC建立了连接,这就是中间人攻击。
在这里,我尝试进行了一次MITM攻击,可以看到,如果客户稀里糊涂点了个repalce就完蛋了。其次对于ssh2以下的ssh协议,被arp到密码的可能性更大。