Analisando o Histórico de Conexão de Dispositivos USB
Quando Usar
- Ao investigar potencial exfiltração de dados via dispositivos de armazenamento removível
- Durante investigações de ameaças internas para rastrear o uso de dispositivos USB
- Para auditorias de conformidade que verificam a aplicação de políticas de mídia removível
- Ao correlacionar conexões USB com eventos de acesso e cópia de arquivos
- Para estabelecer uma linha do tempo de conexões de dispositivos durante um incidente
Pré-requisitos
- Imagem forense ou hives de registro e logs de eventos extraídos
- Acesso aos hives de registro SYSTEM, SOFTWARE e NTUSER.DAT
- Logs SetupAPI (setupapi.dev.log)
- Logs de Eventos do Windows (Sistema, Segurança, DriverFrameworks-UserMode)
- USBDeview, USB Forensic Tracker ou RegRipper
- Compreensão da identificação de dispositivos USB (VID, PID, número de série)
Fluxo de Trabalho
Passo 1: Extrair Artefatos Relacionados a USB
# Montar a imagem forense e copiar artefatos relevantes
mount -o ro,loop,offset=$((2048*512)) /cases/case-2024-001/images/evidence.dd /mnt/evidence
mkdir -p /cases/case-2024-001/usb/
# Hives 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/
# Logs SetupAPI (timestamps da primeira conexão)
cp /mnt/evidence/Windows/INF/setupapi.dev.log /cases/case-2024-001/usb/
# Logs 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
Passo 2: Analisar a Chave de Registro USBSTOR
# Extrair entradas USBSTOR do hive SYSTEM
python3 << 'PYEOF'
from Registry import Registry
import json
reg = Registry.Registry("/cases/case-2024-001/usb/SYSTEM")
# Encontrar o ControlSet atual
select = reg.open("Select")
current = select.value("Current").value()
controlset = f"ControlSet{current:03d}"
# Analisar 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 'Desconhecido'
product = parts[2].replace('Prod_', '') if len(parts) > 2 else 'Desconhecido'
revision = parts[3].replace('Rev_', '') if len(parts) > 3 else 'Desconhecido'
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),
}
# Obter nome amigável se disponível
try:
friendly = instance.value("FriendlyName").value()
device_info['friendly_name'] = friendly
except:
pass
# Obter parâmetros do 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 Conexão: {last_write}")
print(f" Nome Amigável: {device_info.get('friendly_name', 'N/A')}")
print()
# Salvar 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 armazenamento USB encontrados: {len(devices)}")
PYEOF
Passo 3: Extrair Atribuições de Letras de Unidade e Associações de Usuário
# Analisar MountedDevices do hive 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 (Atribuições de Letras de Unidade) ===\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 - contém string de caminho do dispositivo
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 fixo - contém assinatura do disco + offset
disk_sig = struct.unpack('<I', data[0:4])[0]
offset = struct.unpack('<Q', data[4:12])[0]
print(f" {drive_letter} -> Assinatura do Disco: 0x{disk_sig:08X}, Offset: {offset}")
PYEOF
# Analisar MountPoints2 do usuário (qual usuário acessou quais dispositivos)
python3 << 'PYEOF'
from Registry import Registry
import os, glob
print("\n=== PONTOS DE MONTAGEM DO USUÁRIO (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"Hive do usuário: {os.path.basename(ntuser)}")
for key in mp2.subkeys():
guid = key.name()
last_write = key.timestamp()
if '{' in guid:
print(f" Volume: {guid} | Último acesso: {last_write}")
print()
except Exception as e:
print(f" Erro ao analisar {ntuser}: {e}")
PYEOF
Passo 4: Extrair Timestamps da Primeira Conexão dos SetupAPI
# Analisar setupapi.dev.log para timestamps de primeira instalação de dispositivos USB
python3 << 'PYEOF'
import re
print("=== INSTALAÇÕES DE DISPOSITIVOS USB PELO SETUPAPI ===\n")
with open('/cases/case-2024-001/usb/setupapi.dev.log', 'r', errors='ignore') as f:
content = f.read()
# Encontrar seções de instalação 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:
# Extrair ID do 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 instalações USB encontradas: {len(usb_installs)}")
PYEOF
# Analisar Logs de Eventos do Windows para eventos USB
# IDs de Evento: 2003, 2010, 2100, 2102 (DriverFrameworks-UserMode)
# IDs de Evento: 6416 (Segurança - novo dispositivo externo reconhecido)
python3 << 'PYEOF'
import json
from evtx import PyEvtxParser
try:
parser = PyEvtxParser("/cases/case-2024-001/usb/System.evtx")
print("\n=== EVENTOS USB DO LOG DE SISTEMA ===\n")
for record in parser.records_json():
data = json.loads(record['data'])
event_id = str(data['Event']['System']['EventID'])
# Eventos de conexão de dispositivo 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"Erro: {e}")
PYEOF
Passo 5: Construir Linha do Tempo e Relatório de Atividade USB
# Compilar todas as evidências USB em uma linha do tempo unificada
python3 << 'PYEOF'
import json, csv
timeline = []
# Carregar dados do 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 Conexão',
'detail': device.get('friendly_name', '')
})
# Ordenar cronologicamente
timeline.sort(key=lambda x: x['timestamp'])
# Escrever CSV da linha do tempo
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"Linha do Tempo USB: {len(timeline)} eventos gravados em usb_timeline.csv")
# Imprimir resumo
print("\n=== RESUMO DE DISPOSITIVOS USB ===")
for entry in timeline:
print(f" {entry['timestamp']} | {entry['device']} | {entry['serial'][:20]} | {entry['event']}")
PYEOF
Conceitos Chave
| Conceito | Descrição |
|---|---|
| USBSTOR | Chave de registro que armazena dados de identificação e conexão de dispositivos de armazenamento em massa USB |
| VID/PID | ID do Fabricante e ID do Produto que identificam exclusivamente o fabricante e modelo do dispositivo USB |
| Número de série do dispositivo | Identificador único para dispositivos USB individuais (alguns dispositivos compartilham números de série) |
| MountedDevices | Chave de registro que mapeia GUIDs de volume e letras de unidade para dispositivos físicos |
| MountPoints2 | Chave de registro por usuário mostrando quais volumes um usuário acessou |
| Log SetupAPI | Log de instalação de drivers do Windows que registra conexões de dispositivos pela primeira vez |
| DeviceContainers | Chave de registro no hive SOFTWARE com metadados e timestamps do dispositivo |
| EMDMgmt | Chave de registro que rastreia dispositivos compatíveis com ReadyBoost com números de série e timestamps |
Ferramentas e Sistemas
| Ferramenta | Propósito |
|---|---|
| USB Forensic Tracker | Ferramenta especializada para extração de histórico de dispositivos USB |
| USBDeview | Ferramenta NirSoft que lista todos os dispositivos USB conectados a um sistema |
| RegRipper (plugin usbstor) | Extração automatizada de artefatos USB a partir de hives de registro |
| Registry Explorer | Análise interativa de registro para chaves relacionadas a USB |
| KAPE | Coleta automatizada de artefatos relacionados a USB |
| Plaso/log2timeline | Criação de linha do tempo incluindo eventos de conexão USB |
| FTK Imager | Imageamento forense incluindo mídia removível |
| Velociraptor | Agente de endpoint com artefatos de caça a histórico de dispositivos USB |
Cenários Comuns
Cenário 1: Exfiltração de Dados por Funcionário em Saída Extraia entradas USBSTOR para identificar todos os dispositivos USB já conectados, correlacione números de série com MountPoints2 para confirmar acesso do usuário, faça referência cruzada de timestamps com logs de acesso a arquivos e arquivos recentes do Jump List, verifique padrões de cópia de arquivos grandes no USN journal.
Cenário 2: Dispositivo Não Autorizado em Sistema Protegido Audite todas as entradas USBSTOR contra uma lista de dispositivos aprovados, identifique dispositivos não autorizados por VID/PID que não correspondem ao hardware aprovado pela empresa, determine quando o dispositivo não autorizado foi conectado pela primeira e última vez, verifique se algum dado foi transferido.
Cenário 3: Distribuição de Malware via USB Identifique o dispositivo USB conectado imediatamente antes da execução do malware (timestamps do Prefetch), extraia o número de série e informações do fabricante, verifique se o autorun estava habilitado para o dispositivo, procure por lançamento de executável a partir da letra da unidade removível no Prefetch e ShimCache.
Cenário 4: Rastreamento de uma Unidade USB Específica em Múltiplos Sistemas Pesquise pelo mesmo número de série do dispositivo no USBSTOR em todas as imagens forenses, construa um mapa de quais sistemas a unidade foi conectada e quando, identifique o caminho cronológico do dispositivo através da organização, correlacione com logs de acesso a compartilhamentos de rede.
Formato de Saída
Análise de Histórico de Dispositivos USB:
Sistema: DESKTOP-ABC123 (Windows 10 Pro)
Total de Dispositivos de Armazenamento USB: 12
Fontes de Análise: USBSTOR, MountedDevices, MountPoints2, SetupAPI, Logs de Eventos
Inventário de Dispositivos:
1. Kingston DataTraveler 3.0 (Serial: 0019E06B4521A2B0)
Primeira Conexão: 2024-01-10 09:15:32 (SetupAPI)
Última Conexão: 2024-01-18 14:30:00 (USBSTOR)
Letra de Unidade: E:
Acesso do Usuário: usuario_suspeito (MountPoints2)
2. WD My Passport (Serial: 575834314131363035)
Primeira Conexão: 2024-01-15 20:00:00
Última Conexão: 2024-01-15 23:45:00
Letra de Unidade: F:
Acesso do Usuário: usuario_suspeito
Achados Suspeitos:
- Unidade Kingston conectada 15 vezes durante o período de investigação
- WD Passport conectado apenas uma vez, no final da noite (horário incomum)
- Dispositivo desconhecido (VID_1234&PID_5678) conectado em 2024-01-17, sem dispositivo aprovado correspondente
Linha do Tempo: /cases/case-2024-001/analysis/usb_timeline.csv