El problema

Recoges evidencia forense de un Domain Controller. El log de seguridad ha estado rotando cada pocas horas en este servidor ocupado — o peor, el atacante lo borró. Necesitas saber quién accedió a este servidor, desde qué IP y cuándo. Los event logs no te lo pueden decir.

User Access Logging (UAL) si puede.

¿Qué es UAL?

User Access Logging es una funcionalidad de Windows Server (2012, 2012 R2, 2016, 2019, 2022) que registra silenciosamente cada acceso de cliente por rol y servicio. Almacena:

  • Usuario (dominio\usuario)
  • Dirección IP origen
  • Timestamps de primer y último acceso
  • Número de accesos
  • Rol del servidor al que se accedió (File Server/SMB, Remote Access/RDP, DHCP, AD DS, Web Server, etc.)

La ventaja crítica: UAL retiene datos hasta 3 años y se almacena en bases de datos ESE separadas de los event logs. Los atacantes que borran event logs raramente conocen UAL.

Dónde se encuentra

C:\Windows\System32\LogFiles\Sum\
├── Current.mdb              # Año activo (se actualiza cada 24h)
├── {GUID}.mdb               # Snapshot del año actual
├── {GUID}.mdb               # Año anterior
├── {GUID}.mdb               # Hace dos años
└── SystemIdentity.mdb       # Metadatos del servidor + mapeo de roles

El formato es ESE (Extensible Storage Engine) — el mismo motor de base de datos que usa Active Directory y Exchange.


Cómo parsea masstin UAL

Masstin usa libesedb (la biblioteca forense ESE de Joachim Metz, mismo autor que libvshadow) para leer bases de datos UAL directamente — incluyendo bases de datos dirty que estaban en uso cuando se capturó la imagen. Sin reparación, sin esentutl.

Qué extrae masstin

De la tabla CLIENTS en cada fichero .mdb:

Campo UAL Columna masstin Descripción
LastAccess time_created Timestamp del acceso más reciente
InsertDate time_created Timestamp del primer acceso (segunda entrada)
AuthenticatedUserName target_user_name + target_domain_name Separado por \
Address src_ip IPv4, IPv6 o localhost (binario → legible)
Role (via RoleGuid) event_id Mapeado a protocolo: SMB, RDP, HTTP, LDAP, etc.
Hostname servidor dst_computer De SystemIdentity.mdb → tabla SYSTEM_IDENTITY
TotalAccesses detail Incluido como número de accesos

Cada registro UAL produce dos entradas en la timeline: una para el primer acceso (InsertDate) y otra para el más reciente (LastAccess). Esto da dos puntos de anclaje en la línea temporal.

Mapeo de rol a protocolo

Rol UAL event_id masstin Significado
File Server SMB Acceso a shares SMB, named pipes (PsExec, sc.exe)
Remote Access RDP Conexiones Remote Desktop
Web Server HTTP Acceso al servidor web IIS
FTP Server HTTP Conexiones FTP
Active Directory Domain Services LDAP Autenticacion y consultas AD
Active Directory Certificate Services CERT Solicitud de certificados
DHCP Server DHCP Solicitudes de lease DHCP
DNS Server DNS Consultas DNS
Print and Document Services PRINT Acceso al servidor de impresión
Otros roles UAL Acceso UAL genérico

Uso

Detección automática

Cuando masstin escanea un árbol de directorios (con -d), busca automáticamente bases de datos UAL en Windows\System32\LogFiles\Sum\ y en cualquier subdirectorio que contenga ficheros .mdb:

# Apunta a la raiz de la evidencia — masstin encuentra EVTX + UAL automaticamente
masstin -a parse-windows -d /evidence/C_drive/ -o timeline.csv

# Apunta directamente a la carpeta Sum
masstin -a parse-windows -d /evidence/Windows/System32/LogFiles/Sum/ -o timeline.csv

Ficheros directos

También puedes pasar ficheros .mdb individuales con -f:

masstin -a parse-windows -f Current.mdb -f SystemIdentity.mdb -o timeline.csv

Consejo: Incluye siempre SystemIdentity.mdb cuando uses -f — contiene los mapeos de nombres de rol y el hostname del servidor.

Desde imagenes forenses

Con parse-image-windows, las bases de datos UAL se extraen del filesystem NTFS automáticamente junto con los ficheros EVTX:

masstin -a parse-image-windows -f DC01.e01 -o timeline.csv

Esto extrae EVTX + UAL del volumen live y de todos los snapshots VSS.

Desde volúmenes montados

masstin -a parse-image-windows -d D: -o timeline.csv

Análisis forense con UAL

Cuando los event logs no están

UAL es tu respaldo cuando Security.evtx ha rotado o ha sido borrado. Si el atacante usó PsExec, montó shares de ficheros o accedió a servicios vía SMB, el rol File Server lo habrá registrado — con la IP origen, usuario y timestamps de los últimos años.

Análisis de frecuencia

UAL registra el número total de accesos para cada combinación usuario/IP/rol por año. Un usuario con TotalAccesses: 2 en un Domain Controller donde los administradores típicamente muestran miles de accesos es sospechoso. Combinado con timestamps alrededor del marco temporal del incidente, es evidencia sólida de movimiento lateral.

Correlación con otros artefactos

Las entradas UAL en la timeline de masstin se sitúan junto a eventos EVTX, logs Linux y datos EDR. Cuando ves una entrada UAL SMB desde una IP que también aparece en Security.evtx 4624 Type 3, tienes corroboración. Cuando el EVTX no está pero el registro UAL permanece, sigues teniendo la evidencia del acceso.

Rastreando hacia atras hasta el paciente cero

Si conoces un usuario comprometido, busca la timeline UAL en todos los servidores. Las direcciones IP origen revelan qué máquinas usó el atacante como trampolines. Sigue las IPs hacia atrás en la timeline para encontrar el host inicial.


Detalles técnicos

Manejo de bases de datos ESE

Masstin usa libesedb (vía bindings FFI en Rust) para leer bases de datos ESE. Es la misma biblioteca C usada por herramientas forenses como esedbexport y mantenida por Joachim Metz (autor de libvshadow, libewf y muchas otras bibliotecas forenses).

Bases de datos dirty: Las bases de datos ESE capturadas de sistemas en ejecución típicamente están en estado “dirty shutdown”. A diferencia de herramientas que requieren esentutl.exe /p para repararlas primero, libesedb lee bases de datos dirty nativamente como biblioteca forense. Sin paso de reparación.

Deduplicación

Cuando múltiples ficheros .mdb contienen el mismo registro (ej. Current.mdb y el snapshot anual {GUID}.mdb), la deduplicación de Polars en masstin elimina los duplicados automáticamente — igual que hace con eventos EVTX del volumen live y snapshots VSS.

Formato de timestamps

UAL almacena timestamps como valores Windows FILETIME (64 bits, intervalos de 100 nanosegundos desde 1601-01-01). Masstin los convierte a formato YYYY-MM-DD HH:MM:SS UTC, consistente con todas las demás entradas de la timeline.


Comparación con otras herramientas UAL

Funcionalidad SumECmd KStrike masstin
Parsear tabla CLIENTS
Parsear SystemIdentity
Mapear RoleGuid a nombres
Manejar bases de datos dirty No (necesita esentutl) No (necesita esentutl) Sí (nativo)
Fusionar con timeline EVTX No No
Extraer de imágenes E01 No No
Extraer de snapshots VSS No No
Extraer de volúmenes montados No No
Visualización en grafo No No
Multiplataforma Solo Windows (.NET) Python Windows/Linux/macOS

Referencias