🧰 Get-WinEvent — Análisis masivo de logs Windows / Sysmon

🔎 Evento Get-WinEvent — Análisis masivo de registros (Windows / Sysmon) 🛡️

Info

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


🛠️ Listar logs y proveedores

🔎 Listar todos los logs disponibles

Get-WinEvent -ListLog * |
  Select-Object LogName, RecordCount, IsClassicLog, IsEnabled, LogMode, LogType |
  Format-Table -AutoSize
Tip

Ú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
Tip

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
Tip

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
Info

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
Tip

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"}
Tip

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 }
Info

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
Tip

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 *
Info

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
Warning

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