🧰 Get-WinEvent — Análisis masivo de logs Windows / Sysmon
🔎 Evento Get-WinEvent — Análisis masivo de registros (Windows / Sysmon) 🛡️
Entender y procesar grandes volúmenes de logs (Windows Event Log y Sysmon) es crítico para IR y threat hunting.
Get-WinEvent es la herramienta PowerShell ideal para consultar, filtrar y exportar estos registros a escala. ⚡
📚 Por qué importa
- Los registros contienen trazas sobre actividades de usuarios, cambios del sistema, comunicaciones de red, creación de procesos, cargas de DLL, etc. 🧾
- En infraestructuras grandes se generan millones de eventos al día — necesitas filtrar y automatizar. 🤖
🛠️ Listar logs y proveedores
🔎 Listar todos los logs disponibles
Get-WinEvent -ListLog * |
Select-Object LogName, RecordCount, IsClassicLog, IsEnabled, LogMode, LogType |
Format-Table -AutoSize
Útil para ver qué registros existen (Application, System, Security, Microsoft-Windows-*, etc.), conteo y modo (Circular, Retention, etc.).
🔎 Listar proveedores de eventos
Get-WinEvent -ListProvider * | Format-Table -AutoSize
Los providers son las fuentes de eventos (p. ej. PowerShell, Microsoft-Windows-Sysmon, Microsoft-Windows-WinRM).
📥 Recuperar eventos — ejemplos comunes
▶️ Recuperar últimos N eventos del registro System
Get-WinEvent -LogName 'System' -MaxEvents 50 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
▶️ Recuperar eventos de un registro operativo específico (WinRM)
Get-WinEvent -LogName 'Microsoft-Windows-WinRM/Operational' -MaxEvents 30 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
▶️ Recuperar los eventos más antiguos
Get-WinEvent -LogName 'Microsoft-Windows-WinRM/Operational' -Oldest -MaxEvents 30 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
⛏️ Leer archivos .evtx exportados
Get-WinEvent -Path 'C:\Tools\chainsaw\EVTX-ATTACK-SAMPLES\Execution\exec_sysmon_1_lolbin_pcalua.evtx' -MaxEvents 5 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Muy útil para análisis forense offline o reproducir incidentes.
🔍 Filtrado potente: -FilterHashtable
▶️ Filtrar por IDs en Sysmon (Process Create / Network Connect)
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational'; ID=1,3} | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
ID=1 → Process Create. ID=3 → Network connection.
▶️ Filtrar por Path de archivo en .evtx
Get-WinEvent -FilterHashtable @{Path='C:\Tools\chainsaw\EVTX-ATTACK-SAMPLES\Execution\sysmon_mshta_sharpshooter_stageless_meterpreter.evtx'; ID=1,3} | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
📆 Filtrar por rango de fechas
$startDate = (Get-Date -Year 2023 -Month 5 -Day 28).Date
$endDate = (Get-Date -Year 2023 -Month 6 -Day 3).Date
Get-WinEvent -FilterHashtable @{
LogName='Microsoft-Windows-Sysmon/Operational';
ID=1,3;
StartTime=$startDate;
EndTime=$endDate
} | Select-Object TimeCreated, Id, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
EndTime es exclusivo — por eso se usó 3 de junio para incluir todo el 2 de junio.
🧾 Parsing de XML de eventos (extraer campos concretos)
▶️ Ejemplo: extraer SourceIp / DestinationIp de Sysmon EventID 3
Considere un escenario de detección de intrusiones donde una conexión de red sospechosa a una IP en particular (52.113.194.132) ha sido identificado. Con Sysmon instalado, puedes usarlo ID de evento 3 (conexión de red) registros para investigar la amenaza potencial.
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational'; ID=3} |
ForEach-Object {
$xml = [xml]$_.ToXml()
$eventData = $xml.Event.EventData.Data
New-Object PSObject -Property @{
SourceIP = $eventData | Where-Object {$_.Name -eq "SourceIp"} | Select-Object -ExpandProperty '#text'
DestinationIP = $eventData | Where-Object {$_.Name -eq "DestinationIp"} | Select-Object -ExpandProperty '#text'
ProcessGuid = $eventData | Where-Object {$_.Name -eq "ProcessGuid"} | Select-Object -ExpandProperty '#text'
ProcessId = $eventData | Where-Object {$_.Name -eq "ProcessId"} | Select-Object -ExpandProperty '#text'
}
} | Where-Object {$_.DestinationIP -eq "52.113.194.132"}
ProcessGuid te permite rastrear el proceso en el tiempo y correlacionarlo con otros eventos.
🔎 Filtrado con -FilterXml (XML query)
En la sección "Tapping Into ETW" buscábamos anomalías clr.dll y mscoree.dll cargar actividad en procesos que normalmente no los requerirían. El siguiente comando aprovecha el ID de evento 7 de Sysmon para detectar la carga de las DLL mencionadas anteriormente.
$Query = @"
<QueryList>
<Query Id="0">
<Select Path="Microsoft-Windows-Sysmon/Operational">
*[System[(EventID=7)]] and *[EventData[Data='mscoree.dll']] or *[EventData[Data='clr.dll']]
</Select>
</Query>
</QueryList>
"@
Get-WinEvent -FilterXml $Query | ForEach-Object { Write-Host $_.Message `n }
Muy útil para consultas complejas que combinan condiciones del System y EventData.
🔗 Filtrado con XPath: ejemplo (FilterXPath)
Para utilizar consultas XPath con Get-WinEvent, necesitamos utilizar el -FilterXPath parámetro. Esto nos permite crear una consulta XPath para filtrar los registros de eventos.
Por ejemplo, si queremos obtener la creación de procesos (ID de evento de Sysmon 1) eventos en el registro de Sysmon para identificar la instalación de cualquiera Sistemas internos herramienta podemos utilizar el siguiente comando. Nota: Durante la instalación de una herramienta Sysinternals el usuario deberá aceptar el EULA presentado. La acción de aceptación involucra la clave de registro incluida en el siguiente comando.
Get-WinEvent -LogName 'Microsoft-Windows-Sysmon/Operational' -FilterXPath "*[EventData[Data[@Name='Image']='C:\Windows\System32\reg.exe']] and *[EventData[Data[@Name='CommandLine']='`"C:\Windows\system32\reg.exe`" ADD HKCU\Software\Sysinternals /v EulaAccepted /t REG_DWORD /d 1 /f']]" |
Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message |
Format-Table -AutoSize
XPath te permite filtrar por valores concretos dentro de EventData (p. ej. Image, CommandLine).
🧩 Visualizar todas las propiedades de un evento (útil para descubrir índices)
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational'; ID=1} -MaxEvents 1 | Select-Object -Property *
Observa la propiedad Properties — es un array con campos del evento (índices). Ej.: Properties[21] suele corresponder a ParentCommandLine en Sysmon vX (verifica en tu esquema).
🔎 Filtrar por contenido en línea de comandos (ej. PowerShell -enc)
Veamos ahora un ejemplo de un comando que recupera Process Create eventos de la Microsoft-Windows-Sysmon/Operational log, verifica la línea de comando principal de cada evento para la cadena -enc, y luego muestra todas las propiedades de cualquier evento coincidente como una lista.
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational'; ID=1} |
Where-Object { $_.Properties[21].Value -like "*-enc*" } |
Format-List
El índice (21) puede variar según versión y configuración de Sysmon — comprueba el esquema de tu evento con Select-Object -Property *.
📤 Exportar resultados (JSON / CSV)
Get-WinEvent -LogName "Security" -MaxEvents 1000 |
Select-Object TimeCreated, Id, Message |
ConvertTo-Json | Out-File C:\temp\eventos.json