inicio / r3v3la / capítulo 02
CAP. 02 forense · sistemas

USB conectados

// en 3 líneas

Cada vez que un pendrive se conecta, Windows apunta su fabricante, modelo y número de serie. El rastro queda en el registro, en el log de instalación y en los eventos del propio equipo. Formatearlo no lo borra: la información se guarda en el ordenador, no en el pendrive.

El caso

Un informe interno aparece colgado fuera. Nadie subió nada a la nube, nadie envió correos sospechosos. La hipótesis más razonable es un pendrive: alguien se lo llevó. La pregunta es cuál, cuándo entró en el equipo y qué sesión lo usó. En los cajones hay cuatro pendrives sueltos, ninguno con pegatina. Uno de ellos tiene que ser el que entró en el equipo. Para saberlo no hace falta mirar el pendrive: hay que mirar el equipo.

La herramienta

Windows reparte el historial de los USB en cuatro sitios complementarios:

DóndeQué guarda
HKLM\SYSTEM\CurrentControlSet\Enum\USBSTORFabricante, modelo y número de serie de cada pendrive que ha visto el equipo.
C:\Windows\INF\setupapi.dev.logLa primera vez que Windows instaló los drivers del dispositivo, con fecha y hora.
Canal Microsoft-Windows-Partition/Diagnostic (evento 1006)Cada conexión del disco, con su número de serie y tamaño.
MountedDevices y MountPoints2 del registroQué letra tuvo el pendrive y qué usuario lo tuvo montado.

Cómo se usa

Todo se consulta desde PowerShell como administrador. No hace falta software extra: Windows ya trae lo necesario para listar los pendrives conocidos, leer el log de instalación y filtrar los eventos de conexión. Para los casos reales, en la sección final están los pasos que se usan sobre una copia del equipo.

Qué revela

Cruzando las fuentes, se puede reconstruir la vida de un pendrive en ese equipo:

PreguntaDónde está la respuesta
¿Qué dispositivo era?Fabricante y modelo en USBSTOR y en el evento 1006.
¿Es este pendrive?El número de serie, en USBSTOR y en el evento 1006.
¿Cuándo se conectó por primera vez?setupapi.dev.log y la fecha de primera instalación.
¿Cuándo por última vez?Fechas de última conexión y desconexión, y el último evento 1006.
¿Qué letra tuvo?MountedDevices.
¿Qué usuario lo usó?MountPoints2 en el NTUSER.DAT de cada usuario.

El detalle que da nombre al capítulo

El número de serie se queda en el ordenador, no en el pendrive. Formatear el dispositivo, borrar sus archivos o cambiarle el nombre no cambia nada de lo que el equipo ya apuntó. Si el pendrive aparece en un cajón, su serie se compara con la del registro y la pregunta queda respondida.

Con PowerShell

Las consultas al registro, al log y a los eventos están abajo plegadas: ábrelas cuando las necesites.

Ver comandos de PowerShell

Qué pendrives conoce este equipo

En PowerShell como administrador. Get-PnpDevice lista también los dispositivos que ya no están conectados, y sus propiedades dan las tres fechas clave sin tener que leer el registro a mano:

function Get-UsbHistorial {
    Get-PnpDevice -Class DiskDrive -ErrorAction SilentlyContinue |
      Where-Object InstanceId -like 'USBSTOR*' | ForEach-Object {
        $id    = $_.InstanceId
        $props = Get-PnpDeviceProperty -InstanceId $id -ErrorAction SilentlyContinue
        $p     = { param($k) ($props | Where-Object KeyName -eq $k).Data }
        [pscustomobject]@{
            Dispositivo       = $_.FriendlyName
            Serie             = ($id -split '\\')[-1]
            PrimeraConexion   = & $p 'DEVPKEY_Device_FirstInstallDate'
            UltimaConexion    = & $p 'DEVPKEY_Device_LastArrivalDate'
            UltimaDesconexion = & $p 'DEVPKEY_Device_LastRemovalDate'
            ConectadoAhora    = $_.Present
        }
      }
}
Get-UsbHistorial | Sort-Object UltimaConexion -Descending | Format-Table -AutoSize

