
SSH-Snake — это самораспространяющийся, самореплицирующийся безфайловый скрипт, который автоматизирует пост-эксплуатационную задачу обнаружения SSH-приватных ключей и хостов.
🐍 SSH-Snake — это мощный инструмент, предназначенный для автоматического перемещения по сети с использованием закрытых ключей SSH, обнаруженных на системах, с целью создания всесторонней карты сети и её зависимостей, а также определения того, насколько сеть может быть скомпрометирована с помощью SSH и закрытых ключей, начиная с определённой системы.
SSH-Snake автоматически выявляет связи между системами, которые соединены через SSH, что вручную потребовало бы огромных затрат времени и усилий.
Другими словами, SSH-Snake автоматически и рекурсивно выполняет следующие задачи:
user@host), которые могут принять эти ключи.Это полностью самореплицирующийся и самораспространяющийся инструмент, работающий полностью без файлов. Во многих смыслах SSH-Snake — это червь: он копирует себя и распространяется с одной системы на другую, насколько это возможно.
Вместо того чтобы вручную прыгать между системами с ключами SSH, как в игре Super Mario, позвольте SSH-Snake сделать эту работу за вас.
Хотя этот инструмент предназначен для хакерских целей, системные администраторы также могут использовать его для лучшего понимания своей инфраструктуры и сети. Если вы хотите отключить вывод обнаруженных закрытых ключей, закомментируйте эту строку кода.
Подробный анализ того, как на самом деле работает этот скрипт, технические детали, интересные находки, проектные решения, бенчмаркинг и извлечённые уроки можно найти в этой статье блога. Это программное обеспечение написано Джошуа Роджерсом.
Уменьшенный скриншот вывода SSH-Snake в очень маленькой сети. |
|---|
Синие узлы означают, что назначение может подключиться к самому себе (user@host<-->user@host). Красные рёбра указывают на двунаправленное соединение (user1@host1<-->user2@host2). |
|---|
SSH-Snake можно либо скачать, либо передать в bash через pipe:
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, , , , , и , но они не обязательны (скрипт корректно обрабатывает случаи их отсутствия). Если на системе не окажется необходимых пакетов, он мягко сообщает об ошибке, предупреждая пользователя, что сканирование не может быть продолжено на этой конкретной системе (и возвращается, продолжая с предыдущей).
SSH-Snake полностью бесфайловый: после запуска скрипта пользователем он передаётся в bash целевых систем через stdin и аргументы bash (через SSH). На сканируемых системах не остаётся материальных следов скрипта: единственные свидетельства его работы — это дерево процессов и значительное количество неудачных попыток SSH, которые неизбежно произойдут.
SSH-Snake использует поиск в глубину: после подключения к одной системе он пытается подключиться дальше от неё, прежде чем вернуться назад.
Название SSH-Snake связано с тем, что вывод скрипта напоминает змею, ползущую вверх и вниз по сети. Однако, в отличие от игры Snake, SSH-Snake не умирает, когда кусает собственный хвост (подключается к системе, которая уже просканирована или сканируется в данный момент): он просто выводит, как было установлено соединение, и возвращается, не повторяя сканирование (чтобы избежать бесконечной рекурсии).
SSH-Snake протестирован на различных версиях Linux и MacOS (с установленным Homebrew Bash). Если вы столкнётесь с ОС на базе Linux, с которой он несовместим, пожалуйста, сообщите об этом.
.bash_history,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]'
Кратчайший путь от [email protected] до [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 (что он делает автоматически, так как сам является Квином) заставляет bash записывать во временный файл (если размер превышает 65535 байт).
Чтобы уменьшить размер и сохранить полную бесфайловость, в Snake.nocomments.sh удалены все комментарии, лишние пробелы и пустые строки. Это уменьшает размер файла настолько, что временный файл bash не создаётся.
Если вы обнаружите какие-либо ошибки или проблемы, связанные со скриптом, сообщите о них через GitHub Issues. Пожалуйста, укажите ваши настройки конфигурации.
Особый интерес представляют любые необычные выводы [line], связанные с ошибками, которые не были обработаны скриптом.
Только IPv4: Как и все лучшие программы, скрипт не поддерживает IPv6. Не думаю, что в ближайшее время появится поддержка.
Только порт 22: Предполагается, что SSH работает на порту 22.
GNU coreutils: Скрипт сильно завязан на GNU coreutils. Я не определил, насколько (и используется ли вообще) GNU-специфичный код.
Скрипт в настоящее время не ищет сокеты SSH-агента.
iptimeoutarpifconfigipconfigxargs