Ataque de "DoS" a EDR mediante Corrupción Estructural del PEB

2026-04-10 — research

El Estado vs. El Flujo

En el dominio de la seguridad ofensiva avanzada, la mera ejecución de código (el flujo) es una señal de alerta trivial. Los sistemas EDR han evolucionado para monitorear el flujo mediante la interceptación de llamadas al sistema (syscall hooking) y la monitorización de transiciones de estado (como las notificaciones de callbacks en el kernel).

Sin embargo, el punto de fallo más profundo y persistente en cualquier arquitectura de seguridad es la manipulación del estado del sistema. Nuestro objetivo aquí es la Denegación de Servicio (DoS) dirigida, forzando al agente EDR a fallar catastróficamente (crash) mediante la corrupción deliberada de estructuras de datos fundamentales en memoria de modo usuario: el Process Environment Block (PEB). Este ataque no busca robar datos, sino invalidar la capacidad de la herramienta de defensa para operar, creando una ventana de oportunidad de ejecución sin supervisión.


Fundamentos Teóricos Avanzados

Para conceptualizar el ataque, es imperativo entender la jerarquía de privilegios y las estructuras de datos que sostienen la ejecución en Windows.

1. La Arquitectura de Privilegios: El Dominio de Ring 0

El sistema operativo Windows opera bajo un modelo de anillos de protección. Ring 0 es el nivel de máximo privilegio, reservado al Kernel (ntoskrnl.exe). Desde este dominio, el atacante tiene acceso directo a la gestión de la memoria física y virtual, y puede interactuar con estructuras internas del núcleo (como la lista de procesos activa, PsActiveProcessHead).

Ventaja Post-Explotación: El acceso a Ring 0 permite al atacante ejecutar hooking en el nivel más bajo posible. Si se logra la ejecución en este nivel, cualquier mecanismo de monitoreo que dependa de la lectura de estructuras de datos internas (como los callbacks de proceso o hilo) puede ser interceptado, modificado o eliminado directamente.

2. El Mecanismo de los Kernel Callbacks

Los EDRs se anclan a la infraestructura de notificación del kernel.

  • Thread Creation: Se registran mediante PsSetCreateThreadNotifyRoutine .
  • Process Creation: Se registran mediante PsSetCreateProcessNotifyRoutine .

Estos callbacks permiten al EDR recibir una notificación asíncrona cada vez que el kernel procesa la creación o terminación de una entidad. La mitigación avanzada implica el desregistro o hooking de las funciones que llaman a estas rutinas (ej. PspCallThreadNotifyRoutines) para prevenir que el EDR reciba la señal de evento.

3. El PEB: El Mapa de Contexto del Proceso

El PEB es una estructura de datos crucial, visible en la dirección FS:[0x30] (o su equivalente en la arquitectura x64). Es el depósito de metadatos que el sistema operativo utiliza para contextualizar un proceso. Contiene punteros a las secciones de memoria cargadas (DLLs, EXE), la información de heap y el estado de los handles.

Vulnerabilidad Intrínseca: La dependencia del EDR en la lectura del PEB es su debilidad. Si el EDR asume que el PEB es un reflejo fiel de la realidad del proceso, corromper un puntero clave (ej. un puntero a la lista de módulos) fuerza al EDR a ejecutar lógica basada en datos erróneos, lo que lleva a una falla lógica o a una excepción de acceso inválido (Access Violation).


Vectores de Ataque y Corrupción de Estado

{% hint style="warning" %} Añadir. Este es uno de las muchas variantes que hay. Como otros ataques que hay similares. Redacto esta porque es cirtamente interesante y no es de las mas complejas de entender {% endhint %}

El ataque se clasifica como un Write-What-Where Primitive ejecutado desde Ring 0.

{% hint style="warning" %} TAMBIÉN DETALLAR QUE ESTA NO ES DE LAS TECNICAS MAS EFECTIVAS. TAMPOCO VOY EXPLICAR ALGO SUMAMENTE EFECTIVO. ESO ES PRIVADO MIO {% endhint %}

1. Requisitos de Ejecución

Se requiere, como mínimo, un driver con privilegios elevados (idealmente, SeDebugPrivilege o un nivel de acceso que permita la escritura arbitraria en la memoria de procesos ajenos).

