Ya sabéis que los Endpoint Detection and Response (EDRs) monitorizan las llamadas a la API de Windows en busca de comportamientos sospechosos. Normalmente, interceptan las funciones en ntdll.dll mediante técnicas como hooking de API en user-mode. Hasta ahora, usábamos evasiones como las syscalls directas, en C, assembly, SysWhispers o Halo’s Gate por ejemplo, pero estas medidas por sí solas ya no son suficientes porque los EDRs modernos han evolucionado y han incorporado múltiples mecanismos de detección:
- Windows y los EDRs ahora usan Event Tracing for Windows (ETW) para capturar actividad en tiempo real. ETW puede detectar cuando un proceso está haciendo syscalls no usuales o ejecutando código en memoria RWX.
- Luego no nos olvidemos de AMSI (Antimalware Scan Interface) que escanea y bloquea shellcode en ejecución.
- Monitorización en kernel-mode. Aunque evitemos los hooks en ntdll.dll, los EDRs modernos inspeccionan las syscalls en kernel-mode. Esto significa que aunque un atacante use una syscall directa, el EDR puede seguir detectando comportamientos anómalos (como la asignación de memoria RWX).
- Detección basada en heurísticas y comportamiento: Un proceso que carga código en memoria ejecutable, realiza modificaciones en el stack o genera procesos hijos sospechosos puede ser detectado incluso sin hooks en ntdll.dll.
- Algunos EDRs implementan detección basada en Machine Learning, que busca patrones de comportamiento en la ejecución del código.
- Inspección de memoria y detección de shellcode. Además herramientas como EDR hooks, ETW y Page Guard pueden detectar cuando un shellcode intenta ejecutarse en memoria no legítima.
- Algunos EDRs ahora aplican protección contra syscall stomping y monitorean qué funciones de Windows están siendo llamadas por los procesos.
...
¿Cómo demonios entonces podemos, nosotros los simples mortales, evadir nuestros queridos e infames EDRs?
Pues como podéis imaginar, los atacantes han desarrollado nuevas técnicas para evadir estas protecciones. En este artículo, exploramos las técnicas más recientes para la evasión de EDRs:
🔨 1. Syscall Stomping Avanzado
Ya sabéis que los EDRs modernos ya detectan las syscalls directas, por lo que los atacantes han adoptado técnicas como syscall stomping para confundir los mecanismos de detección.
📝 Concepto:
En lugar de llamar directamente a una syscall sospechosa (ej. NtAllocateVirtualMemory
), se sobrescribe otra syscall con el número de la deseada.
👨💻 Ejemplo de código en Assembly:
mov r10, rcx
mov eax, 0x3F ; Cambiar el número de syscall
syscall
ret
- ✅ Ventaja: Evita detección de syscalls sospechosas en los logs de los EDRs.
- 🚨 Contra: Algunos EDRs ahora detectan anomalías en la secuencia de syscalls.
🔨 2. Indirect Syscalls con Shadow Stacks
Windows ha implementado Shadow Stacks para detectar manipulaciones de llamadas a funciones. Los atacantes han comenzado a usar Indirect Syscalls, llamando a las funciones desde memoria mapeada.
👨💻 Ejemplo de código en C:
HMODULE hNtdll = LoadLibraryA("C:\\Windows\\System32\\ntdll.dll");
pNtAllocateVirtualMemory NtAllocateVirtualMemory = (pNtAllocateVirtualMemory)GetProcAddress(hNtdll, "NtAllocateVirtualMemory");
- ✅ Ventaja: Usa una copia limpia de
ntdll.dll
para evitar hooks. - 🚨 Contra: Algunos EDRs detectan si
ntdll.dll
se mapea desde una ubicación inusual.
🔨 3. Abuso de Callbacks de Windows
Una de las tendencias más efectivas en 2025 es el abuso de callbacks de Windows, como APC
, DPC
y ETW
para ejecutar código malicioso en contexto de procesos legítimos.
📝 Concepto:
Los EDRs dependen de ETW
para registrar eventos sospechosos. Al deshabilitar ETW en runtime, se puede evadir detección.
👨💻 Ejemplo en C++ para desactivar ETW:
void DisableETW() {
ULONG OldProtect;
PVOID EtwEventSend = GetProcAddress(GetModuleHandleA("ntdll.dll"), "EtwEventWrite");
VirtualProtect(EtwEventSend, 1, PAGE_EXECUTE_READWRITE, &OldProtect);
*(BYTE*)EtwEventSend = 0xC3; // Reemplaza la primera instrucción con RET
}
- ✅ Ventaja: Evita que el EDR registre eventos sospechosos.
- 🚨 Contra: Algunos EDRs detectan la modificación de
ntdll.dll
en memoria.
🔨 4. Hell's Gate y Heaven’s Gate 2.0
Estas técnicas permiten cambiar entre x86
y x64
para ejecutar syscalls sin ser detectadas.
📝 Concepto:
Heaven’s Gate: Un proceso de 64 bits ejecuta syscalls de 32 bits para evitar detección.
Hell’s Gate 2.0: Se identifican y ejecutan syscalls directamente desde
ntoskrnl.exe
.- ✅ Ventaja: Evasión completa de hooks de
ntdll.dll
. - 🚨 Contra: Difícil de implementar y detectar en versiones modernas de Windows.
🔨 5. Procesos Fantasma (Phantom Processes)
Técnica donde un proceso legítimo se reemplaza con otro malicioso sin que el EDR lo detecte.
👨💻 Ejemplo:
Se crea un proceso suspendido (
CreateProcess
conCREATE_SUSPENDED
).Se reemplaza la memoria del proceso (
NtUnmapViewOfSection + VirtualAllocEx
).Se reanuda el proceso (
ResumeThread
).
- ✅ Ventaja: El proceso sigue apareciendo como legítimo en los logs.
- 🚨 Contra: EDRs avanzados pueden detectar anomalías en el flujo de ejecución.
🔨 6. Otros
Abuso de Object Callbacks: Manipulación de callbacks de objetos del kernel para ejecutar código malicioso en procesos privilegiados.
Process Hollowing 2.0: Variantes mejoradas que usan APIs menos monitoreadas para reemplazar procesos en memoria.
Kernel Callbacks Hijacking: Secuestro de callbacks del kernel para desviar la ejecución de procesos legítimos.
Abuso de LSASS Thread Manipulation: Creación y manipulación de hilos en LSASS para evadir detección sin volcar la memoria completa.
Serie MalDev práctico:
- shellcode loader básico
- shellcode injection básico
- ZombieThread
- evasión de AV básica
- evasión de EDR básica
- Threadless Process Injection
- Early Cascade Injection
Comentarios
Publicar un comentario