
Crystal Palace-Bibliothek zum Proxying von Nt-API-Aufrufen über den Threadpool. Aktualisiert für Call-Gadgets.
Dies ist eine Verallgemeinerung von https://github.com/AlmondOffSec/LibTPLoadLib, um APIs mit einer beliebigen Anzahl (eigentlich max. 11, aber das reicht) von Argumenten zu proxien. Bereitgestellt als Crystal Palace Shared Library. Die API wurde kompatibel zu @rasta-mouse's LibTP gestaltet, um den Wechsel mithilfe von Spec-Dateien zu erleichtern. Es werden Hooks bereitgestellt, um die neuesten Crystal Palace Funktionen zu demonstrieren.
WARNUNG ⚠️ : Dieses Projekt ist nicht ohne Weiteres nutzbar. Ich stelle kein Modul bereit, in dem sich ein call-Gadget finden lässt. Du musst dein eigenes finden. Lies den Blogpost für weitere Informationen.
Hinweis : Aufgrund der Fähigkeit, 11 Argumente zu übergeben (7 davon werden auf den Stack gelegt), muss sich das Call-Gadget innerhalb einer Funktion mit einem ausreichend großen Stack-Frame befinden. Suche nach einem add rsp von mindestens 0x68.
WARNUNG ⚠️ : Aufgrund der inneren Funktionsweise dieser Technik ist es nicht möglich, den Rückgabewert der geproxieten Funktion abzurufen. Das Proxien von NTAPIs ist generell praktikabler, da deren Rückgabewert „nur" der NTSTATUS ist. Es macht es jedoch schwierig zu wissen, ob die Funktion tatsächlich erfolgreich war 🙃.
Finde ein funktionierendes Gadget in einem Modul, das auf dem Zielsystem verfügbar ist. Ändere in src/tp_gadget.c dessen Namen im LoadLibraryA-Aufruf sowie die Funktion GetCallGadgetAddress, um dessen Adresse abzurufen. Passe den Assembly-Stub bei Bedarf an (sub rsp-Wert, Register, das das Gadget aufrufen wird).
Kompiliere das Projekt: make. Die Ausgabe ist die Crystal Palace Shared Library libtp_gadget.x64.zip.
Kompiliere das Beispiel-COFF (das lediglich wininet.dll lädt und dann lokal Shellcode allokiert und ausführt): make -C example_print. Die Ausgabe ist eine COFF-Datei example_print.x64.o.
Erstelle eine Crystal Palace Spec-Datei, die den Linker anweist, unsere Hooks auf DFR zu verwenden: Verwende die Simple-PIC-Spec-Datei von Tradecraft Garden und füge die folgenden Zeilen zwischen mergelib "../libtcg.x64.zip" und export ein:
mergelib "../libtp_gadget.x64.zip"
attach "KERNEL32$LoadLibraryA" "H_LoadLibraryA"
optout "ProxyNtApi" "H_LoadLibraryA"
attach "NTDLL$NtOpenProcess" "H_NtOpenProcess"
attach "NTDLL$NtAllocateVirtualMemory" "H_NtAllocateVirtualMemory"
attach "NTDLL$NtWriteVirtualMemory" "H_NtWriteVirtualMemory"
attach "NTDLL$NtProtectVirtualMemory" "H_NtProtectVirtualMemory"
attach "NTDLL$NtFreeVirtualMemory" "H_NtFreeVirtualMemory"
attach "NTDLL$NtClose" "H_NtClose"
attach "NTDLL$NtCreateThreadEx" "H_NtCreateThreadEx"
attach "NTDLL$NtOpenThread" "H_NtOpenThread"
attach "NTDLL$NtSuspendThread" "H_NtSuspendThread"
attach "NTDLL$NtResumeThread" "H_NtResumeThread"
attach "NTDLL$NtGetContextThread" "H_NtGetContextThread"
attach "NTDLL$NtSetContextThread" "H_NtSetContextThread"
attach "NTDLL$NtWaitForSingleObject" "H_NtWaitForSingleObject"
Verlinke alles mit Crystal Palace, um PIC-Shellcode zu erzeugen: path/to/crystalpalace/link simplepic_modified/loader.spec example_print/example_print.x64.o out.bin.
Führe den Shellcode mit einem beliebigen Loader aus.