Análisis del Historial de Conexión de Dispositivos USB
Cuándo Usarlo
- Al investigar una posible filtración de datos a través de dispositivos de almacenamiento extraíbles
- Durante investigaciones de amenazas internas para rastrear el uso de dispositivos USB
- Para auditorías de cumplimiento que verifican la aplicación de políticas sobre medios extraíbles
- Al correlacionar conexiones USB con eventos de acceso y copia de archivos
- Para establecer una línea de tiempo de las conexiones de dispositivos durante un incidente
Prerrequisitos
- Imagen forense o archivos de registro extraídos y registros de eventos
- Acceso a las colmenas de registro SYSTEM, SOFTWARE y NTUSER.DAT
- Registros de SetupAPI (setupapi.dev.log)
- Registros de eventos de Windows (Sistema, Seguridad, DriverFrameworks-UserMode)
- USBDeview, USB Forensic Tracker o RegRipper
- Comprensión de la identificación de dispositivos USB (VID, PID, número de serie)
Flujo de Trabajo
Paso 1: Extraer Artefactos Relacionados con USB
# Montar la imagen forense y copiar los artefactos relevantes
mount -o ro,loop,offset=$((2048*512)) /cases/case-2024-001/images/evidence.dd /mnt/evidence
mkdir -p /cases/case-2024-001/usb/
# Colmenas de registro
cp /mnt/evidence/Windows/System32/config/SYSTEM /cases/case-2024-001/usb/
cp /mnt/evidence/Windows/System32/config/SOFTWARE /cases/case-2024-001/usb/
cp /mnt/evidence/Users/*/NTUSER.DAT /cases/case-2024-001/usb/
# Registros de SetupAPI (marcas de tiempo de primera conexión)
cp /mnt/evidence/Windows/INF/setupapi.dev.log /cases/case-2024-001/usb/
# Registros de eventos
cp /mnt/evidence/Windows/System32/winevt/Logs/System.evtx /cases/case-2024-001/usb/
cp "/mnt/evidence/Windows/System32/winevt/Logs/Microsoft-Windows-DriverFrameworks-UserMode%4Operational.evtx" \
/cases/case-2024-001/usb/ 2>/dev/null
cp "/mnt/evidence/Windows/System32/winevt/Logs/Microsoft-Windows-Partition%4Diagnostic.evtx" \
/cases/case-2024-001/usb/ 2>/dev/null
Paso 2: Analizar la Clave de Registro USBSTOR
# Extraer entradas de USBSTOR de la colmena SYSTEM
python3 << 'PYEOF'
from Registry import Registry
import json
reg = Registry.Registry("/cases/case-2024-001/usb/SYSTEM")
# Encontrar el ControlSet actual
select = reg.open("Select")
current = select.value("Current").value()
controlset = f"ControlSet{current:03d}"
# Analizar USBSTOR
usbstor_path = f"{controlset}\\Enum\\USBSTOR"
usbstor = reg.open(usbstor_path)
devices = []
print("=== DISPOSITIVOS USBSTOR ===\n")
for device_class in usbstor.subkeys():
# Formato: Disk&Ven_VENDOR&Prod_PRODUCT&Rev_REVISION
class_name = device_class.name()
parts = class_name.split('&')
vendor = parts[1].replace('Ven_', '') if len(parts) > 1 else 'Desconocido'
product = parts[2].replace('Prod_', '') if len(parts) > 2 else 'Desconocido'
revision = parts[3].replace('Rev_', '') if len(parts) > 3 else 'Desconocido'
for instance in device_class.subkeys():
serial = instance.name()
last_write = instance.timestamp()
device_info = {
'vendor': vendor,
'product': product,
'revision': revision,
'serial': serial,
'last_connected': str(last_write),
}
# Obtener el nombre descriptivo si está disponible
try:
friendly = instance.value("FriendlyName").value()
device_info['friendly_name'] = friendly
except:
pass
# Obtener parámetros del dispositivo
try:
params = instance.subkey("Device Parameters")
try:
device_info['class_guid'] = params.value("ClassGUID").value()
except:
pass
except:
pass
devices.append(device_info)
print(f"Dispositivo: {vendor} {product}")
print(f" Serial: {serial}")
print(f" Última conexión: {last_write}")
print(f" Nombre descriptivo: {device_info.get('friendly_name', 'N/A')}")
print()
# Guardar resultados
with open('/cases/case-2024-001/analysis/usb_devices.json', 'w') as f:
json.dump(devices, f, indent=2)
print(f"\nTotal de dispositivos de almacenamiento USB encontrados: {len(devices)}")
PYEOF
Paso 3: Extraer Asignaciones de Letras de Unidad y Asociaciones de Usuarios
# Analizar MountedDevices de la colmena SYSTEM
python3 << 'PYEOF'
from Registry import Registry
import struct
reg = Registry.Registry("/cases/case-2024-001/usb/SYSTEM")
mounted = reg.open("MountedDevices")
print("=== DISPOSITIVOS MONTADOS (Asignaciones de Letras de Unidad) ===\n")
for value in mounted.values():
name = value.name()
data = value.value()
if name.startswith("\\DosDevices\\"):
drive_letter = name.replace("\\DosDevices\\", "")
if len(data) > 24:
# Dispositivo USB - contiene la ruta del dispositivo en cadena
try:
device_path = data.decode('utf-16-le').strip('\x00')
if 'USBSTOR' in device_path or 'USB#' in device_path:
print(f" {drive_letter} -> {device_path}")
except:
pass
else:
# Disco fijo - contiene la firma del disco + desplazamiento
disk_sig = struct.unpack('<I', data[0:4])[0]
offset = struct.unpack('<Q', data[4:12])[0]
print(f" {drive_letter} -> Firma del disco: 0x{disk_sig:08X}, Desplazamiento: {offset}")
PYEOF
# Analizar MountPoints2 de usuario (qué usuario accedió a qué dispositivos)
python3 << 'PYEOF'
from Registry import Registry
import os, glob
print("\n=== PUNTOS DE MONTAJE DE USUARIO (MountPoints2) ===\n")
for ntuser in glob.glob("/cases/case-2024-001/usb/NTUSER*.DAT"):
try:
reg = Registry.Registry(ntuser)
mp2 = reg.open("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MountPoints2")
print(f"Colmena de usuario: {os.path.basename(ntuser)}")
for key in mp2.subkeys():
guid = key.name()
last_write = key.timestamp()
if '{' in guid:
print(f" Volumen: {guid} | Último acceso: {last_write}")
print()
except Exception as e:
print(f" Error al analizar {ntuser}: {e}")
PYEOF
Paso 4: Extraer Marcas de Tiempo de Primera Conexión desde SetupAPI
# Analizar setupapi.dev.log en busca de marcas de tiempo de primera instalación de dispositivos USB
python3 << 'PYEOF'
import re
print("=== INSTALACIONES DE DISPOSITIVOS USB SEGÚN SETUPAPI ===\n")
with open('/cases/case-2024-001/usb/setupapi.dev.log', 'r', errors='ignore') as f:
content = f.read()
# Encontrar secciones de instalación de dispositivos USB
pattern = r'>>>\s+\[Device Install.*?\n.*?Section start (\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}).*?\n(.*?)<<<'
matches = re.findall(pattern, content, re.DOTALL)
usb_installs = []
for timestamp, section in matches:
if 'USBSTOR' in section or 'USB\\VID' in section:
# Extraer ID del dispositivo
dev_match = re.search(r'(USBSTOR\\[^\s]+|USB\\VID_\w+&PID_\w+[^\s]*)', section)
if dev_match:
device_id = dev_match.group(1)
usb_installs.append({
'first_install': timestamp,
'device_id': device_id
})
print(f" {timestamp} | {device_id}")
print(f"\nTotal de instalaciones USB encontradas: {len(usb_installs)}")
PYEOF
# Analizar registros de eventos de Windows para eventos USB
# IDs de evento: 2003, 2010, 2100, 2102 (DriverFrameworks-UserMode)
# IDs de evento: 6416 (Seguridad - nuevo dispositivo externo reconocido)
python3 << 'PYEOF'
import json
from evtx import PyEvtxParser
try:
parser = PyEvtxParser("/cases/case-2024-001/usb/System.evtx")
print("\n=== EVENTOS USB DEL REGISTRO DE EVENTOS DEL SISTEMA ===\n")
for record in parser.records_json():
data = json.loads(record['data'])
event_id = str(data['Event']['System']['EventID'])
# Eventos de conexión de dispositivos USB
if event_id in ('20001', '20003', '10000', '10100'):
timestamp = data['Event']['System']['TimeCreated']['#attributes']['SystemTime']
event_data = data['Event'].get('UserData', data['Event'].get('EventData', {}))
print(f" [{timestamp}] EventID {event_id}: {json.dumps(event_data, default=str)[:200]}")
except Exception as e:
print(f"Error: {e}")
PYEOF
Paso 5: Construir Línea de Tiempo e Informe de Actividad USB
# Compilar toda la evidencia USB en una línea de tiempo unificada
python3 << 'PYEOF'
import json, csv
timeline = []
# Cargar datos de USBSTOR
with open('/cases/case-2024-001/analysis/usb_devices.json') as f:
devices = json.load(f)
for device in devices:
timeline.append({
'timestamp': device['last_connected'],
'source': 'Registro USBSTOR',
'device': f"{device['vendor']} {device['product']}",
'serial': device['serial'],
'event': 'Última conexión',
'detail': device.get('friendly_name', '')
})
# Ordenar cronológicamente
timeline.sort(key=lambda x: x['timestamp'])
# Escribir CSV de línea de tiempo
with open('/cases/case-2024-001/analysis/usb_timeline.csv', 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=['timestamp', 'source', 'device', 'serial', 'event', 'detail'])
writer.writeheader()
writer.writerows(timeline)
print(f"Línea de tiempo USB: {len(timeline)} eventos escritos en usb_timeline.csv")
# Imprimir resumen
print("\n=== RESUMEN DE DISPOSITIVOS USB ===")
for entry in timeline:
print(f" {entry['timestamp']} | {entry['device']} | {entry['serial'][:20]} | {entry['event']}")
PYEOF
Conceptos Clave
| Concepto | Descripción |
|---|---|
| USBSTOR | Clave de registro que almacena datos de identificación y conexión de dispositivos de almacenamiento masivo USB |
| VID/PID | ID de vendedor e ID de producto que identifican de forma única el fabricante y modelo del dispositivo USB |
| Número de serie del dispositivo | Identificador único para dispositivos USB individuales (algunos dispositivos comparten seriales) |
| MountedDevices | Clave de registro que asigna GUIDs de volumen y letras de unidad a dispositivos físicos |
| MountPoints2 | Clave de registro por usuario que muestra a qué volúmenes ha accedido un usuario |
| Registro SetupAPI | Registro de instalación de controladores de Windows que registra las conexiones de dispositivos por primera vez |
| DeviceContainers | Clave de registro en la colmena SOFTWARE con metadatos del dispositivo y marcas de tiempo |
| EMDMgmt | Clave de registro que rastrea dispositivos compatibles con ReadyBoost con números de serie y marcas de tiempo |
Herramientas y Sistemas
| Herramienta | Propósito |
|---|---|
| USB Forensic Tracker | Herramienta especializada para la extracción del historial de dispositivos USB |
| USBDeview | Herramienta de NirSoft que enumera todos los dispositivos USB conectados a un sistema |
| RegRipper (plugin usbstor) | Extracción automatizada de artefactos USB a partir de colmenas de registro |
| Registry Explorer | Análisis interactivo de registro para claves relacionadas con USB |
| KAPE | Recopilación automatizada de artefactos relacionados con USB |
| Plaso/log2timeline | Creación de líneas de tiempo que incluyen eventos de conexión USB |
| FTK Imager | Creación de imágenes forenses incluidos medios extraíbles |
| Velociraptor | Agente de punto final con artefactos de búsqueda del historial de dispositivos USB |
Escenarios Comunes
Escenario 1: Filtración de Datos por un Empleado que se Va Extraer entradas de USBSTOR para identificar todos los dispositivos USB conectados alguna vez, correlacionar números de serie con MountPoints2 para confirmar el acceso del usuario, cotejar marcas de tiempo con registros de acceso a archivos y archivos recientes de Jump List, buscar patrones de copia de archivos grandes en el diario USN.
Escenario 2: Dispositivo no Autorizado en un Sistema Seguro Auditar todas las entradas de USBSTOR contra una lista de dispositivos aprobados, identificar dispositivos no autorizados por VID/PID que no coinciden con el hardware corporativo aprobado, determinar cuándo se conectó el dispositivo no autorizado por primera y última vez, verificar si se transfirió algún dato.
Escenario 3: Distribución de Malware a Través de USB Identificar el dispositivo USB conectado justo antes de la ejecución del malware (marcas de tiempo de Prefetch), extraer el serial del dispositivo e información del vendedor, verificar si el autoarranque estaba habilitado para el dispositivo, buscar lanzamiento de ejecutables desde la letra de unidad extraíble en Prefetch y ShimCache.
Escenario 4: Seguimiento de una Unidad USB Específica a Través de Múltiples Sistemas Buscar el mismo número de serie en USBSTOR en todas las imágenes forenses, construir un mapa de en qué sistemas se conectó la unidad y cuándo, identificar la ruta cronológica del dispositivo a través de la organización, correlacionar con registros de acceso a recursos compartidos de red.
Formato de Salida
Análisis del Historial de Dispositivos USB:
Sistema: DESKTOP-ABC123 (Windows 10 Pro)
Total de Dispositivos de Almacenamiento USB: 12
Fuentes de Análisis: USBSTOR, MountedDevices, MountPoints2, SetupAPI, Registros de Eventos
Inventario de Dispositivos:
1. Kingston DataTraveler 3.0 (Serial: 0019E06B4521A2B0)
Primera Conexión: 2024-01-10 09:15:32 (SetupAPI)
Última Conexión: 2024-01-18 14:30:00 (USBSTOR)
Letra de Unidad: E:
Acceso de Usuario: suspect_user (MountPoints2)
2. WD My Passport (Serial: 575834314131363035)
Primera Conexión: 2024-01-15 20:00:00
Última Conexión: 2024-01-15 23:45:00
Letra de Unidad: F:
Acceso de Usuario: suspect_user
Hallazgos Sospechosos:
- Unidad Kingston conectada 15 veces durante el período de investigación
- WD Passport conectada solo una vez, al final de la tarde (horario inusual)
- Dispositivo desconocido (VID_1234&PID_5678) conectado el 2024-01-17, ningún dispositivo aprobado coincide
Línea de Tiempo: /cases/case-2024-001/analysis/usb_timeline.csv