La primera vez, según el log de instalación

Select-String -Path C:\Windows\INF\setupapi.dev.log -Pattern 'Device Install.*USBSTOR' -Context 0,1 |
  ForEach-Object { $_.Line; $_.Context.PostContext; '' }

Cada conexión, según los eventos

El evento 1006 aparece en Windows 10 y 11 cada vez que se conecta un disco. Carga la función que convierte los datos del evento en campos con nombre (la misma del capítulo 01):

function Get-EventData {
    param([Parameter(ValueFromPipeline)]$Evento)
    process {
        $xml   = [xml]$Evento.ToXml()
        $datos = [ordered]@{ Hora = $Evento.TimeCreated; Id = $Evento.Id }
        foreach ($d in $xml.Event.EventData.Data) { $datos[$d.Name] = $d.'#text' }
        [pscustomobject]$datos
    }
}

Get-WinEvent -LogName 'Microsoft-Windows-Partition/Diagnostic' -FilterXPath '*[System[EventID=1006]]' -ErrorAction SilentlyContinue |
  Get-EventData |
  Select-Object Hora, Manufacturer, Model, SerialNumber, Capacity |
  Format-Table -AutoSize

Qué usuario lo usó

Cada volumen tiene un identificador (GUID). MountedDevices lo relaciona con el dispositivo, y MountPoints2 de cada usuario dice quién lo tuvo montado:

# GUID de volumen de los dispositivos USB que ha visto el equipo
(Get-Item 'HKLM:\SYSTEM\MountedDevices').Property | Where-Object { $_ -like '\??\Volume*' } | ForEach-Object {
    $bytes = (Get-ItemProperty 'HKLM:\SYSTEM\MountedDevices').$_
    $texto = [Text.Encoding]::Unicode.GetString($bytes)
    if ($texto -match 'USBSTOR') { [pscustomobject]@{ Volumen = $_; Dispositivo = $texto } }
} | Format-List

# Volúmenes montados por el usuario actual
Get-ChildItem 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2' |
  Where-Object PSChildName -like '{*}' | Select-Object PSChildName

En una investigación: sobre una copia

En un caso real no se trabaja en el equipo vivo. Se extraen de la imagen de disco las colmenas SYSTEM, SOFTWARE y el NTUSER.DAT de cada usuario, junto a setupapi.dev.log y los .evtx, y se analizan con Registry Explorer o RECmd:

# RECmd con el lote de reglas de Kroll, que incluye los artefactos USB
RECmd.exe -d C:\evidencia\registro --bn BatchExamples\Kroll_Batch.reb --csv C:\salida

Practica

Hazlo en una máquina virtual con paso de USB (Proxmox, Hyper-V o VirtualBox lo permiten) y con pendrives que no contengan nada tuyo.

Ver los 4 ejercicios
Ejercicio 1 · La línea de tiempo

Conecta un pendrive, úsalo tres o cuatro veces en días distintos y lanza Get-UsbHistorial. Compáralo con setupapi.dev.log y con los eventos 1006.

¿Coinciden las horas con tus notas? ¿Cuál de las fuentes te da la primera conexión y cuál la última?

Ejercicio 2 · Formatear no sirve

Formatea el pendrive (incluso cambiando el sistema de archivos) y conéctalo otra vez. Vuelve a lanzar la consulta.

¿Ha cambiado el número de serie? ¿Y el nombre que aparece en Windows Portable Devices?

Ejercicio 3 · ¿Quién fue?

Crea una segunda cuenta de usuario, inicia sesión con ella, conecta el pendrive y abre una carpeta. Vuelve a tu cuenta y mira el MountedDevices del sistema y los MountPoints2 de los dos usuarios.

¿En el MountPoints2 de qué usuario aparece el volumen? ¿Qué pasa si lo buscas desde tu sesión?

Ejercicio 4 · Análisis en frío

Exporta a un archivo .reg la clave HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR y ábrela con Registry Explorer, o apunta RECmd a una copia de las colmenas.

¿Encuentras en Properties de USBSTOR las mismas fechas que te dio PowerShell?