Was macht Analyse der USB-Geräteverbindungshistorie?
Verwendungshinweise
- Bei der Untersuchung potenzieller Datenexfiltration über Wechseldatenträger
- Bei Insider-Bedrohungsuntersuchungen zur Verfolgung der USB-Gerätenutzung
- Für Compliance-Audits zur Überprüfung der Einhaltung von Wechselmedienrichtlinien
- Bei der Korrelation von USB-Verbindungen mit Dateizugriffs- und Kopierereignissen
- Zur Erstellung einer Zeitleiste der Geräteverbindungen während eines Vorfalls
Voraussetzungen
- Forensisches Abbild oder extrahierte Registrierungshives und Ereignisprotokolle
- Zugriff auf SYSTEM-, SOFTWARE- und NTUSER.DAT-Registrierungshives
- SetupAPI-Protokolle (setupapi.dev.log)
- Windows-Ereignisprotokolle (System, Sicherheit, DriverFrameworks-UserMode)
- USBDeview, USB Forensic Tracker oder RegRipper
- Verständnis der USB-Geräteidentifikation (VID, PID, Seriennummer)
Arbeitsablauf
Schritt 1: Extraktion USB-bezogener Artefakte
# Forensisches Abbild mounten und relevante Artefakte kopieren
mount -o ro,loop,offset=$((2048*512)) /cases/case-2024-001/images/evidence.dd /mnt/evidence
mkdir -p /cases/case-2024-001/usb/
# Registrierungshives
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/
# SetupAPI-Protokolle (erste Verbindungszeitstempel)
cp /mnt/evidence/Windows/INF/setupapi.dev.log /cases/case-2024-001/usb/
# Ereignisprotokolle
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
Schritt 2: Extrahieren des USBSTOR-Registrierungsschlüssels
# USBSTOR-Einträge aus dem SYSTEM-Hive extrahieren
python3 << 'PYEOF'
from Registry import Registry
import json
reg = Registry.Registry("/cases/case-2024-001/usb/SYSTEM")
# Aktuelles ControlSet finden
select = reg.open("Select")
current = select.value("Current").value()
controlset = f"ControlSet{current:03d}"
# USBSTOR parsen
usbstor_path = f"{controlset}\\Enum\\USBSTOR"
usbstor = reg.open(usbstor_path)
devices = []
print("=== USBSTOR-GERÄTE ===\n")
for device_class in usbstor.subkeys():
# Format: Disk&Ven_VENDOR&Prod_PRODUKT&Rev_REVISION
class_name = device_class.name()
parts = class_name.split('&')
vendor = parts[1].replace('Ven_', '') if len(parts) > 1 else 'Unbekannt'
product = parts[2].replace('Prod_', '') if len(parts) > 2 else 'Unbekannt'
revision = parts[3].replace('Rev_', '') if len(parts) > 3 else 'Unbekannt'
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),
}
# Anzeigenamen abrufen, falls verfügbar
try:
friendly = instance.value("FriendlyName").value()
device_info['friendly_name'] = friendly
except:
pass
# Geräteparameter abrufen
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"Gerät: {vendor} {product}")
print(f" Seriennummer: {serial}")
print(f" Zuletzt verbunden: {last_write}")
print(f" Anzeigename: {device_info.get('friendly_name', 'N/A')}")
print()
# Ergebnisse speichern
with open('/cases/case-2024-001/analysis/usb_devices.json', 'w') as f:
json.dump(devices, f, indent=2)
print(f"\nInsgesamt gefundene USB-Speichergeräte: {len(devices)}")
PYEOF
Schritt 3: Extrahieren der Laufwerksbuchstabenzuweisungen und Benutzerzuordnungen
# MountedDevices aus dem SYSTEM-Hive parsen
python3 << 'PYEOF'
from Registry import Registry
import struct
reg = Registry.Registry("/cases/case-2024-001/usb/SYSTEM")
mounted = reg.open("MountedDevices")
print("=== GEMOUNTETE GERÄTE (Laufwerksbuchstabenzuweisungen) ===\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:
# USB-Gerät – enthält Gerätepfad als Zeichenfolge
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:
# Festplatte – enthält Datenträgersignatur + Offset
disk_sig = struct.unpack('<I', data[0:4])[0]
offset = struct.unpack('<Q', data[4:12])[0]
print(f" {drive_letter} -> Datenträgersignatur: 0x{disk_sig:08X}, Offset: {offset}")
PYEOF
# Benutzer-MountPoints2 parsen (welcher Benutzer auf welche Geräte zugegriffen hat)
python3 << 'PYEOF'
from Registry import Registry
import os, glob
print("\n=== BENUTZER-MOUNTPOINTS (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"Benutzer-Hive: {os.path.basename(ntuser)}")
for key in mp2.subkeys():
guid = key.name()
last_write = key.timestamp()
if '{' in guid:
print(f" Volume: {guid} | Zuletzt zugegriffen: {last_write}")
print()
except Exception as e:
print(f" Fehler beim Parsen von {ntuser}: {e}")
PYEOF
Schritt 4: Extrahieren der ersten Verbindungszeitstempel aus SetupAPI
# setupapi.dev.log nach USB-Geräte-Erstinstallationszeitstempeln durchsuchen
python3 << 'PYEOF'
import re
print("=== SETUPAPI-USB-GERÄTEINSTALLATIONEN ===\n")
with open('/cases/case-2024-001/usb/setupapi.dev.log', 'r', errors='ignore') as f:
content = f.read()
# USB-Geräteinstallationsabschnitte finden
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:
# Geräte-ID extrahieren
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"\nInsgesamt gefundene USB-Installationen: {len(usb_installs)}")
PYEOF
# Windows-Ereignisprotokolle auf USB-Ereignisse durchsuchen
# Ereignis-IDs: 2003, 2010, 2100, 2102 (DriverFrameworks-UserMode)
# Ereignis-IDs: 6416 (Sicherheit – neues externes Gerät erkannt)
python3 << 'PYEOF'
import json
from evtx import PyEvtxParser
try:
parser = PyEvtxParser("/cases/case-2024-001/usb/System.evtx")
print("\n=== SYSTEM-EREIGNISPROTOKOLL-USB-EREIGNISSE ===\n")
for record in parser.records_json():
data = json.loads(record['data'])
event_id = str(data['Event']['System']['EventID'])
# USB-Geräteverbindungsereignisse
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}] Ereignis-ID {event_id}: {json.dumps(event_data, default=str)[:200]}")
except Exception as e:
print(f"Fehler: {e}")
PYEOF
Schritt 5: USB-Aktivitätszeitleiste und Bericht erstellen
# Alle USB-Beweise in einer einheitlichen Zeitleiste zusammenführen
python3 << 'PYEOF'
import json, csv
timeline = []
# USBSTOR-Daten laden
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': 'USBSTOR-Registrierung',
'device': f"{device['vendor']} {device['product']}",
'serial': device['serial'],
'event': 'Zuletzt verbunden',
'detail': device.get('friendly_name', '')
})
# Chronologisch sortieren
timeline.sort(key=lambda x: x['timestamp'])
# Zeitleiste als CSV schreiben
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"USB-Zeitleiste: {len(timeline)} Ereignisse nach usb_timeline.csv geschrieben")
# Zusammenfassung ausgeben
print("\n=== USB-GERÄTEZUSAMMENFASSUNG ===")
for entry in timeline:
print(f" {entry['timestamp']} | {entry['device']} | {entry['serial'][:20]} | {entry['event']}")
PYEOF
Schlüsselkonzepte
| Konzept | Beschreibung |
|---|---|
| USBSTOR | Registrierungsschlüssel, der Identifikations- und Verbindungsdaten von USB-Massenspeichergeräten speichert |
| VID/PID | Hersteller-ID und Produkt-ID, die USB-Gerätehersteller und -Modell eindeutig identifizieren |
| Geräteseriennummer | Eindeutige Kennung für einzelne USB-Geräte (einige Geräte teilen sich Seriennummern) |
| MountedDevices | Registrierungsschlüssel, der Volume-GUIDs und Laufwerksbuchstaben physischen Geräten zuordnet |
| MountPoints2 | Benutzerspezifischer Registrierungsschlüssel, der anzeigt, auf welche Volumes ein Benutzer zugegriffen hat |
| SetupAPI-Protokoll | Windows-Treiberinstallationsprotokoll, das Erstverbindungen von Geräten aufzeichnet |
| DeviceContainers | Registrierungsschlüssel im SOFTWARE-Hive mit Gerätemetadaten und Zeitstempeln |
| EMDMgmt | Registrierungsschlüssel, der ReadyBoost-kompatible Geräte mit Seriennummern und Zeitstempeln verfolgt |
Werkzeuge und Systeme
| Werkzeug | Zweck |
|---|---|
| USB Forensic Tracker | Spezialisiertes Tool zur Extraktion der USB-Gerätehistorie |
| USBDeview | NirSoft-Tool, das alle mit einem System verbundenen USB-Geräte auflistet |
| RegRipper (usbstor-Plugin) | Automatisierte Extraktion von USB-Artefakten aus Registrierungshives |
| Registry Explorer | Interaktive Registrierungsanalyse für USB-bezogene Schlüssel |
| KAPE | Automatisierte Sammlung von USB-bezogenen Artefakten |
| Plaso/log2timeline | Zeitleistenerstellung einschließlich USB-Verbindungsereignissen |
| FTK Imager | Forensische Abbilderstellung einschließlich Wechselmedien |
| Velociraptor | Endpunkt-Agent mit Jagdartefakten zur USB-Gerätehistorie |
Häufige Szenarien
Szenario 1: Datenexfiltration durch ausscheidenden Mitarbeiter USBSTOR-Einträge extrahieren, um alle jemals verbundenen USB-Geräte zu identifizieren, Seriennummern mit MountPoints2 korrelieren, um den Benutzerzugriff zu bestätigen, Zeitstempel mit Dateizugriffsprotokollen und Spring-Liste aktueller Dateien abgleichen, auf große Dateikopiermuster im USN-Journal prüfen.
Szenario 2: Nicht autorisiertes Gerät in einem sicheren System Alle USBSTOR-Einträge mit der Liste der zugelassenen Geräte abgleichen, nicht autorisierte Geräte anhand von VID/PID identifizieren, die nicht der unternehmensgeprüften Hardware entsprechen, bestimmen, wann das nicht autorisierte Gerät zuerst und zuletzt verbunden wurde, prüfen, ob Daten übertragen wurden.
Szenario 3: Malware-Verteilung über USB USB-Gerät identifizieren, das kurz vor der Malware-Ausführung verbunden wurde (Prefetch-Zeitstempel), Seriennummer und Herstellerinformationen extrahieren, prüfen, ob Autoplay für das Gerät aktiviert war, nach Start einer ausführbaren Datei vom Wechseldatenträger-Laufwerksbuchstaben in Prefetch und ShimCache suchen.
Szenario 4: Verfolgen eines bestimmten USB-Laufwerks über mehrere Systeme hinweg Nach derselben Geräteseriennummer in USBSTOR über alle forensischen Abbilder suchen, eine Karte der Systeme erstellen, mit denen das Laufwerk verbunden war, und wann, den chronologischen Pfad des Geräts durch die Organisation identifizieren, mit Netzwerkfreigabe-Zugriffsprotokollen abgleichen.
Ausgabeformat
USB-Geräteverlaufsanalyse:
System: DESKTOP-ABC123 (Windows 10 Pro)
Gesamtzahl USB-Speichergeräte: 12
Analysequellen: USBSTOR, MountedDevices, MountPoints2, SetupAPI, Ereignisprotokolle
Gerätebestand:
1. Kingston DataTraveler 3.0 (Seriennummer: 0019E06B4521A2B0)
Erstmalig verbunden: 2024-01-10 09:15:32 (SetupAPI)
Zuletzt verbunden: 2024-01-18 14:30:00 (USBSTOR)
Laufwerksbuchstabe: E:
Benutzerzugriff: verdaechtiger_benutzer (MountPoints2)
2. WD My Passport (Seriennummer: 575834314131363035)
Erstmalig verbunden: 2024-01-15 20:00:00
Zuletzt verbunden: 2024-01-15 23:45:00
Laufwerksbuchstabe: F:
Benutzerzugriff: verdaechtiger_benutzer
Verdächtige Feststellungen:
- Kingston-Laufwerk während des Untersuchungszeitraums 15 Mal verbunden
- WD Passport nur einmal verbunden, spätabends (ungewöhnliche Uhrzeit)
- Unbekanntes Gerät (VID_1234&PID_5678) am 2024-01-17 verbunden, kein passendes zugelassenes Gerät
Zeitleiste: /cases/case-2024-001/analysis/usb_timeline.csv