Skip to main content

SSH劫持

SSH 是一个可以用于远程访问网络设备的网络协议,广泛运用于 Linux 主机,并且如今 SSH 在 Windows 主机上的使用也越来越广泛。对于我们网络安全人士,直观地概括就是 SSH 会话能给予我们完全交互式的 Shell。SSH 还可以与 FTP 服务集成,以加强文件安全性。因为 SSH 能访问主机的特性,也被一些集中式管理工具集成,以对受管理的主机进行命令执行分发 IT 任务等,

SSH 不仅支持密码登陆,还支持密钥登陆。如果使用密钥认证的话,需要用户通过 ssh-keygen 命令先生成一对私钥与公钥。从 IT 管理员的角度来看,应当尽可能禁用密码认证,只允许密钥认证。尽管基于密钥的认证更加安全,但如果密钥相关的重要文件被窃取或者攥改了,也会导致主机被入侵。对于攻击者,这可以帮助我们实现横向移动。因为如今 Windows 也支持 SSH 服务,针对 SSH 的成功攻击不仅可以让我们入侵更多的 Linux 主机,也可以让我们拿下 Windows 主机以及实现对特权用户的模仿。

用户的公钥通常存储为用户目录下的 .ssh/id_rsa.pub,例如 /home/alice/.ssh/id_rsa.pub,私钥则为 /home/alice/.ssh/id_rsa。除此之外,如果该用户使用 SSH 访问远程主机,远程主机信息会记录在 /home/alice/.ssh/known_hosts中。/home/alice/.ssh/authorized_keys 中保存了可以使用公钥登陆至该主机的用户。

对于攻击者而言,最有吸引力的无疑是 SSH 私钥,因为它可以授予我们访问任何接受该密钥的主机,对于横向移动尤其有用。我们可以在入侵了一台配置有 SSH 服务的主机后搜集各个用户的 SSH 私钥实现持久访问,但如果我们以其他途径获得了 SSH 私钥,那么可以扩大攻击范围。例如,我们可以通过文件包含漏洞读取到权限配置不当的 SSH 私钥,或者当前主机的用户保存了其他主机上用户的 SSH 私钥。这对于开发与生产环境是比较常见的,员工可能需要通过 SSH 连接到多台服务器上作业,因此索性在用户目录下保存了多个主机的 SSH 私钥。然而, SSH 私钥可以被 passphrase 所保护,这个 passphrase 可以在生成 SSH 密钥对的时候设置,是可选的。对于贪图方便的员工,可能就一路回车跳过了这个环节,但也有员工在此过程中设置了 passphrase。幸运的是,即便用户设置了 passphrase,我们是有可能离线破解出来的,如果我们的字典中包含这个 passphrase。

SSH 重要文件

id_rsa

id _rsa 是用户的 SSH 私钥,私钥文件应该被保护好,只有所有者用户才允许拥有读写权限。如果攻击者获得了对该文件的访问权限,他们可以在任何信任相应公钥的系统上模仿该用户。默认情况下,此密钥文件存储在 ~/.ssh/ 目录中。可以通过 ssh-keygen 命令生成,用户可以指定 passphrase,对于贪图方便的用户,可能就一路回车跳过了这个环节。对于设置了 passphrase 的私钥,可以在开头看见加密的字样,我们可以对其进行离线字典破解恢复出 passphrase,方可使用私钥。

 

id_rsa.pub

这是id_rsa对应的公钥。 它可以自由分发,通常添加到用户希望使用 SSH 访问的任何远程系统上的 ~/.ssh/authorized_keys 文件中。 当您尝试连接到远程系统时,系统使用此公钥加密质询消息,如果您可以使用您的私钥解密该消息(从而证明您拥有相应的私钥),您将获得访问权限。

 

authorized_keys

 

 

known_hosts

 

 

对于设置了 passphrase 的 SSH 私钥,我们会在文件中发现 Proc-Type: 4,ENCRYPTED 的字样。我们可以使用 ssh2john 提取 passphrase:ssh2john id_rsa > passphrase.txt。然后使用 john 来破解:john --wordlist=rockyou.txt passphrase.txt

我们来总结一下针对 SSH 密钥的枚举步骤:
1:搜索名为 id_rsa 的文件,当然,私钥可能会被改名,例如 alice.key。
2:检查私钥是否有 passphrase,如果有,尝试破解出 passphrase。
3:查看 authorized_keys,判断哪些用户/主机可以连接到该主机(后文提及利用手法)。从后利用角度,我们也可以将自己的 SSH 公钥添加到该文件末尾,实现持久化访问。
4:查看 known_hosts,配合命令记录判断该用户连接过哪些主机。known_hosts 中的内容可能被哈希过。
5:尝试连接其他主机


SSH 有一个特性叫 Control Master,可以通过单个网络连接共享多个会话。这意味着只要用户建立起第一个 SSH 会话,那么后续的 SSH 连接不再需要密码,从而实现尾随在第一个会话身后。一个常见的情景就是,主机 web02 上的用户正在通过 SSH 访问 web03,而我们已经入侵了 web03,我们可以尾随用户从而无须密码便能移动到 web03。

利用方式如下:
1:假设该主机已经开启 ControlMaster了,在 .ssh 文件夹中会存在 config文件,内容如下

Host *
 ControlPath ~/.ssh/controlmaster/%r@%h:%p
 ControlMaster auto
 ControlPersist yes
List


2:进入 .ssh 文件夹下的 contromaster 子文件夹,我们会发现 socket 文件,文件名格式为 user@host:22。
3:这时候,我们通过命令 ssh user@host 无密码移动到当前用户所在的主机上。

即便当前用户尚未开启 ControlMaster,我们可以替他开启,这样在用户下次访问其他主机的时候,我们就能实现劫持。总结一下,我们在 A 主机上发现用户正在通过 SSH 访问 B 主机,我们可以劫持该会话,尾随在用户后面,无密码移动到主机 B。


除此之外,我们还可以通过 SSH 代理以及 SSH 代理转发实现横向移动。SSH 代理追踪了用户的密钥和 passphrase,因此在输入一次 passphrase 后,用户不再需要重复输入 passphrase,是一种 SSO 的实现。

情景以及利用手法如下:
受害用户从主机A 正在访问主机 B,而我们已经入侵了主机 B,试图移动到主机C。
1:主机 A 已经配置了 SSH代理,在主机 B 上也已经在 sshd_config 中配置了SSH 代理转发:AllowAgentForwarding yes
2:受害用户的私钥被主机 C 所接受,但受害用户尚未连接主机 C
3:攻击者在主机 B 上访问主机 C,无须输入 passphrase。

SSH ControlMaster

root


低特权


SSH 代理转发

root


低特权