无文件、自我传播的 Bash 脚本,递归发现 SSH 私钥和可达主机,然后通过 SSH 遍历网络以绘制入侵路径。
🐍 SSH-Snake 是一款功能强大的工具,旨在利用在系统上发现的 SSH 私钥执行自动网络遍历,其目标是创建网络及其依赖关系的全面映射,确定从特定系统出发,使用 SSH 和 SSH 私钥可以在多大程度上攻陷网络。
SSH-Snake 可以自动揭示通过 SSH 连接的系统之间的关系,而手动完成这项工作通常需要耗费大量的时间和精力。
换句话说,SSH-Snake 会自动且递归地执行以下任务:
user@host),它完全自我复制和自我传播——并且完全无文件。在许多方面,SSH-Snake 实际上是一个蠕虫:它复制自身并从一个系统传播到另一个系统,尽可能远地扩散。
与其像玩超级马里奥游戏一样手动使用 SSH 密钥在系统之间跳转,不如让 SSH-Snake 为你完成这项工作。
尽管此工具旨在用于黑客目的,但系统管理员也可以使用它来更好地了解其基础设施和网络。如果你想禁用打印发现的私钥,请注释掉这行代码。
如需深入了解此脚本的实际工作原理、技术细节、有趣的发现、设计决策、基准测试以及经验教训,请查看这篇博客文章。本软件由 Joshua Rogers 编写。
SSH-Snake 在一个非常小的网络中输出的缩减截图。 |
|---|
蓝色节点表示_目标_可以连接到自身(user@host<-->user@host)。红色边表示连接是双向的(user1@host1<-->user2@host2)。 |
|---|
SSH-Snake 可以下载后使用,也可以通过管道传入 bash:
wget https://raw.githubusercontent.com/MegaManSec/SSH-Snake/main/Snake.nocomments.sh
bash ./Snake.nocomments.sh
或
curl https://raw.githubusercontent.com/MegaManSec/SSH-Snake/main/Snake.nocomments.sh | bash
SSH-Snake 无缝模拟人类攻击者的行为,以发现 SSH 私钥以及可用于连接的目标主机。它完全用 Bash 编写,仅依赖主流 Linux(及 MacOS)系统上常见的少量依赖项:bash、ssh、coreutils、awk、uniq、sort、grep、tr、find 和 cat。需要 getent 或 dscacheutil。仅第一个系统需要 sed。同样,sudo、hostname、ip、timeout、arp、ifconfig、ipconfig 和 xargs 也可能被使用,但它们并非必需(脚本会妥善处理这些工具不存在的情况)。如果发现某个系统缺少任何必需的软件包,脚本会妥善失败,提醒用户无法在该特定系统上继续扫描(并回溯,从上一个系统继续)。
SSH-Snake 完全无文件:用户运行脚本后,脚本通过 stdin 和 bash 参数(经由 SSH)传递给目标系统的 bash。任何被扫描的系统上都不存在脚本的实体痕迹:脚本运行的唯一证据是进程树,以及不可避免会出现的大量无效 SSH 尝试。
SSH-Snake 采用深度优先方法进行发现:一旦连接到某个系统,它会尝试从该系统继续连接,然后再回溯。
SSH-Snake 这个名字来源于脚本的输出看起来像一条蛇在网络中上下蜿蜒。然而,与贪吃蛇游戏不同,SSH-Snake 在咬到自己尾巴时不会死亡(连接到已扫描或正在扫描的系统):它只会像平常一样打印它是如何连接到那里的,然后返回而不重新扫描该目标(以避免无限递归)。
SSH-Snake 已在多种 Linux 发行版和 MacOS(安装了 Homebrew Bash)上测试过。如果你遇到不兼容的基于 Linux 的操作系统,请提交报告。
.bash_history 条目中发现 SSH 私钥文件,SSH-Snake 附带一些可配置的通用设置。这些设置在 SETTINGS.md#general-settings 中有文档说明。
SSH-Snake 还附带各种可配置/即插即用的策略(函数),可用于发现系统上的 SSH 私钥以及发现要尝试连接的主机和目标。已提供合理的默认值,但如果你希望尽可能彻底地执行扫描,启用更多的发现技术会有所帮助。如果扫描耗时过长,禁用一些发现技术会有所帮助。除一个策略(find_ssh_keys)外,每个策略都可以关闭/开启。这些在 SETTINGS.md#configurable-discovery-strategies 中有文档说明。
SSH-Snake 的原始输出包含有关发现的私钥、目标主机和错误消息的混合信息。
关于 SSH-Snake 完整输出的详细说明可在 OUTPUT.md 中找到。
输出示例可在 example-output.log 中找到。
SSH-Snake 的输出可用于创建脚本所遍历网络的图表/可视化。
关于如何根据 SSH-Snake 的输出创建和解读图像/可视化的详细说明可在 GRAPHICS.md 中找到。
除了能够创建 SSH-Snake 所遍历网络的可视化之外,还提供了另外三个工具。即:
forward-lookup-host.py:给定源主机或目标,确定所有可直接或间接(即通过第三级系统)访问的系统。reverse-lookup-host.py:给定目标主机或目标,确定所有可直接或间接访问它的系统。shortest-path-create-chain.py:给定主机或目标 A 和 B,确定连接两者的最短路径。第三个工具还会生成一条可用于从目标 A 连接到目标 B 的命令。例如:
$ python3 tools/shortest-path-create-chain.py --file output.log --src '[email protected]' --dest '[email protected]'
Shortest path from [email protected] to [email protected]: [email protected]>[email protected]>[email protected]>[email protected]
[..]
ssh -i "/home/jrogers/.ssh/key" [email protected] 'sudo ssh -i "/root/.ssh/id_rsa" [email protected] 'ssh -i "/tmp/key" [email protected]''
由于脚本体积相当大,将其加载到 here-document 中(脚本会自动这样做,因为它实际上是一个 Quine)会导致 bash 写入临时文件(因为其大小超过 65535 字节)。
为了缩减体积以保持 100% 无文件化,Snake.nocomments.sh 提供了一个移除了所有注释、多余空白和空行的版本。这会将文件大小缩减到 bash 不再创建临时文件的程度。
如果你遇到任何与脚本相关的缺陷或问题,请将其作为 GitHub issue 报告。请附上你的配置设置。
我特别关注任何与未被脚本捕获的错误相关的有趣 [line] 输出。
仅支持 IPv4:与所有最优秀的程序一样,该脚本不支持 IPv6。我无法想象近期会有对此的支持。
仅支持端口 22:普遍假设 SSH 运行在端口 22 上。
GNU coreutils:该脚本严重依赖 GNU coreutils。我尚未确定脚本中使用了多少(如果有的话)GNU 特有功能。
该脚本目前不会查找 SSH agent 套接字。