41

使用wireshark分析ssh口令登录细节

 4 years ago
source link: https://www.tuicool.com/articles/ERNNrmA
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

《ssh工具,开发者必须有所了解》 这篇文章中,概念性介绍了ssh知识,可对大多数人来说,会使用ssh工具才更有用,比如对我来说,成功登录ssh服务器后,才有动力继续了解其他ssh功能。

ssh登录通常有两种方式,分别是口令验证和密钥对验证,口令登录非常简单,运行 ssh root@localhost,然后输入正确口令后就能成功登录。

可你知道背后的细节吗?这也是我写这篇文章的目的,ssh协议和tls协议一样,都组合了很多密码学算法,用于解决网络安全问题,掌握ssh协议的原理对于理解密码学很有帮助,密码学算法有很多,比如AES对称密钥算法,公开密钥算法(DH密钥协商算法,RSA非对称加密算法),MAC算法,Hash算法,如果你大概了解这些算法,理解ssh协议会相对简单一点,否则可能会比较吃力。

了解ssh协议另外一个好处就是,遇到问题的时候就不会慌乱,也能够更安全的使用ssh。

本文先介绍相对简单的ssh口令登录,在介绍之前,先了解ssh协议的三个子协议:

  • transport layer:传输层协议运行在 TCP/IP 协议之上,负责密钥交换和服务器验证,保证数据通道具备加密性和完整性

  • user authentication layer:服务器验证客户端,有口令登录和密钥对两种验证方式,需要注意的是客户端验证是 client-driven,由客户端选择验证具体的验证方式。

  • connection layer:这个协议能够构建加密通道,从而提供给其他应用层协议使用。

这三个协议中,最后一个相对复杂,本文主要讲解前二个协议。

ssh口令登录主要分为两个阶段,第一阶段是协商出一个会话密钥,在客户端和服务器端之间构建一条安全的通道。第二个阶段在这条通道上验证客户端登录权限。

ssh服务器默认绑定在22端口,监听客户端的请求,在启动的时候会生成一个密钥对(公钥和私钥),一般是RSA算法密钥对,在第一阶段会将公钥发送给ssh客户端,主要让客户端确认ssh服务器端的身份,除了这个作用,我 目前 没有看到这个密钥对还有其他作用。

为什么说“目前”呢?因为我并没有看 ssh rfc 文档,是通过 wireshark 抓包了解 ssh 协议的,从概念性上 猜测 ssh协议原理。

先上一张图,看看ssh登录产生了那些包,大家可以wireshark抓包,然后过滤出ssh包(不看 tcp 包):

ZJZveia.jpg!web

其中红线就是ssh登录的第一阶段,该阶段一般输入 ssh root@localhost 就能产生。

蓝色就是ssh登录的第二阶段,输入口令后就会产生这些包。

接下去我们先介绍第一个阶段发生了什么:

1:客户端首先发送一个连接请求(序号4),告诉服务器端它目前支持的ssh版本号。

2:服务器端也响应ssh版本号,双方一般协商出的版本号是 ssh v2

3:客户端初始化连接(序号9),进行密钥交换,告诉客户端其支持的各类算法,如下图:

nUrYFjQ.jpg!web

4:然后服务器端也告诉客户端其支持的各类算法(序号10),最后协商出一致的算法,并发送服务器公开密钥对的公钥。

5:如果第一次ssh登录,ssh客户端会提示用户确认服务器公开密钥对公钥的指纹(即公钥的md5值),当然这个在网络包中是体现不出来的。

如果你第一次ssh登录,会出现下图:

EvINNjR.jpg!web

如果你确认该指纹就是你想连接ssh服务器的,那么就会将公钥保存到 ~/.ssh/known_hosts 文件中,下一次你再登录的时候,ssh客户端发现指纹和ssh服务器发送的指纹是一致的,就不会再让你确认了。

指纹非常重要,后面我会再说。

6:客户端接下去就是要发送 DH 算法密钥对的公钥了(序号13),注意这个密钥对和服务器公开密钥对不是一回事

不管是客户端还是服务器端,各自保留自己的 DH 密钥对的私钥,并将自己的 DH 密钥对的公钥发送给对方,这样双方就会协商出最终的会话密钥(用于对称加密)。

DH 算法就不多描述了,有兴趣可以看看我的书 《深入浅出HTTPS:从原理到实战》 ,这个算法非常安全,黑客仅仅通过截获网络和机器也是破解不了的,因为各自的私钥都在内存中,也不会通过网络传输。

具体如下图:

IjqIBnj.jpg!web

7:服务器发送 DH 算法密钥对的公钥(序号15),双方协商出只有他们才知道的会话密钥。

8:客户端发送一个 New Keys 数据包(序号16),表示双方构建了一个加密通道。

上述就是ssh登录的第一阶段,第二阶段中产生的数据都会用会话密钥进行加密了。

第二阶段相对很简单,就是客户端决定验证方式,如果是口令验证,就是将口令加密发送给服务器,如果服务器确认了,就成功登录,具体如下图:

6RnmuaE.jpg!web

最后一个问题,这种方式登录安全吗?相对是安全的,因为口令并不是明文传输的。

但这种方式会遇到中间人攻击,还记得那个指纹吗?其实很少人会去确认这个指纹是不是属于“真实ssh服务器”的,一大串数字,还要你手动根据服务器发送的公钥计算指纹,然后再比较,真的很考验人。

如果你不确认,可能真的会有风险,想想看,如果在连接的时候,某个黑客截获了你的数据包,然后发送了他密钥对的公钥,而你没有确认指纹,那么后续所有的ssh数据包都是和黑客在通讯,他就会成功知道服务器口令了。

危险在于,你以为在和“真实ssh服务器”在通信,可实际上是和黑客在通信,有什么好的解决办法吗?如果是口令登录,确实没有,所以后面我会介绍另外一种登录验证方式。

aYbieiq.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK