Event Tracing for Windows (ETW) - Telemetría Avanzada y Detección de Amenazas
ETW es una poderosa tecnología de Windows que permite rastrear eventos del sistema en tiempo real.
Gracias a ella, podemos detectar comportamientos anómalos en procesos, DLLs y ensamblados .NET ⚡
🕵️♂️ Detección 1️⃣: Relaciones Padre-Hijo Sospechosas 👨👦💣
En Windows, las relaciones entre procesos siguen patrones predecibles.
Cualquier desviación de esos patrones puede ser una señal de ataque 🚨
🧩 Concepto
En un entorno normal de Windows, ciertos procesos nunca deberían crear otros.
Por ejemplo:
- ❌
calc.exe→ creandocmd.exe(inusual) - ❌
spoolsv.exe→ creandowhoami.exe(sospechoso)
🧭 Conocer las relaciones padre-hijo legítimas ayuda a detectar anomalías y comportamientos maliciosos.
🧰 Herramientas Clave
-
🧠 Process Hacker → visualizar jerarquía de procesos (árbol padre-hijo)
-
📋 Sysmon (Evento ID 1) → registra creación de procesos (Process Create)
-
🧮 SilkETW → captura del proveedor
Microsoft-Windows-Kernel-Process(mejor fidelidad) -
🔎 ETL / etw.json → archivo con salida ETW que podemos inspeccionar
🔍 Flujo de Análisis Paso a Paso
- Abre Process Hacker y ordena los procesos para ver su jerarquía 🧱
- Simula un ataque con Parent PID Spoofing usando
psgetsystem🎭
PS C:\Tools\psgetsystem> powershell -ep bypass
PS C:\Tools\psgetsystem> Import-Module .\psgetsys.ps1
PS C:\Tools\psgetsystem> [MyProcess]::CreateProcessFromParent([PID de spoolsv.exe], "C:\Windows\System32\cmd.exe", "")

3. 🔎 Observar Sysmon Event 1: verás spoolsv.exe como aparente padre de cmd.exe (engañoso).
- Sysmon puede mostrar el ParentProcessId manipulado → falso positivo potencial. 👻
<!-- Para Event ID 1 (Process Creation) -->
<ProcessCreate onmatch="exclude">
<!-- Para Event ID 10 (ProcessAccess) -->
<ProcessAccess onmatch="exclude">
<!-- Para Event ID 7 (ImageLoad) -->
<ImageLoad onmatch="exclude">
sysmon.exe -c sysmonconfig-export.xml
🧾 Verás que Sysmon Event 1 muestra incorrectamente spoolsv.exe como padre de cmd.exe 👻 pero no que origino powershell

4. 🧾 Para revelar la verdad, captura datos del proveedor Kernel-Process con SilkETW:
.\SilkETW.exe -t user -pn Microsoft-Windows-Kernel-Process -ot file -p C:\windows\temp\etw.json
🔍 Buscar en etw.json por el PID de spool que el atacante usa como señuelo:
Get-Content "C:\windows\temp\etw.json" | Select-String "2,276" | Select-String "ProcessStart"

En el JSON aparecerán entradas tipo:
-
ParentProcessID: "2,276" → PID que el atacante quiere que veas (spoolsv.exe)
-
ProcessID: 4,452 → PID real del proceso que generó el evento (powershell.exe)
-
Process 7,884 → proceso hijo creado (cmd.exe)
- ✅ Correlaciona: si ETW muestra
powershell.execomo creador real y Sysmon muestraspoolsv.exe, entonces hay Parent PID Spoofing.
Sysmon puede ser engañado por técnicas como Parent PID Spoofing.
ETW (Microsoft-Windows-Kernel-Process) ofrece una visión más precisa y resistente a estas falsificaciones. 🧩
🕵️♀️ Detección 2️⃣: Carga Maliciosa de Ensamblados .NET (BYOL) 🧩
Resumen: los atacantes pasan de “Living off the Land” (LotL) a “Bring Your Own Land” (BYOL): cargan ensamblados .NET directamente en memoria para ejecutar código sin dejar artefactos en disco. ETW + Sysmon → visibilidad ampliada (JIT, Loader, métodos) ⚡🧠
🔁 LotL vs BYOL — breve comparación ⚖️
Entender la diferencia ayuda a priorizar detecciones y mitigaciones.
-
LotL (Living off the Land) 🛠️
- El atacante usa herramientas nativas del sistema (PowerShell, certutil, wmic...).
- Ventaja atacante: se mezcla con actividad legítima → menos ruido inicial.
- Defensa: AMSI, reglas sobre PowerShell, detección de comandos sospechosos.
-
BYOL (Bring Your Own Land) 🧩
- El atacante trae y ejecuta su propio código (ensamblados .NET) en memoria.
- Ventaja atacante: evita artefactos en disco → más evasión.
- Defensa: detectar cargas CLR / JIT / ETW DotNETRuntime + EDR con protección en memoria.
Tabla rápida
| Característica | LotL | BYOL |
|---|---|---|
| Origen | Herramientas del sistema | Ensamblados propios (.NET) |
| Artefactos en disco | A veces | Normalmente no (exec in-memory) |
| Detección eficaz | Monitorizar comandos/uso de herramientas | Detectar CLR loads, ETW JIT/Loader, ImageLoad |
| Complejidad atacante | Baja–media | Media–alta |
🧠 ¿Qué es .NET? (rápido y útil) 🧰
.NET es la plataforma y runtime de Microsoft para ejecutar aplicaciones escritas en C#, F#, VB.NET, etc. Incluye el CLR (Common Language Runtime) — el motor que ejecuta código administrado.
Componentes clave
- CLR ⚙️ — gestiona memoria (garbage collector), seguridad y ejecución JIT.
- Assemblies (.dll / .exe) 📦 — contienen IL (Intermediate Language) que se JIT-compila.
- JIT (Just-In-Time) 🔥 — compila IL a código nativo en tiempo de ejecución (genera eventos JIT en ETW).
- BCL (Base Class Library) 📚 — librerías estándar (HTTP, crypto, IO, IPC, etc.).
DLLs asociadas
clr.dll,mscoree.dll,clrjit.dll→ cargadas cuando un proceso usa .NET.- NGen → precompilación a imágenes nativas (también registra eventos).
🔎 Señales/IOCs a vigilar (.NET en memoria)
- 📂 Carga de DLLs .NET en procesos inesperados:
clr.dll,mscoree.dll,clrjit.dll. - ⚙️ Sysmon Event ID 7 (ImageLoad) mostrando esas DLLs en procesos no habituales.
- 🧾 ETW
Microsoft-Windows-DotNETRuntime:JITCompilationStarted/JITCompilationFinished→ métodos JITeados.AssemblyLoad/Loader→ nombres/paths de ensamblados.Interop→ interacciones managed ↔ unmanaged.NGen→ uso/creación de imágenes nativas.
- 🔎 Procesos con
execute-assembly(Cobalt Strike) o argumentos/actividad atípica. - 🕵️ Actividad en memoria sin artefactos en disco + tráfico de red sospechoso.
BYOL suele dejar pocos trazos en disco — prioriza detección basada en comportamiento (CLR/JIT, ETW) y telemetría en memoria.
🛠️ Demo / Comandos prácticos (reproducir / capturar)
1) Ejecutar Seatbelt (ejemplo .NET)
PS C:\Tools\GhostPack Compiled Binaries> .\Seatbelt.exe TokenPrivileges
2) Sysmon — habilitar ImageLoad
Asegúrate que Sysmon tenga EventID 7 activo:
<!-- fragmento ejemplo -->
<ImageLoad onmatch="include" />
3) Captura ETW (SilkETW) — DotNETRuntime
# Captura JIT + Loader + Interop + NGen (0x2038 = ejemplo)
.\SilkETW.exe -t user -pn Microsoft-Windows-DotNETRuntime -uk 0x2038 -ot file -p C:\windows\temp\etw_dotnet.json
4) Inspeccionar el JSON resultante
Get-Content C:\windows\temp\etw_dotnet.json | Select-String -Pattern "JITCompilation|AssemblyLoad|Method"
🧰 Playbook rápido — Respuesta a BYOL (.NET) 🚨
-
🟠 Triage: identificar proceso, PID, usuario, host y timestamp.
-
🔎 Correlación: juntar Sysmon Event 7 + ETW DotNETRuntime (JIT/Loader) + EDR telemetry.
-
🧊 Contención: aislar host si evidencia fuerte.
-
📁 Evidencia: exportar
etw_dotnet.json, sysmon.evtx, memoria y volcado del proceso (si procede). -
🔐 Remediación: bloquear C2, rotar credenciales, eliminar persistencias.
-
📣 Documentar: ticket, IOCs (hashes, cmdline, names).
-
🔁 Ajustar reglas SIEM y añadir whitelists controladas.
No reinicies ni limpies antes de capturar evidencia para análisis forense.
✅ Buenas prácticas y recomendaciones
-
⚙️ Habilita
Microsoft-Windows-DotNETRuntimeETW provider con keywords JIT/Loader/Interop/NGen. -
🧾 Mantén Sysmon ImageLoad activo y filtra ruido (EDR legítimo, servicios).
-
🗂️ Centraliza ingestión de
etw.jsonen tu SIEM y correlaciónalo con Sysmon y EDR. -
🧪 Ejecuta ejercicios red-team que incluyan BYOL para validar detecciones.
-
🔐 Aplica AppLocker/WDAC y EDR con protección en memoria.