Ruy-Lopez o bloquear la carga de DLLs de AVs/EDRs en procesos maliciosos

Los EDR son como el jugador que mueve fichas blancas en un juego de ajedrez:

  • Hacen el primer movimiento con hooks cargados directamente a través del kernel
  • La DLL de EDR normalmente se carga directamente después de ntdll.dll

Pero, ¿y si podemos evitar que se cargue su DLL? ¿y si nos ponemos como el jugador que mueve las fichas blancas y hacemos los primeros movimientos (al menos para el nuevo proceso)?

Esto es lo que explicó Fabian Mosch en la última X33FCON y ha publicado una PoC con este nuevo enfoque para evitar por completo que los archivos DLL se carguen en un proceso recién generado. Es decir bloquear la carga de archivos DLL de proveedores de AV/EDR, de modo que se omitan las detecciones basadas hooking en userland.

El flujo de la PoC es el siguiente:

La subcarpeta HookForward contiene el PIC-code real que se puede usar como EntryPoint para una función NtCreateSection hookeada.
Por otro lado, Blockdll.nim spawnea un nuevo proceso de Powershell en modo suspendido, inyecta el shellcode en ese proceso y remotamente hookea NtCreateSecion con un JMP a nuestro shellcode.

Como se trata de un PoC, solo amsi.dll se bloquea en el nuevo proceso de Powershell, en este caso, lo que conduce efectivamente a la evasión del AMSI. Pero la PoC también se probó con varios proveedores de EDR y sus archivos DLL sin generar una alerta o sin bloquearse antes de lanzarlo.  

Para probarlo en Linux, el PIC-code compila bien con mingw-w64 versión 10-win32 20220324 (GCC). Con esa versión instalada, el shellcode puede compilarse con un simple make y extraerse de la sección .text a través de bash extract.sh.

Para Windows podemos usar los siguientes comandos:
as -o directjump.o directjump_as.asm
gcc ApiResolve.c -Wall -m64 -ffunction-sections -fno-asynchronous-unwind-tables -nostdlib -fno-ident -O2 -c -o ApiResolve.o -Wl,--no-seh
gcc HookShellcode.c -Wall -m64 -masm=intel -ffunction-sections -fno-asynchronous-unwind-tables -nostdlib -fno-ident -O2 -c -o HookShellcode.o -Wl,--no-seh
ld -s directjump.o ApiResolve.o HookShellcode.o -o HookShellcode.exe
gcc extract.c -o extract.exe
extract.exe
Por supuesto, tendremos que tener instalado también Nim y podemos instalar las dependencias con:
nimble install winim
Y finalmente compilamos la PoC:
nim c -d:release -d=mingw -d:noRes BlockDll.nim # Cross compile
nim c -d:release BlockDll.nim # Windows

Herramienta: https://github.com/S3cur3Th1sSh1t/Ruy-Lopez

pd. para culturilla general si alguien no lo sabía la herramienta se llama así por la Apertura Española o Ruy López, una de las formas más antiguas y estudiadas de comenzar con blancas.

Comentarios