我在设想一个场景,私钥登录 ssh 方式也可以中间人攻击,不知是否可行

2015-10-16 15:13:39 +08:00
 tony1016
大家就从技术来说是否可行。

前提:只需要获得对方的公钥,以及必要的 ARP 劫持 DNS 劫持

1.计算公钥的指纹。
2.自己改造一套 sshd 服务
3.对方请求上来,我送出指纹
4.对方私钥加密数据上来,我用公钥解密
5.刚一登录,弹出一个对话框,说密码到期,需要输入 root 密码重置, blabla 等等
6.不注意的用户可能真的输入了 root 密码,至此获得对方主机的 root 密码

我不是说一定可行,尤其是第 5 步。假设第 5 步对方真的信了,大家讨论一下,从技术上讲,是否可行??
3284 次点击
所在节点    分享发现
9 条回复
gamexg
2015-10-16 15:17:56 +08:00
如果之前连接过第 3 步就会报服务器公钥错误。
tony1016
2015-10-16 15:21:04 +08:00
@gamexg 所以我说送出指纹,是指对方公钥的指纹,这个理论上是可以获得的
tony1016
2015-10-16 15:22:16 +08:00
@tony1016 说错了,对方主机的指纹,这个是可以获得的
tony1016
2015-10-16 15:26:44 +08:00
@gamexg 说错了,对方主机的指纹,这个是可以获得的
gamexg
2015-10-16 16:14:57 +08:00
ssh 客户端会保存服务器的 ssh 公钥,下次连接时公钥出现了变化会提示的。
ssh 服务器的公钥是公开的,可以获得,但是服务器私钥是保密的。虽然没看过 ssh 的代码,但是客户端既然保存 ssh 服务器的公钥,那么建立连接时绝对会使用服务器的公钥加密握手数据,你没有服务器的私钥,无法解密握手数据,那么 ssh 连接就建立不起来...

查了一下资料,发现 ssh 设计时的安全性很好。即使客户端忽略了服务器公钥变化也无法做到透明的中间人攻击。证书登录时服务器会将一个随机数通过客户公钥加密后发送过来,客户端使用客户私钥解密,解密后不是直接发送到服务器认证身份,而是和 session id 做 MD5 后再发送到服务器认证身份。 session id 的产生依赖于服务器公钥,中间人的公钥和服务器的公钥是不相同的,造成客户端生成的认证数据中间人拿着也无法登陆真实的服务器认证。

可惜现在 md5 并不是很安全了,之前 md5 已经可以做到碰撞出相同的 md5 指纹了,破译出原文的难度就不清楚了。

参考资料:
http://erik-2-blog.logdown.com/posts/74081-ssh-principle
zk8802
2015-10-16 16:21:22 +08:00
SSH 服务端通过 host key 来避免中间人攻击,包括公钥和私钥两部分。你不可能伪造一份同样的 host key —— 你可以得到远程服务器的公钥,但没有私钥的话,你无法和一个正常的 SSH 客户端完成密钥协商过程(因为你没法解密使用正常公钥加密的数据)。

密钥协商过程大致如下: SSH 开始时,服务器传到客户端的数据中包括服务器的公钥。客户端使用服务器的公钥对发出的数据进行加密,并期待服务器端的 sshd 有对应的私钥,能够解密并理解发出的数据内容。你伪造的中间人得不到对应的私钥,没法知道客户端发回的信息是什么,也就没办法继续协商过程了。

另外再提一句,客户端发回的信息中一定会有随机数,这就要求服务器必须用私钥成功解密客户端的信息之后才能继续协商,从而避免了重放攻击。

参考资料: https://www.vandyke.com/solutions/host_keys/host_keys.pdf
zk8802
2015-10-16 16:23:12 +08:00
如果你是 Linux 用户,可以在 /etc/ssh/ 目录下看到你主机的 host key(s)。
honeycomb
2015-10-16 16:24:05 +08:00
@tony1016

除了 @gamexg 说的
也可以参考 TLS 握手过程里, pre master secret 的生成过程

两者非常类似
tony1016
2015-10-16 16:37:25 +08:00
@zk8802 这个资料很棒,有助于我更加理解协商过程,非常感谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/228554

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX