Persistencia WMI: checklist de respuesta a incidentes
Checklist paso a paso para la persistencia WMI: consultas en vivo, el repositorio, eventos 5860 y 5861, Sysmon 19-21, evidencias de ejecución y limpieza segura.
En resumen. Primero recopile el repositorio, después examine el host en vivo y luego correlacione. Los objetos le dicen qué se ejecuta y cuándo; Microsoft-Windows-WMI-Activity/Operational (ID de evento 5861) y Sysmon (19–21) le dicen cuándo se registró; Prefetch, Amcache y la telemetría de procesos le dicen si se ejecutó. Limpie solo después de preservar las evidencias.
1. Preservar el repositorio
Copie C:\Windows\System32\wbem\Repository desde una instantánea de volumen antes de tocar WMI: cómo recopilar el repositorio WMI. Eliminar una suscripción, instalar software o reconstruir el repositorio puede sobrescribir registros eliminados que aún no ha leído.
2. Examinar el host en vivo
Enumere lo que WMI ejecuta actualmente, en los espacios de nombres habituales:
'root/subscription','root/cimv2','root/default' | ForEach-Object {
$ns = $_
'__EventFilter','__EventConsumer','__FilterToConsumerBinding' | ForEach-Object {
Get-CimInstance -Namespace $ns -ClassName $_ -ErrorAction SilentlyContinue
}
} | Format-List *
Sysinternals Autoruns tiene una pestaña WMI con la misma vista en vivo. Ambos muestran solo los objetos activos y dependen de un servicio WMI que un atacante puede controlar.
3. Analizar los archivos recopilados
Suelte la carpeta Repository en WMI Parser. Compruebe, por orden:
- Los enlaces que no son predeterminados de Windows. Las suscripciones SCM Event Log y BVT son esperables, cuando su contenido coincide (detalles).
- La acción del consumidor: línea de comandos, texto o archivo del script, y rutas. El PowerShell codificado, los binarios en
C:\ProgramData,C:\Users\…o%TEMP%y los consumidores de script merecen una lectura atenta. - El disparador del filtro: tiempo de actividad (se dispara tras cada arranque), inicio de sesión, temporizadores, inicio de procesos o eventos de dispositivos.
CreatorSIDen cada objeto: qué cuenta lo registró.- Objetos recuperados: enlaces eliminados, versiones anteriores, consumidores sin enlazar. Muestran lo que existió y lo que se limpió (cómo funciona la recuperación).
- Espacios de nombres distintos de
root\subscription.
4. Correlacionar con los registros de eventos
| Registro | Evento | Qué aporta |
|---|---|---|
| Microsoft-Windows-WMI-Activity/Operational | 5861 | Un consumidor permanente enlazado a un filtro: espacio de nombres, filtro, consumidor y su contenido |
| Microsoft-Windows-WMI-Activity/Operational | 5860 | Una suscripción temporal (solo existe mientras su proceso se ejecuta) |
| Microsoft-Windows-WMI-Activity/Operational | 5857 | Un proveedor WMI cargado, con la ruta de su DLL |
| Sysmon | 19, 20, 21 | Filtro, consumidor y enlace creados o eliminados, con el usuario |
| Security | 4688 | Creación de procesos (si está habilitada): hijos de WmiPrvSE.exe y scrcons.exe |
El repositorio en sí no tiene una hora de creación documentada para sus objetos; estos eventos son la forma de fecharlos. Los dos FILETIME que WMI Parser muestra para cada cabecera de instancia son pistas que contrastar con ellos.
5. Buscar evidencias de ejecución
Una suscripción demuestra configuración, no ejecución. Para la carga útil del consumidor, revise Prefetch, Amcache, ShimCache, SRUM y la telemetría del EDR; para los scripts, el árbol de procesos bajo scrcons.exe; para las líneas de comandos, los procesos cuyo padre es WmiPrvSE.exe. Alinee sus horas con los reinicios (para disparadores de tiempo de actividad) o con los inicios de sesión (para disparadores de inicio de sesión).
6. Revisar el entorno
- Archivos MOF y AutoRecover: un
.mofcompilado con#pragma autorecoverse vuelve a aplicar cuando se reconstruye el repositorio. ReviseC:\Windows\System32\wbem\AutoRecovery el valorAutorecover MOFsenHKLM\SOFTWARE\Microsoft\Wbem\CIMOM. - Clases personalizadas: datos o código escondidos en las propiedades de una clase definida por el atacante, fuera de la tríada de la suscripción.
- Otros hosts: los mismos nombres de filtro y consumidor en varias máquinas apuntan a un despliegue remoto.
7. Limpiar de forma segura
Cuando las evidencias estén preservadas y se conozca el alcance, elimine los tres objetos en el espacio de nombres donde residen, empezando por el enlace:
$ns = 'root/subscription'
Get-CimInstance -Namespace $ns -ClassName __FilterToConsumerBinding | Where-Object { $_.Filter.Name -eq 'IntelPerfMonitor' } | Remove-CimInstance
Get-CimInstance -Namespace $ns -ClassName CommandLineEventConsumer -Filter "Name='IntelPerfMonitor'" | Remove-CimInstance
Get-CimInstance -Namespace $ns -ClassName __EventFilter -Filter "Name='IntelPerfMonitor'" | Remove-CimInstance
Sustituya los nombres por los suyos (estos proceden del ejemplo ficticio). Después borre la carga útil a la que apuntaba el consumidor y vuelva a ejecutar la consulta en vivo para confirmarlo.
FAQ
¿Qué ID de evento muestra una nueva persistencia WMI?
El ID de evento 5861 en Microsoft-Windows-WMI-Activity/Operational se registra cuando un consumidor de eventos permanente se enlaza a un filtro. Sysmon, si está configurado, añade los eventos 19, 20 y 21 para filtros, consumidores y enlaces.
¿Cómo elimino una persistencia WMI?
Después de recopilar las evidencias, elimine el enlace y luego el consumidor y el filtro con Get-CimInstance … | Remove-CimInstance en el espacio de nombres donde residen, y borre la carga útil a la que apuntaba el consumidor.
¿Basta con la consulta en vivo?
No. Solo muestra los objetos activos del espacio de nombres consultado, nunca los eliminados, y depende del servicio WMI de un host posiblemente comprometido. Analice también el repositorio recopilado.