🐍 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、、、、 和 也可能被使用,但它们不是必需的(脚本会优雅地处理它们缺失的情况)。如果发现某个系统缺少任何必需包,它会优雅地失败,提示用户扫描无法在该系统上继续(并回溯,从之前的系统继续执行)。
SSH-Snake 完全无文件化:用户运行脚本后,它通过标准输入和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文档中(脚本自动这样做,因为它实际上是一个Quine) 会导致bash写入临时文件(因为它超过65535字节)。
为了减小尺寸以保持100%无文件化,Snake.nocomments.sh 提供了一个移除了所有注释、不必要的空白和空行的版本。这减小了文件大小,从而bash不会创建临时文件。
如果您遇到与脚本相关的任何错误或问题,请作为GitHub问题报告。请包括您的配置设置。
我特别感兴趣的是与脚本未捕获的错误相关的任何有趣的 [line] 输出。
timeoutarpifconfigipconfigxargs