
SSH-Snake ist ein selbstverbreitendes, sich selbst replizierendes, dateiloses Skript, das die Post-Exploitation-Aufgabe der SSH-Private-Key- und Host-Erkennung automatisiert.
🐍 SSH-Snake ist ein leistungsstarkes Tool, das automatische Netzwerktraversierung mithilfe von SSH-Private-Keys durchführt, die auf Systemen gefunden wurden, mit dem Ziel, eine umfassende Karte eines Netzwerks und seiner Abhängigkeiten zu erstellen und zu identifizieren, in welchem Umfang ein Netzwerk mit SSH und SSH-Private-Keys ausgehend von einem bestimmten System kompromittiert werden kann.
SSH-Snake kann automatisch die Beziehung zwischen Systemen aufdecken, die über SSH verbunden sind, was normalerweise enorm viel Zeit und Mühe erfordern würde, um manuell durchgeführt zu werden.
Mit anderen Worten: SSH-Snake führt die folgenden Aufgaben automatisch und rekursiv aus:
user@host) finden, die die Private-Keys akzeptieren könnten,Es ist völlig selbstreplizierend und selbstverbreitend – und völlig dateilos. In vielerlei Hinsicht ist SSH-Snake tatsächlich ein Wurm: Es repliziert sich selbst und verbreitet sich von einem System zum anderen, so weit es kann.
Anstatt manuell wie in einem Super-Mario-Spiel zwischen Systemen mit SSH-Keys zu springen, lass SSH-Snake die Arbeit für dich erledigen.
Obwohl dieses Tool für Hacking-Zwecke gedacht ist, können es Systemadministratoren auch nutzen, um ihre Infrastruktur und ihr Netzwerk besser zu verstehen. Wenn du die Ausgabe der entdeckten Private Keys deaktivieren möchtest, kommentiere diese Codezeile aus.
Für einen detaillierten Einblick, wie dieses Skript tatsächlich funktioniert, technische Details, interessante Entdeckungen, Designentscheidungen, Benchmarks und gewonnene Erkenntnisse, schau dir diesen Blogbeitrag an. Diese Software wurde von Joshua Rogers geschrieben.
Eine verkleinerte Bildschirmaufnahme der Ausgabe von SSH-Snake in einem sehr kleinen Netzwerk. |
|---|
Die blauen Knoten zeigen an, dass sich das Ziel selbst verbinden kann (user@host<-->user@host). Die roten Kanten zeigen an, dass die Verbindung bidirektional ist (user1@host1<-->user2@host2). |
|---|
SSH-Snake kann entweder heruntergeladen oder per Pipe an bash übergeben werden:
wget https://raw.githubusercontent.com/MegaManSec/SSH-Snake/main/Snake.nocomments.sh
bash ./Snake.nocomments.sh
oder
curl https://raw.githubusercontent.com/MegaManSec/SSH-Snake/main/Snake.nocomments.sh | bash
SSH-Snake emuliert nahtlos, was ein menschlicher Angreifer tun würde, um SSH-Private-Keys und Ziele zu entdecken, mit denen eine Verbindung hergestellt werden kann. Vollständig in Bash geschrieben, arbeitet es mit einer minimalen Menge an Abhängigkeiten, die auf den wichtigsten Linux- (und MacOS-)Systemen üblich sind: bash, ssh, coreutils, awk, uniq, sort, grep, tr, find und cat. getent ODER dscacheutil sind erforderlich. sed wird nur für das allererste System benötigt. sudo, , , , , , und können ebenfalls verwendet werden, sind aber nicht erforderlich (und das Skript behandelt Fälle, in denen sie nicht vorhanden sind, elegant). Wenn ein System ohne eines der erforderlichen Pakete entdeckt wird, schlägt es fehl und benachrichtigt den Benutzer, dass der Scan auf diesem bestimmten System nicht fortgesetzt werden kann (und geht zurück, um vom vorherigen System aus fortzufahren).
SSH-Snake ist völlig dateilos: Nachdem der Benutzer das Skript ausgeführt hat, wird es über stdin und bash-Argumente (per SSH) an die Ziele übergeben. Es existiert kein materieller Beweis des Skripts auf einem der gescannten Systeme: Der einzige Beweis für die Ausführung des Skripts ist im Prozessbaum und der beträchtlichen Anzahl fehlgeschlagener SSH-Versuche, die unweigerlich auftreten werden.
SSH-Snake verwendet eine Tiefensuche zur Entdeckung: Sobald es eine Verbindung zu einem System hergestellt hat, versucht es, von diesem System aus weiter Verbindungen herzustellen, bevor es zurückgeht.
Der Name SSH-Snake kommt daher, dass die Ausgabe des Skripts wie eine Schlange aussieht, die sich im Netzwerk auf und ab schlängelt. Anders als im Spiel Snake stirbt SSH-Snake jedoch nicht, wenn es sich in den eigenen Schwanz beißt (eine Verbindung zu einem System herstellt, das bereits gescannt wird oder wurde): Es gibt einfach normal aus, wie es dorthin verbunden hat, kehrt aber zurück und scannt das Ziel nicht erneut (um Endlosrekursion zu vermeiden).
SSH-Snake wurde auf verschiedenen Linux-Distributionen und MacOS (mit installiertem Homebrew Bash) getestet. Wenn du auf ein Linux-basiertes Betriebssystem stößt, mit dem es nicht kompatibel ist, reiche bitte einen Bericht ein.
.bash_history-Einträgen,SSH-Snake enthält einige allgemeine Einstellungen, die konfiguriert werden können. Diese Einstellungen sind in SETTINGS.md#general-settings dokumentiert.
SSH-Snake enthält auch eine Vielzahl konfigurierbarer / Plug-and-Play-Strategien (Funktionen), die verwendet werden können, um SSH-Private-Keys auf einem System zu entdecken und Hosts und Ziele zu finden, zu denen eine Verbindung hergestellt werden soll. Sinnvolle Standardwerte sind vorhanden. Wenn du einen Scan jedoch so gründlich wie möglich durchführen möchtest, kann das Aktivieren weiterer Erkennungstechniken hilfreich sein. Wenn ein Scan lange dauert, kann das Deaktivieren einiger Erkennungstechniken hilfreich sein. Mit Ausnahme einer Strategie (find_ssh_keys) kann jede der Strategien ein-/ausgeschaltet werden. Diese sind in SETTINGS.md#configurable-discovery-strategies dokumentiert.
Die Rohausgabe von SSH-Snake enthält eine Mischung aus Informationen über gefundene Private Keys, Ziele und Fehlermeldungen.
Eine detaillierte Erklärung der vollständigen Ausgabe von SSH-Snake findest du in OUTPUT.md.
Ein Beispiel für eine Ausgabe findest du in example-output.log.
Die Ausgabe von SSH-Snake kann verwendet werden, um Graphen/Visualisierungen des Netzwerks zu erstellen, das das Skript durchläuft.
Eine detaillierte Erklärung, wie Bilder/Visualisierungen aus der Ausgabe von SSH-Snake erstellt und interpretiert werden, findest du in GRAPHICS.md.
Zusätzlich zur Fähigkeit, Visualisierungen des Netzwerks zu erstellen, das SSH-Snake durchläuft, werden drei weitere Werkzeuge bereitgestellt. Nämlich:
forward-lookup-host.py: Gib einen Quell-Host oder ein Quell-Ziel an, ermittle alle Systeme, die entweder direkt oder indirekt (d.h. über ein drittes System) erreicht werden können.reverse-lookup-host.py: Gib einen Ziel-Host oder ein Ziel an, ermittle alle Systeme, die es entweder direkt oder indirekt erreichen können.shortest-path-create-chain.py: Gib Host oder Ziel A und B an, ermittle den kürzesten Pfad, der die beiden verbindet.Das dritte Werkzeug generiert auch einen Befehl, der verwendet werden kann, um von Ziel A zu Ziel B zu verbinden. Zum Beispiel:
$ python3 tools/shortest-path-create-chain.py --file output.log --src '[email protected]' --dest '[email protected]'
Kürzester Pfad von [email protected] nach [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]''
Da das Skript recht groß ist, führt das Laden des Skripts in ein Here-Document (was es automatisch tut, da das Skript tatsächlich ein Quine ist) dazu, dass bash in eine temporäre Datei schreibt (da es größer als 65535 Bytes ist).
Um die Größe so zu reduzieren, dass es zu 100 % dateilos bleibt, enthält Snake.nocomments.sh eine Version, in der alle Kommentare, unnötigen Leerzeichen und Leerzeilen entfernt wurden. Dadurch wird die Dateigröße so weit reduziert, dass die temporäre Datei von bash nicht erstellt wird.
Wenn du Fehler oder Probleme im Zusammenhang mit dem Skript feststellst, melde sie bitte als GitHub-Issue. Bitte füge deine Konfigurationseinstellungen bei.
Ich bin besonders an interessanten [line]-Ausgaben interessiert, die mit Fehlern verbunden sind, die vom Skript nicht abgefangen wurden.
Nur IPv4: Wie alle besten Programme unterstützt das Skript IPv6 nicht. Ich kann mir nicht vorstellen, dass es in absehbarer Zeit Unterstützung dafür geben wird.
Nur Port 22: Es wird allgemein angenommen, dass SSH auf Port 22 läuft.
GNU coreutils: Das Skript verlässt sich stark auf GNU coreutils. Ich habe nicht festgestellt, wie viel (falls überhaupt) GNU-ismus im Skript verwendet wird.
Das Skript sucht derzeit nicht nach SSH-Agent-Sockets.
hostnameiptimeoutarpifconfigipconfigxargs