El Visor de eventos de Windows (Event Viewer) es la primera herramienta a abrir cuando investigas un incidente de seguridad en Windows. Contiene un registro detallado de cada inicio de sesión, cambio de privilegios, modificación de políticas y acceso a recursos. Saber dónde mirar y qué significa cada evento marca la diferencia en una investigación.
Los registros más importantes para seguridad
| Registro | Descripción |
| Security | Inicios de sesión, cambios de cuenta, acceso a objetos, uso de privilegios |
| System | Eventos del SO: servicios iniciados/detenidos, errores de drivers |
| Application | Eventos de aplicaciones instaladas |
| Microsoft-Windows-PowerShell/Operational | Comandos PowerShell ejecutados |
| Microsoft-Windows-Sysmon/Operational | Telemetría avanzada (requiere instalar Sysmon) |
Event IDs críticos de seguridad
Inicio de sesión (canal Security)
| ID | Evento | Prioridad |
| 4624 | Inicio de sesión correcto | Media |
| 4625 | Inicio de sesión fallido | Alta |
| 4648 | Inicio de sesión con credenciales explícitas | Alta |
| 4672 | Privilegios especiales asignados (sesión admin) | Alta |
| 4720 | Cuenta de usuario creada | Crítica |
| 4722 | Cuenta de usuario habilitada | Alta |
| 4724 | Intento de restablecer contraseña | Alta |
| 4728 | Miembro añadido a grupo global de seguridad | Crítica |
| 4732 | Miembro añadido a grupo local de seguridad | Crítica |
| 4756 | Miembro añadido a grupo universal de seguridad | Crítica |
| 4776 | Validación de credenciales (NTLM) | Media |
| 7045 | Nuevo servicio instalado | Crítica |
Consultar eventos con PowerShell
function Get-SecurityEvents {
param(
[int[]]$EventIds,
[datetime]$From = (Get-Date).AddDays(-1),
[int]$MaxEvents = 100
)
Get-WinEvent -FilterHashtable @{
LogName = "Security"
Id = $EventIds
StartTime = $From
} -MaxEvents $MaxEvents -ErrorAction SilentlyContinue
}
function Get-EventField {
param($Event, [string]$FieldName)
$xml = [xml]$Event.ToXml()
($xml.Event.EventData.Data | Where-Object Name -eq $FieldName).'#text'
}
Detectar creaciones de cuentas (ID 4720)
Get-SecurityEvents -EventIds 4720 -From (Get-Date).AddDays(-7) | ForEach-Object {
[PSCustomObject]@{
Fecha = $_.TimeCreated
NuevaCuenta = Get-EventField $_ "TargetUserName"
CreadaPor = Get-EventField $_ "SubjectUserName"
Dominio = Get-EventField $_ "TargetDomainName"
}
} | Format-Table -AutoSize
Detectar adiciones a grupos privilegiados
Get-SecurityEvents -EventIds 4728,4732,4756 -From (Get-Date).AddDays(-30) | ForEach-Object {
[PSCustomObject]@{
Fecha = $_.TimeCreated
Usuario = Get-EventField $_ "MemberName"
Grupo = Get-EventField $_ "TargetUserName"
Por = Get-EventField $_ "SubjectUserName"
EventoID = $_.Id
}
} | Sort-Object Fecha -Descending | Format-Table -AutoSize
Detectar nuevos servicios instalados (ID 7045)
Get-WinEvent -FilterHashtable @{
LogName = "System"
Id = 7045
StartTime = (Get-Date).AddDays(-7)
} -ErrorAction SilentlyContinue | ForEach-Object {
$xml = [xml]$_.ToXml()
$datos = $xml.Event.EventData.Data
[PSCustomObject]@{
Fecha = $_.TimeCreated
Servicio = ($datos | Where-Object Name -eq "ServiceName").'#text'
RutaBinario = ($datos | Where-Object Name -eq "ImagePath").'#text'
TipoInicio = ($datos | Where-Object Name -eq "StartType").'#text'
}
} | Format-Table -AutoSize
Investigar actividad de PowerShell (forensics)
Get-WinEvent -FilterHashtable @{
LogName = "Microsoft-Windows-PowerShell/Operational"
Id = 4104 # ScriptBlock logging
} -MaxEvents 50 | ForEach-Object {
$xml = [xml]$_.ToXml()
[PSCustomObject]@{
Fecha = $_.TimeCreated
Usuario = $_.UserId
Comando = $xml.Event.EventData.Data.'#text' | Select-Object -First 1
}
} | Format-List
Instalar Sysmon para telemetría avanzada
Sysmon registra eventos que el Event Viewer nativo no captura: creación de procesos con hash, conexiones de red por proceso, carga de DLLs…
winget install Microsoft.Sysinternals.Sysmon
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/SwiftOnSecurity/sysmon-config/master/sysmonconfig-export.xml" -OutFile sysmon-config.xml
sysmon64.exe -accepteula -i sysmon-config.xml
Crear vistas personalizadas en Event Viewer
En la GUI: clic derecho en «Custom Views» → «Create Custom View»:
*[System[(EventID=4720 or EventID=4728 or EventID=4732 or EventID=7045)
and TimeCreated[timediff(@SystemTime) <= 604800000]]]
El Event Viewer con PowerShell es una herramienta forense poderosa. La clave es saber qué IDs buscar y automatizar la extracción de datos para no tener que revisar manualmente miles de eventos. Para entornos serios, complementa el Event Viewer con una solución SIEM que centralice y correlacione los logs de todos los sistemas.