
Erkennen, ob ein Dienst (blind) installiert und/oder ausgeführt wird (falls benannte Pipes verfügbar gemacht werden) auf einem entfernten Rechner, ohne lokale Administratorrechte zu verwenden.
Erkennt, ob ein Dienst auf einem entfernten Rechner installiert ist (blind) und/oder ausgeführt wird (falls er benannte Pipes exponiert), ohne lokale Administratorrechte zu benötigen.
Genauer gesagt verbindet sich das Skript remote mit dem SMB-Dienst des Ziels (445/tcp) und führt Folgendes aus:
Prüft, ob der angegebene Dienst installiert ist, über den [MS-LSAT] RPC-Aufruf LsarLookupNames(). Es ist kein privilegiertes Konto erforderlich, aber es ist nur eine „blinde“ Abfrage möglich (Dienste können nicht aufgelistet werden, wir können nur den Status eines bestimmten Dienstes abfragen).
Prüft, ob die angegebene Named Pipe auf dem Ziel vorhanden ist. Dienste (Prozesse) können eine für den Dienst charakteristische Named Pipe exponieren, die auch von einem unprivilegierten Benutzer gesehen werden kann. Die Prüfung bestimmter für Dienste charakteristischer Named Pipes kann uns daher Rückschlüsse darauf geben, ob der jeweilige Dienst läuft oder nicht.
Dies ist ein eigenständiges Python-Skript, das Impacket verwendet; es muss nichts installiert werden. Getestet wurde es auf aktuellem Kali und Arch Linux mit der neuesten offiziellen Impacket-Version (0.10.0 und 0.9.24) und Python (3.9 und 3.10).
Die Dienste, die zu prüfenden Dienstnamen und die für den Dienst charakteristischen Named Pipes werden in JSON-Konfigurationsdateien angegeben (oder CSV-Dateien, falls das bequemer ist, was ich später festgestellt habe :), daher ist auch ein benutzerdefinierter csv2json-Konverter verfügbar) im Ordner conf. Zum Verständnis des Formats siehe die enthaltenen Beispiele.
Enthaltene Konfigurationsdateien:
Anwendungsfälle können um weitere Dienste / Named Pipes erweitert werden; die EDR-Konfiguration ist ziemlich unvollständig, also kannst du gerne mehr hinzufügen.
Das Skript verwendet das JSON-Konfigurationsformat, aber später habe ich festgestellt, dass das Schreiben von CSV viel bequemer ist, daher ist das Skript csv2json.py enthalten, um die CSV nach JSON zu konvertieren.
Die Ausführung gegen ein einzelnes Ziel zum Aufzählen von AV/EDR-Diensten (oder was auch immer) ist unkompliziert:
./serviceDetector.py -conf conf/edr.json evil.corp/johndoe:[email protected]
Kerberos-Authentifizierung wird ebenfalls unterstützt (die Umgebungsvariable KRB5CCNAME zeigt auf die Ccache-Datei):
./serviceDetector.py -conf conf/edr.json -k -no-pass server.ecorp.local
Für die effektive Ausführung gegen mehrere Ziele ist GNU parallel super nützlich:
cat targets.txt | parallel -j 50 ./serviceDetector.py evil.corp/johndoe:Passw0rd1@{}
Beachte, dass du vor der Ausführung gegen viele Ziele erst gegen eines testen solltest, um eine Kontosperrung zu verhindern (z. B. bei einem falsch geschriebenen Passwort).
Opsec-Hinweis: Beachte, dass gleichzeitige Massen-Logins bei verschiedenen Zielen SOC-Alarme auslösen können.
Die beiden hier verwendeten Techniken sind nicht neu.
[MS-LSAT] RPC-Aufruf LsarLookupNames() wurde bereits früher von Vincent Le Toux (@mysmartlogon) im Antivirusscanner-Modul des großartigen PingCastle-Tools verwendet.
Die Idee mit den Named Pipes zur Erkennung laufender Dienste wurde durch diesen Tweet von Lee Christensen (@tifkin_) inspiriert, als er sie zur Erkennung des WebClient-Dienstes einsetzte. Diese Technik zur AV/EDR-Erkennung wurde auch vom NamedPipeTouch-Tool der NSA verwendet (das von der Gruppe The Shadow Brokers geleakt wurde).