如果你曾使用SSH密钥来管理多台机器,那么你可能使用过SSH-agent.这个工具使SSH密钥在内存中持续化,这样用户就不用每次都输入口令。然而,这会导致一些安全风险。root用户可能有权限从内存中取出解密后的SSH密钥,并重构它。
由于需要root权限,这种攻击看起来没什么用。例如,一个攻击者可能安装一个Keylogger并使用它来获得SSH密钥的口令。然而,这要等待肉鸡输入它们的口令。这取决于肉鸡掉线的频度,可能需要几个小时,几天或几周。在快速攻击方法中,这也是为什么从内存中获取SSH密钥对于转向其他机器至关重要。
使用SSH-agent
使用SSH-agent的一个常用方法就是运行"SSH-agent bash",再运行"SSH-add"把键值添加到代理中。一旦添加完成,键值将常驻SSH-agent堆栈中,直到进程终止.当用户使用带有-d或-D选项的SSH-add命令,其他键值也被添加。大多数人只运行一次并遗忘,除非他们需要重启机器。
**从内存中取出SSH Key
**
有一些方法创建SSH-agent内存的副本。最简单的方法是围绕gdb的使用。Gdb使用ptrace调用来绑定SSH-agent。这就为gdb创建运行进程中的内存dump提供了必需权限。 grabagentmem.sh 脚本 提供了一种自动dump内存的方法。默认情况下,当它运行时就会创建一个关于每个SSH-agent进程堆栈的内存dump.这些文件命名为SSHagent-PID.stack.
root@test:/tmp# grabagentmem.sh
Created /tmp/SSHagent-17019.stack
如果机器上的gdb不可用,把整个机器上的内存dump下来,并使用volatility提取SSH-agent进程的堆,这也是一种可行的方案。然而,这个进程当前超过了本文档的范围。
从内存dump中解析SSH密钥
一旦我们得到了堆栈的副本,就有可能从该文件中提取密钥。然而,这个有 SSH-agent 创建的密钥在堆栈中用不同的格式保存的。因此,就有了parse_mem.py 脚本。它需要安装 pyasn1 模块.安装好后,就可以处理内存文件了。如果内存文件中包含了一个合法的 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 中 switch 的 -i 参数。这就像原始的用户密钥,不需要口令去解析。
获取合法可用的 SSH 密钥可以帮助渗透者获取更高的客户端网络访问权限。密钥被用户账号和服务器上的
root 账户同时使用,也是很常见的事情。也可能是服务器配置成只有密钥才可访问。获取到未加密的密钥,才能在环境中游刃有余。