V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tony1016
V2EX  ›  分享发现

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

  •  
  •   tony1016 · 2015-10-16 15:13:39 +08:00 · 3279 次点击
    这是一个创建于 3108 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大家就从技术来说是否可行。

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

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

    我不是说一定可行,尤其是第 5 步。假设第 5 步对方真的信了,大家讨论一下,从技术上讲,是否可行??
    9 条回复    2015-10-16 16:37:25 +08:00
    gamexg
        1
    gamexg  
       2015-10-16 15:17:56 +08:00 via Android
    如果之前连接过第 3 步就会报服务器公钥错误。
    tony1016
        2
    tony1016  
    OP
       2015-10-16 15:21:04 +08:00
    @gamexg 所以我说送出指纹,是指对方公钥的指纹,这个理论上是可以获得的
    tony1016
        3
    tony1016  
    OP
       2015-10-16 15:22:16 +08:00
    @tony1016 说错了,对方主机的指纹,这个是可以获得的
    tony1016
        4
    tony1016  
    OP
       2015-10-16 15:26:44 +08:00
    @gamexg 说错了,对方主机的指纹,这个是可以获得的
    gamexg
        5
    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
        6
    zk8802  
       2015-10-16 16:21:22 +08:00   ❤️ 2
    SSH 服务端通过 host key 来避免中间人攻击,包括公钥和私钥两部分。你不可能伪造一份同样的 host key —— 你可以得到远程服务器的公钥,但没有私钥的话,你无法和一个正常的 SSH 客户端完成密钥协商过程(因为你没法解密使用正常公钥加密的数据)。

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

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

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

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

    两者非常类似
    tony1016
        9
    tony1016  
    OP
       2015-10-16 16:37:25 +08:00
    @zk8802 这个资料很棒,有助于我更加理解协商过程,非常感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   919 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 20:34 · PVG 04:34 · LAX 13:34 · JFK 16:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.