2. El Proceso de Corrupción

  1. Localización de la Dirección: Se determina la dirección virtual del PEB del proceso objetivo EDR.
  2. Aislamiento de la Estructura: Se identifica el offset específico dentro del PEB (o de una estructura que el PEB referencia, como la lista de módulos cargados) que, si es alterado, causará una excepción controlada o un fallo lógico.
  3. Ejecución de la Escritura: Se utiliza una primitiva de escritura de memoria remota (ej. WriteProcessMemory ejecutada vía un handle obtenido en Ring 0) para sobrescribir el valor.

Consecuencia Mecánica: Si sobrescribimos un puntero de módulo (LDR_DATA_TABLE_ENTRY) con un valor nulo o un valor que apunta a una región no mapeada, la siguiente vez que el EDR intente resolver ese módulo (ej. al iniciar un dump o validar un handle), la CPU generará una excepción de página no válida (STATUS_INVALID_ADDRESS), provocando el crash del proceso EDR.


Implementación Conceptual en Nivel de Kernel

El siguiente pseudo-código ilustra la función crítica que debe residir en el driver malicioso, asumiendo que ya se ha obtenido el handle y la dirección base del PEB del objetivo.

{% hint style="danger" %} ES UN CODIGO DE EJEMPLO. NO ES CODIGO PARA QUE SEA UTILIZADO {% endhint %}

// Pseudo-código de la función de ataque en el Kernel Driver (Ring 0)

NTSTATUS CorruptPEB(PVOID TargetProcessHandle, PVOID PEB_Address, ULONG Offset, ULONG NewValue) {
    // 1. Verificación de Privilegios: Asegurar el derecho de depuración es mandatorio.
    if (!CheckPrivilege(SE_DEBUG_NAME)) {
        return STATUS_ACCESS_DENIED;
    }

    // 2. Apertura del Handle: Se necesita un handle con permisos de escritura remota.
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, TargetProcessHandle);
    if (hProcess == NULL) return STATUS_INTERNAL_ERROR;

    // 3. Determinación del Target Address: La dirección física/virtual a modificar.
    PVOID TargetFieldAddress = (BYTE*)PEB_Address + Offset; 

    // 4. Ejecución de la Escritura Remota: Uso de WriteProcessMemory.
    BOOL success = WriteProcessMemory(
        hProcess,               // Handle del proceso EDR
        (LPCVOID)TargetFieldAddress, // Dirección objetivo
        &NewValue,              // Valor de corrupción (ej: 0xDEADBEEF)
        sizeof(ULONG),
        NULL
    );

    if (success) {
        // 5. Limpieza y Confirmación.
        CloseHandle(hProcess);
        return STATUS_SUCCESS;
    } else {
        return STATUS_WRITE_FAILED_REMOTE;
    }
}

Análisis Avanzado: La complejidad reside en que el valor NewValue debe ser tan malicioso que no solo cause un crash, sino que lo haga de una manera que no active mecanismos de detección de corrupción de memoria (como heap canaries o guard pages).


Conclusión: La Paradoja de la Supervisión

{% hint style="success" %} Añadir. yo esta misma tecnica la e probado con dos EDRs de mi laboratorio personal con resultados favorables (hay ligeras variaciones). Para otros productos puede que necesites mas paso o directamente no sea efectiva {% endhint %}

El ataque a través de la corrupción del PEB ilustra la paradoja fundamental de la seguridad basada en el software: cuanto más detallada es la visibilidad que un agente de seguridad tiene sobre el estado del sistema, más información crítica puede ser explotada y corrompida.

Al atacar la estructura fundamental del contexto de ejecución, el atacante fuerza al sistema a entrar en un estado de inconsistencia lógica, el cual es el objetivo final en cualquier fase de post-explotación.

La defensa contra esta clase de ataque requiere migrar la detección desde la inspección de APIs (Ring 3) hacia la verificación de la integridad del estado del kernel (Ring 0), implementando mecanismos de sanitización de estructuras críticas como el PEB, lo cual es un esfuerzo de ingeniería de sistema operativo monumental y continuo.

Nota: Este artículo tiene fines exclusivamente educativos y de investigación en seguridad. Las técnicas descritas deben utilizarse únicamente en entornos controlados y con autorización explícita. Y no me hago responsable de cualquier uso indevido

← back to blog