Phase 2: Traffic Capture
BLE-Verkehr aufzeichnen und analysieren mit nRF52840 und Wireshark
Lernziel
Nach dieser Seite kannst du den nRF52840-USB-Dongle als BLE-Sniffer einrichten, Wireshark mit dem nRF-Sniffer-Plugin konfigurieren und eine vollständige Capture-Session durchführen — inklusive des SMP-Pairing-Handshakes. Du weißt, warum der Startzeitpunkt der Aufzeichnung entscheidend ist, und kannst mit Display-Filtern gezielt die relevanten Pakete isolieren.
Was ist ein Sniffer und warum brauchst du ihn?
Stell dir vor, du stehst neben zwei Menschen, die sich leise unterhalten. Solange du zuhörst, hörst du jedes Wort — aber du kannst die Unterhaltung nicht stoppen oder beeinflussen. Genau das macht ein BLE-Sniffer: Er empfängt alle Funksignale in seiner Umgebung passiv, ohne dass die Geräte es merken.
Phase 1 hat dir gezeigt, was die App tun will — du hast UUIDs, Cipher-Aufrufe und mögliche Schlüsselstellen im dekompilierten Code gefunden. Phase 2 zeigt dir, was tatsächlich über die Luft geht. Oft weichen die beiden voneinander ab — und genau diese Abweichung ist sicherheitsrelevant.
Sniffer vs. Proxy
Ein Sniffer empfängt passiv alle Pakete, ohne in die Kommunikation einzugreifen. Das ist rechtlich weniger problematisch als ein aktiver Man-in-the-Middle-Proxy, erfordert aber passende Hardware, da Smartphones Bluetooth-Pakete nicht in roher Form weiterleiten.
Hardware: Der nRF52840-USB-Dongle
Du benötigst den Nordic Semiconductor nRF52840 USB Dongle (ca. 15 Euro). Er ist der De-facto-Standard für BLE-Sniffing unter Linux, weil Nordic eine offizielle Sniffer-Firmware für Wireshark bereitstellt. Der Dongle kann wahlweise als Sniffer oder als Connectivity-Stack für Python-Exploits (Phase 5) betrieben werden — du benötigst also nur eine Hardware für das gesamte Framework.
Was du brauchst:
- nRF52840 USB Dongle (PCA10059)
- Ubuntu 24.04 / 25.10 (oder ähnliches Linux-System)
- Wireshark 4.6.1 oder neuer
- nRF Sniffer for Bluetooth LE (Download: Nordic Semiconductor)
Schritt 1: Sniffer-Firmware flashen
Der Dongle kommt ab Werk mit einer Bootloader-Firmware. Du musst zuerst die nRF-Sniffer-Firmware aufspielen.
# 1. Dongle in den DFU-Modus versetzen (Knopf beim Einstecken gedrückt halten)
# Die rote LED blinkt langsam.
# 2. nRF Connect for Desktop installieren (enthält Programmer-App)
# Download: https://www.nordicsemi.com/Products/Development-tools/nRF-Connect-for-Desktop
# 3. Sniffer-Firmware-Paket herunterladen
# Datei: nrf_sniffer_for_bluetooth_le_4.1.1.zip
# Enthält: sniffer_pca10059_nrf52840_4.1.1.hex
# 4. Firmware flashen via nRF Connect Programmer
# Gerät auswählen -> HEX-Datei laden -> Write klicken
# Dongle neustart: gelbe LED leuchtet dauerhaftDongle-Status erkennen
Gelbe LED dauerhaft = Sniffer-Firmware aktiv, bereit für Wireshark. Rote LED blinkt langsam = DFU-Modus, bereit zum Flashen. Keine LED = Firmware fehlt oder Stromproblem.
Schritt 2: Wireshark-Extcap-Plugin konfigurieren
Wireshark kommuniziert mit dem Dongle über ein sogenanntes Extcap-Plugin — ein kleines Python-Skript, das Wireshark mitteilt, wie es die Hardware ansprechen soll.
# Plugin-Verzeichnis finden
wireshark --extcap-help 2>&1 | grep "extcap-dir"
# Typisch: ~/.config/wireshark/extcap/
# Plugin-Dateien aus dem ZIP-Paket kopieren
cp nrf_sniffer_for_bluetooth_le/extcap/* ~/.config/wireshark/extcap/
chmod +x ~/.config/wireshark/extcap/nrf_sniffer_for_bluetooth_le.py
# Python-Abhängigkeiten installieren
pip3 install pyserial
# Berechtigungen für serielle Schnittstelle
sudo usermod -a -G dialout $USER
# Abmelden und neu anmelden (Gruppenänderung aktivieren)Nach einem Wireshark-Neustart erscheint der Dongle als neue Capture-Schnittstelle: "nRF Sniffer for Bluetooth LE".
Plugin erscheint nicht in Wireshark
Falls die Schnittstelle fehlt: Prüfe, ob das Python-Skript ausführbar ist (chmod +x). Starte Wireshark einmal als Root, um zu prüfen, ob es ein Berechtigungsproblem mit /dev/ttyACM0 ist. Dauerlösung: sudo usermod -a -G dialout $USER und Neuanmeldung.
Schritt 3: Capture-Strategie — Timing ist entscheidend
Hier machen viele Anfänger den kritischsten Fehler dieser Phase: Sie starten die Aufzeichnung erst, nachdem die App bereits verbunden ist. Damit verpassen sie den SMP-Pairing-Handshake — das ist der Moment, in dem das Gerät entscheidet, ob es Verschlüsselung verwendet und wie der Schlüssel ausgehandelt wird.
Richtige Reihenfolge:
- Wireshark starten und Aufzeichnung beginnen
- Zielgerät einschalten (oder aus dem Standby wecken)
- App auf dem Smartphone öffnen
- App mit dem Gerät verbinden lassen
- Alle App-Funktionen systematisch durchklicken
- Verbindung trennen
- Aufzeichnung stoppen
SMP-Handshake verpasst — häufigster Anfängerfehler
Wenn du Wireshark startest, nachdem die App bereits verbunden ist, siehst du nur den laufenden GATT-Verkehr. Der Pairing-Handshake (SMP-Pakete) ist bereits vorbei. Du siehst keine Pairing-Methode, keinen Temporary Key und kannst nicht beurteilen, ob die Verbindung anfällig für passives Sniffen ist. Starte die Aufzeichnung immer vor dem Verbindungsaufbau.
Gerät auswählen in Wireshark
In den Capture-Optionen der nRF-Sniffer-Schnittstelle kannst du ein Zielgerät nach BLE-Adresse oder Name filtern. Starte zunächst ohne Filter, um alle Advertising-Pakete zu sehen, und wähle dann das Zielgerät aus der Liste aus.
Schritt 4: Wireshark-Display-Filter
Wireshark zeigt dir rohe BLE-Pakete — bei einer 45-sekündigen Session können das über 6.000 Pakete sein. Display-Filter helfen dir, die relevanten Pakete zu isolieren, ohne die Aufzeichnung zu verändern.
Baue dir deinen eigenen Display-Filter interaktiv zusammen — wähle die gewünschten Kategorien und kopiere das Ergebnis direkt in Wireshark:
Wireshark-BLE-Filterbaukasten
GATT
Security
Advertising
Analysis
Wähle oben Filter aus, um einen Wireshark-Anzeigefilter zu erstellen
Unverzichtbare Filter für BLE-Sicherheitsanalyse:
# Alle GATT-Write-Requests (Steuerbefehle der App)
btatt.opcode == 0x12
# Alle GATT-Write-Commands (ohne Response-Anforderung)
btatt.opcode == 0x52
# Beides kombiniert (alle schreibenden Operationen)
btatt.opcode == 0x12 || btatt.opcode == 0x52
# SMP-Pairing-Protokoll (Security Manager Protocol)
btsmp
# Advertising-Pakete (Geräteankündigungen)
btle.advertising_header.pdu_type == 0x00
# Pakete an eine bestimmte GATT-Charakteristik (Handle als Dezimalzahl)
btatt.handle == 18
# Nur Pakete mit einer bestimmten Länge (nützlich zum Erkennen von AES-Blöcken)
btatt.value.length == 16
Opcode-Referenz
GATT-Opcodes sind in der Bluetooth-Spezifikation festgelegt: 0x02 = Error Response, 0x10 = Read Request, 0x12 = Write Request (mit Bestätigung), 0x52 = Write Command (ohne Bestätigung), 0x1b = Handle Value Notification. Für Sicherheitsanalysen sind 0x12 und 0x52 am wichtigsten — dort fließen die Steuerbefehle.
Reale Beispiele aus der Analyse
LED-Strip: 69 Klartextbefehle in 45 Sekunden
Beim Smart-LED-Strip ergab eine 45-sekündige Capture-Session 6.221 Gesamtpakete. Nach Anwendung des Filters btatt.opcode == 0x12 blieben genau 69 GATT-Write-Requests übrig — alle im Klartext, ohne jede Verschlüsselung.
Ein typisches Paket für Farbsteuerung sah so aus:
Frame 142: btatt.opcode=0x12, btatt.handle=0x000e
Payload: 7e 07 05 03 80 ff 00 10 ef
Dekodiert:
7e = Startbyte
07 = Länge der folgenden Bytes
05 = Opcode: Farbsteuerung (RGB)
03 = Parameter
80 = Rot (128)
ff = Grün (255)
00 = Blau (0)
10 = Parameter
ef = Endbyte
Das Capture zeigte außerdem: keine einzige SMP-Pairing-Sequenz in 45 Sekunden. Das Gerät verzichtet vollständig auf Authentifizierung — jeder in Funkreichweite kann sich verbinden und Befehle senden.
Körperwaage: Gesundheitsdaten im Advertisement-Kanal
Die Lebenlang-Waage stellt nicht einmal eine GATT-Verbindung her. Stattdessen sendet sie Gewicht und Körperimpedanz direkt in BLE-Advertisement-Paketen — dem öffentlichen "Ankündigungs"-Kanal, den jeder empfangen kann.
Filter für Advertisement-Pakete:
btle.advertising_header.pdu_type == 0x00 && btcommon.eir_ad.entry.type == 0xff
Ein erfasstes Paket:
Manufacturer Specific Data (ID: 0x05C0)
Payload: c0 0e 0c 99 13 88 ...
Dekodiert:
Offset 2-3: 0x0c99 = 3225 → 32.25 kg (Gewicht)
Offset 4-5: 0x1388 = 5000 → 500.0 Ohm (Körperimpedanz)
Diese Daten sind DSGVO-Artikel-9-Gesundheitsdaten — und sie liegen für jeden passiven Empfänger im Umkreis von 30 Metern lesbar im Klartext vor.
LED-Brille: Verschlüsselter Verkehr — aber mit Schwächen
Die LED-Brille ist der interessanteste Fall: Sie verwendet AES-Verschlüsselung, aber mit einem hartcodierten globalen Schlüssel. Im Capture erkennst du verschlüsselte Pakete daran, dass die 16-Byte-Payloads zufällig aussehen (hohe Shannon-Entropie) und kein menschenlesbares Muster zeigen.
Filter für 16-Byte-Writes (typisch für AES-ECB-Blöcke):
btatt.opcode == 0x12 && frame.len == 16
Der Capture zeigte über 420 Pakete. Mit dem in Phase 3 extrahierten AES-Schlüssel lässt sich jedes einzelne davon entschlüsseln und verifizieren.
Shannon-Entropie als Heuristik
Zufällige (verschlüsselte) Daten haben eine hohe Entropie — nahe 8 bits/byte. Strukturierte Klartextdaten liegen typisch unter 6 bits/byte. Der EntropyCalculator im Referenzteil kann dir helfen, Payload-Bytes auf Verschlüsselung zu prüfen.
Interaktive Checkliste: Phase 2
Phase 2: Traffic Capture
0/12Häufige Probleme und Lösungen
Problem: Keine Pakete des Zielgeräts sichtbar Stelle sicher, dass das Zielgerät aktiv sendet (Advertising) und du die richtige BLE-Adresse in den Sniffer-Optionen eingetragen hast. Starte zunächst ohne Adressfilter, um zu prüfen, ob der Dongle überhaupt Pakete empfängt.
Problem: Nur verschlüsselte Pakete sichtbar, kein Klartext
Das Gerät verwendet Link-Layer-Verschlüsselung. Prüfe, ob du den Pairing-Handshake aufgezeichnet hast (btsmp-Filter). Wenn ja, kann Wireshark den Long-Term-Key ableiten — aber nur, wenn du ihn in den Protokoll-Einstellungen einträgst. Wenn das Gerät LE Secure Connections verwendet, ist das ohne den privaten Schlüssel nicht möglich.
Problem: SMP-Filter zeigt nichts Das Gerät verwendet kein Pairing (wie der Smart-LED-Strip). Das ist selbst ein Sicherheitsproblem — dokumentiere es. Alternativ: Die App verbindet sich bereits beim Start bevor du Wireshark geöffnet hast. Aufzeichnung neu starten, diesmal früher.
Zeitaufwand und Ergebnisse
Phase 2 dauert typisch 4–6 Stunden für alle drei Gerätetypen. Das Hauptergebnis ist eine oder mehrere PCAP-Dateien mit dem vollständigen BLE-Verkehr. Diese Dateien bilden die Grundlage für:
- Phase 4 (Protokollrekonstruktion): Korrelation von App-Code und Netzwerkpaketen
- Phase 5 (PoC-Entwicklung): Replay-Tests mit aufgezeichneten Befehlen
PCAP-Dateien sorgfältig benennen
Benenne deine PCAP-Dateien mit Gerätename, Datum und Session-Nummer, zum Beispiel led-strip_2026-03-13_session1.pcap. Du wirst in Phase 4 auf diese Dateien zurückgreifen, und Verwechslungen kosten Zeit.
Zusammenfassung
- Der nRF52840-Dongle mit Sniffer-Firmware und Wireshark-Extcap-Plugin ist das Standard-Setup für BLE-Sniffing unter Linux.
- Die Aufzeichnung muss vor dem Verbindungsaufbau starten, um den SMP-Pairing-Handshake zu erfassen.
- Der Filter
btatt.opcode == 0x12isoliert alle GATT-Write-Requests — die eigentlichen Steuerbefehle. - Der Filter
btsmpzeigt das Pairing-Protokoll — seine Abwesenheit ist selbst ein Sicherheitsbefund. - Beim Smart-LED-Strip waren alle 69 Steuerbefehle im Klartext lesbar. Die Waage sendete Gesundheitsdaten passiv im Advertisement-Kanal.
Warum muss die Wireshark-Aufzeichnung vor dem Verbindungsaufbau der App gestartet werden?