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

2020-10-15 10:45:40

如果您曾经使用SSH密钥管理过多台机器,那么您很有可能使用过SSH-agent。此工具旨在将SSH密钥保存在内存中,以便用户不必每次都键入他们的密码短语。但是,这可能会造成一些安全风险。以根用户身份运行的用户可能具有从内存中提取解密的SSH密钥并重新构建它的能力。

由于需要超级用户访问权限,此攻击可能看起来无用。例如,攻击者可以安装键盘记录程序并使用它来获取SSH密钥的密码短语。但是,这会导致攻击者不得不等待目标键入其密码。这可能是小时、天或周,具体取决于目标注销的频率。这就是从内存中获取SSH密钥对于快速转移到其他机器至关重要的原因。

使用SSH-agent的一种常见方法是运行“SSH-agent bash”,然后运行“SSH-add”将密钥添加到代理。一旦添加,密钥将保留在SSH代理的堆栈中,直到进程结束、添加另一个密钥或用户将-d或-D选项与SSH-add一起使用。大多数人会运行一次,然后忘记它,直到他们需要重新启动。

有几种方法可以创建SSH代理内存的副本。最简单的方法是使用gdb。Gdb使用ptrace调用附加到SSH代理。这为gdb提供了创建正在运行的进程的内存转储所需的权限。Sh脚本提供了自动转储此内存的方法。默认情况下,当它运行时,它将为每个SSH代理进程创建堆栈的内存转储。这些文件被命名为SSHagent-PID.stack。

如果gdb在系统上不可用,那么获取整个机器的内存转储并使用易失性来提取SSH代理进程的堆栈可能是可行的。但是,此过程目前不在本文档的讨论范围内。

一旦我们有了堆栈的副本,就可以从该文件中提取密钥。但是,密钥以与SSH-keygen生成的格式不同的格式保存在堆栈中。这就是parse_mem.py脚本派上用场的地方。此脚本需要安装pyasn1 python模块。一旦安装完毕,就可以针对内存文件运行脚本了。如果该内存文件包含有效的RSA SSH密钥,则会将其保存到磁盘。该工具的未来版本可能支持其他密钥格式,如DSA、ECDSA、ED25519和RSA1。

然后,此key.rsa文件可以用作SSH中-i开关的参数。这将与原始用户的密钥相似,只是不需要密码短语即可解锁。

获得有效的、可用的SSH密钥可以帮助渗透测试员获得对客户端网络的进一步访问。在用户的帐户上以及服务器上的根帐户上使用密钥是很常见的。也可以将服务器配置为仅允许密钥访问。访问未加密的密钥可以使在环境中移动变得容易得多。

我不得不说,这似乎很明显。这就是为什么keychain和ssh-agent首先有超时选项的原因,不是吗?是一种风险和便利性的平衡。Https://unix.stackexchange.com/questions/32609/can-i-set-how-long-ssh-agent-keeps-keys-in-memory http://ubuntuforums.org/showthread.php?t=1271580。

超时的好处是你可以把自己设定在你想要平衡的地方。

我认为,当用户处于root状态并尝试执行以下操作时,这是不太可能的情况。考虑到用户在根目录中具有访问权限,另一种方法是扫描HDD中的.rsa文件并恢复它们。再说一次,这是一篇很棒的文章,但在真实的工作环境中不太可能看到这种情况,除非管理员粗心大意的🙂。

旧新闻…。就像我的一位水手说的那样,2012年来了电话,并在语音信箱中留下了这些信息: