从内存中窃取未加密的SSH代理密钥

更多互联网新鲜资讯、工作奇淫技巧关注原创【飞鱼在浪屿】(日更新)
从内存中窃取未加密的SSH代理密钥文章插图
如果你曾经使用SSH密钥来管理多台计算机 , 很可能已经使用过ssh-agent 。 该工具旨在将SSH密钥保留在内存中 , 从而使用户不必每次都键入密码 。 但是 , 这可能会带来一些安全风险 。 以root身份运行的用户可能具有从内存中提取未加密的SSH密钥并对其进行重构的能力 。
由于需要root用户访问权限 , 因此这种攻击似乎没有用 。 例如 , 攻击者可能能够安装键盘记录器并使用它来获取SSH密钥的密码 。 但是 , 这导致攻击者不得不等待目标键入他们的密码 。
使用SSH代理使用SSH代理的一种常见方法是先运行“ ssh-agent bash” , 然后运行“ ssh-add”以将密钥添加到代理 。 添加后 , 密钥将保留在SSH代理程序的堆栈中 , 直到该过程结束 , 添加了另一个密钥或用户 , 还可以使用-d或-D选项 。 大多数人会运行一次 , 然后忘记它 , 直到需要重新启动 。
从内存中拉出SSH密钥【从内存中窃取未加密的SSH代理密钥】有几种方法可以创建SSH代理内存的副本 。 最简单的方法是使用gdb 。 gdb使用ptrace调用来附加到SSH代理 。 这为gdb提供了创建正在运行的进程的内存转储所必需的特权 。 该grabagentmem.sh脚本 ()提供了自动执行此取出内存快照的方式 。 默认情况下 , 运行时它将为每个SSH代理进程创建00堆栈的内存转储 。 这些文件名为sshagent-PID.stack 。
root@test:/tmp# grabagentmem.sh Created /tmp/SSHagent-17019.stack如果gdb在系统上不可用 , 则对整个计算机进行内存转储 , 并使用易失性来提取SSH代理进程的堆栈可能是可行的 。 但是 , 此过程当前不在本文档的讨论范围之内 。
从内存转储中解析SSH密钥一旦获得了堆栈的副本 , ?就有可能从该文件中提取密钥 。 但是 , 密钥以与SSH-keygen生成的密钥不同的格式保留在堆栈中 。 这是parse_mem.py脚本()派上用场的地方 。 此脚本需要安装pyasn1 python模块 。 安装完成后 , 可以针对内存文件运行脚本 。 如果该内存文件包含有效的RSA SSH密钥 , 则它将保存到磁盘 。 该工具的未来版本可能支持其他密钥格式 , 例如DSA , ECDSA , ED25519和RSA1 。
root@test:/tmp# parse_mem.py /tmp/SSHagent-17019.stack /tmp/key Found rsa key Creating rsa key: /tmp/key.rsa然后 , 可以将这个key.rsa文件用作ssh -i的参数 。 这将像原始用户的密钥一样 , 只需要输入密码即可将其解锁 。
获得有效且可用的SSH密钥可以帮助渗透测试人员进一步访问客户端网络 。 在用户帐户以及服务器上的根帐户上 , 同时使用密钥是很常见的 。 服务器也可能配置为仅允许密钥访问 。