RefleXXion: una utilidad para unhookear AV/EPP/EDR

RefleXXion es una utilidad diseñada para ayudar a bypassear los hooks en modo de usuario utilizados por AV/EPP/EDR, etc. Para ello, primero recopila los números de las syscalls de NtOpenFile, NtCreateSection, NtOpenSection y NtMapViewOfSection que se encuentran en el array LdrpThunkSignature. Después de eso, hay dos técnicas que el usuario puede elegir para omitir los hooks:

  • Técnica 1: lee el NTDLL como un archivo de C:\Windows\System32\ntdll.dll. Después de parsearlo, la sección .TEXT del NTDLL ya cargado (donde se realizan los hooks) en la memoria se reemplaza con la sección .TEXT del NTDLL limpio.
  • Técnica 2: NTDLL se lee como Sección de KnownDlls, \KnownDlls\ntdll.dll. (porque los archivos DLL se almacenan en caché en KnownDlls como Sección). Después del parsing, la sección .TEXT del NTDLL ya cargado (donde se realizan los hooks) en la memoria se reemplaza con la sección .TEXT del NTDLL limpio.

El flujo detallado de la metodología y todas las técnicas se muestra a continuación. 

USO

Se puede abrir y compilar el proyecto con Visual Studio. Todo el proyecto es compatible con la arquitectura x64 para los modos debug y release.

  • La solución RefleXXion-EXE genera el EXE para fines de PoC. Si quieres entender cómo funciona el proyecto paso a paso, te facilitará el trabajo. La función principal contiene las definiciones de las funciones Técnica 1 y Técnica 2. Comenta uno de ellos y compila. No utiliceis ambas funciones al mismo tiempo.
  • La solución RefleXXion-DLL genera la DLL que inyecta en el proceso que desea omitir los hooks de modo de usuario para NTDLL. Al comienzo del archivo main.cpp, hay definiciones de qué técnica usar. Puedes elegir uno de ellos y compilarlo. Igual que antes, no configurar todos los valores al mismo tiempo, configurar solo la técnica que desee. A continuación se proporciona un ejemplo de configuración.

// Techniques configuration section
#define FROM_DISK 1 // If you set it to 1, the Technique-1 will be used. For more information; https://github.com/hlldz/RefleXXion
#define FROM_KNOWNDLLS 0 // If you set it to 1, the Technique-2 will be used. For more information; https://github.com/hlldz/RefleXXion


Notas de uso operativo y preocupaciones de OPSEC

  • RefleXXion actualmente solo es compatible con la arquitectura x64.
  • RefleXXion solo unhookea las funciones NTDLL, es posible que también se deba unhookear otras DLLs (kernel32.dll, advapi32.dll, etc.). Para esto, se puede editar fácilmente los lugares necesarios en el proyecto.
  • RefleXXion solo utiliza la región de memoria RWX cuando se inicia el proceso de sobrescritura de la sección .TEXT. Para este proceso no se crea una nueva región de memoria, la región de memoria existente (la sección de TEXT del NTDLL que ya está cargada) se pone a RWX y luego se convierte a RX.

    ULONG oldProtection;
    ntStatus = NtProtectVirtualMemory(NtCurrentProcess(), &lpBaseAddress, &uSize, PAGE_EXECUTE_READWRITE, &oldProtection);
    memcpy()...
    ntStatus = NtProtectVirtualMemory(NtCurrentProcess(), &lpBaseAddress, &uSize, oldProtection, &oldProtection);


PD. RefleXXion invoca la API NtProtectVirtualMemory sobre el NTDLL instalado limpiamente. Utiliza la función CustomGetProcAddress para ello porque el NTDLL limpio no está en InLoadOrderModuleList aunque esté cargado en la memoria. Entonces, una solución como esta (https://stackoverflow.com/questions/6734095/how-to-get-module-handle-from-func-ptr-in-win32) no funcionará. Por eso existe y se utiliza la función GetProcAddress customizada.

  • Podemos cargar RefleXXion DLL desde el disco al proceso de destino. Es posible que no se prefiera hacerlo para una operación delicada por lo que se puede convertir la DLL de RefleXXion a shellcode utilizando el proyecto sRDI o integrar el código de RefleXXion en un loader o proyecto propios.
  • Incluso si NTDLL (como archivo o como sección) se vuelve a cargar en el proceso inyectado, no permanece cargado. RefleXXion cierra todos los identificadores abiertos (identificadores de archivos y secciones) para procesos propios.

Proyecto: https://github.com/hlldz/RefleXXion

Comentarios