几周前,我为MITRE的ATT&CK框架提供了SSH劫持横向渗透技术。在这篇文章中,我将详细介绍目前为止发现的关于此次攻击的不同实现,并提供相关细节。我们这里所说的劫持,指的是在不访问身份验证细节的情况下滥用现有会话。因此,没有使用窃取的凭证或私钥。
ControlMaster
SSH的ControlMaster是一种允许多路复用连接的特性。鉴于只需在第一个SSH会话中对目标系统进行身份验证,因此这一性能比较优越。然后根据SSH守护进程的配置,你可以通过已经建立的连接打开多个新的SSH会话。并且可以通过以下两个指令在服务器端进行调优。
1 MaxSessions
2 Specifies the maximum number of open sessions permitted per
3 network connection. The default is 10.
4
5 MaxStartups
6 Specifies the maximum number of concurrent unauthenticated
7 connections to the SSH daemon. Additional connections will
8 be dropped until authentication succeeds or the LoginGraceTime
9 Expires for a connection. The default is 10.
通过将MaxSessions设置为1,可以禁用ControlMaster/会话多路复用,并且每一个新会话都需要一个完整的新连接,包括身份验证步骤。然而如果不这样做,不管你为用户使用了多么强大的身份验证方法,攻击者只需要将代码执行到某个用户的端点,然后等待该用户到SSH的某个地方。攻击者可以通过检查客户端ControlPath(控制路径)指令指定的目录或使用像netstat等常用工具来查找打开的连接。然后,如果攻击者尝试打开一个对主机的SSH会话,该主机已经在ControlMaster中,那么将不需要身份验证,也不需要建立新的连接,因为它正在重新使用现有的连接。请注意,在默认情况下,ControlMaster是启用的。
代理身份验证
为了减少阻碍并使体验更加流畅,许多组织使用了SSH-agent,这是一种允许通过本地套接字文件进行身份验证的服务。当连接到一个远程系统时,你可以选择你的SSH-agent在远程系统中是否可用,以便使用ForwardAgent指令。通过转发代理,你可以在系统中渗透,而不必到处复制密钥,也不必手动重新进行身份验证。然而,这也有不利的一面。如果攻击者在已经转发了你的代理的任何一个系统上获取了根访问权限,那么他可以重用该套接字文件,打开带有你的信息的新的SSH会话。下面是对这一过程的简要概述。
1 # Attacker finds the SSHd process of the victim
2 ps uax|grep sshd
3
4 # Attacker looks for the SSH_AUTH_SOCK on victim's environment variables
5 grep SSH_AUTH_SOCK /proc/
/environ
6
7 # Attacker hijack's victim's ssh-agent socket
8 SSH_AUTH_SOCK=/tmp/ssh-XXXXXXXXX/agent.XXXX ssh-add -l
9
10 # Attacker can login to remote systems as the victim
11 ssh remote_system -l vicitm
如果你现在使用的是OpenSSH,可以通过使用AllowAgentForwarding指令来减轻这种威胁,以确保只有那些需要代理的主机才会拥有它,而不是整个环境。
在这两种情况下,攻击者从来没有直接访问身份验证细节。但是通过滥用SSH这一特性,攻击者可以在不引起大量噪音的情况下向环境横向渗透。我已经提供了一些原生的SSH指令,可以用来减轻这种威胁,但是当然,根据你的需求,你可能需要提出一些不同的要求。
领取专属 10元无门槛券
私享最新 技术干货