
Implementierung von Ghostly-Hollowing mittels manipulierter Syscalls zur Remote-PE-Injektion
[!NOTE] Das ursprüngliche Repository verwendete zuvor eine falsche Lizenz, die die Namensnennung des Gründers von DeceptIQ, @Rad9800, ausließ, dessen TamperingSyscalls-Repository unter der MIT-Lizenz veröffentlicht ist. Seine Arbeit wurde bereits im Kursmodul (Tampered Syscalls Via Hardware BreakPoints) gewürdigt und ist auch auf unserer öffentlichen Seite zu Lizenzen Dritter aufgeführt.
Nachdem wir von der Auslassung erfahren hatten, korrigierten wir das ursprüngliche Repository umgehend und kontaktierten Rad noch am selben Tag, um uns für das Versehen zu entschuldigen. Trotz unserer besten Bemühungen, den unbeabsichtigten Fehler zu beheben, antwortete er nicht und blockierte die weitere Kommunikation. Fünf Monate später erhielten wir eine DMCA-Takedown-Mitteilung, die zur Löschung des ursprünglichen Repositorys führte.
Leider ließ uns die Eskalation in böser Absicht keinen praktikablen Weg, die Angelegenheit zu lösen. Daher haben wir das Repository mit korrekter Lizenzierung und Namensnennung erneut hochgeladen.
Diese Implementierung nutzt zwei Techniken, die in den jüngsten Aktualisierungen des Maldev-Academy-Kurses behandelt werden:
Tampered Syscalls Via Hardware BreakPoints: Wird verwendet, um Userland-Hooks zu umgehen und gleichzeitig die Argumente des aufgerufenen Syscalls vorzutäuschen.
Ghostly Hollowing: Eine Hybridtechnik zwischen Process Hollowing und Process Ghosting.
Alle in der Implementierung aufgerufenen Syscalls werden über das TAMPER_SYSCALL-Makro aufgerufen. Dieses Makro ruft die Funktion StoreTamperedSyscallParms auf, um:
syscall-Anweisung innerhalb des Syscall-Stubs von NtQuerySecurityObject (d. h. des Köder-Syscalls) zu ermitteln und an dieser Adresse einen Hardware-Breakpoint zu setzen.Beim Aufruf des TAMPER_SYSCALL-Makros täuscht TAMPER_SYSCALL die ersten vier Argumente des aufgerufenen Syscalls mit NULL-Werten vor. Anschließend ruft es den Syscall NtQuerySecurityObject auf, wodurch der zuvor installierte Breakpoint ausgelöst wird.
Wir behandeln die ausgelöste Ausnahme, indem wir die SSN des Köder-Syscalls (NtQuerySecurityObject) durch die SSN des tatsächlich aufgerufenen Syscalls ersetzen (z. B. die von ZwAllocateVirtualMemory). Anschließend ersetzen wir die vorgetäuschten Argumente durch die echten. Diese Schritte werden in der VEH-Funktion ExceptionHandlerCallbackRoutine ausgeführt.
PE-Payload abrufen: Die Implementierung ruft die PE-Payload (mimikatz.exe) von der Festplatte ab. Idealerweise solltest du die Payload verschlüsseln und im Ressourcenabschnitt speichern.
Eine leere Datei auf der Festplatte erstellen: Erstelle eine temporäre Datei (.tmp) im Verzeichnis $env:TMP. Diese Datei wird später mit der PE-Payload überschrieben.
Eine Ghost-Section aus der temporären Datei erstellen: Eine Ghost-Section wird erstellt, indem ZwCreateSection aufgerufen wird, um eine Section aus der zur Löschung vorgesehenen .tmp-Datei zu erstellen. Anschließend wird der Datei-Handle geschlossen und die Datei von der Festplatte gelöscht.
Einen Remote-Prozess erstellen: Mithilfe der WinAPI CreateProcess erstellen wir einen Remote-Prozess und mappen die Ghost-Section auf ihn.
ImageBaseAddress patchen: Patche das Element ImageBaseAddress der PEB-Struktur, sodass es auf die gemappte Ghost-Section zeigt, und führe den Einstiegspunkt der PE-Payload per Thread-Hijacking aus.
Ein großes Dankeschön an hasherezade für die Veröffentlichung von Ghostly Hollowing und all ihren anderen interessanten Injection-Techniken.