使用 WireShark 对 SSH 协议进行分析
实验基础
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 到密码的可能性更大。