nRF52840-dongle als packetsniffer: Ook voor bluetooth en Zigbee

Bij problemen met draadloze apparaten is het vaak moeilijk om precies de oorzaak aan te duiden. Een draadloze sniffer helpt daarbij. Het programma Wireshark kan standaard al wifi-verkeer afluisteren, maar met een nRF52840-dongel van Nordic Semiconductor en een plug-in kun je er ook bluetooth low-energy- en Zigbee-verkeer mee uit de lucht plukken.

Om netwerkverkeer te bekijken, heb je een zogenoemde packetsniffer nodig. Wireshark is een populaire opensource-packetsniffer die zowel op Windows, Linux als macOS draait. Het is een standaard hulpmiddel geworden in de gereedschapskist van netwerkbeheerders. Je onderzoekt er zowel wifi- als ethernetverkeer mee, bijvoorbeeld om netwerkproblemen te analyseren.

Maar steeds meer apparaten werken niet op je ip-gebaseerde thuisnetwerk, maar met een eigen draadloos netwerk. Denk daarbij aan bluetooth low-energy, dat voor domotica en allerlei sensoren populair is. Maar ook Zigbee is zo’n netwerk, populair gemaakt door Philips Hue en IKEA Trådfri. Standaard zijn deze niet zichtbaar voor Wireshark. Maar met een extra dongel en een plug-in voor Wireshark heeft ook dit verkeer geen geheimen meer voor je.

nRF52840 kopen

De nRF52840 van Nordic Semiconductor is een populaire chip die draadloze netwerken op een frequentie van 2,4 GHz ondersteunt, waaronder bluetooth, Zigbee en Thread. De chipfabrikant heeft er ook een ontwikkelbordje mee gemaakt in de vorm van een usb-stick: de nRF52840 Dongle (PCA10059). Dit is een kaal printplaatje, maar andere fabrikanten verkopen ook versies met een behuizing.

Twee toegankelijke versies zijn de April USB Dongle 52840 van April Brother en de nRF52840 MDK USB Dongle van makerdiary. Ze zijn allebei voor rond de 20-25 euro te vinden. Een voordeel ten opzichte van het kale printplaatje van Nordic Semiconductor is dat ze standaard geleverd worden met de Adafruit nRF52 Bootloader. Daardoor doet het bordje zich in uploadmodus aan je computer voor als een usb-stick en kun je eenvoudig nieuwe firmware installeren door het firmwarebestand naar de virtuele schijf te kopiëren. We gaan er in dit artikel van uit dat je een van deze twee dongels hebt.

Firmware voor BLE-sniffer

Download de nieuwste versie van de firmware nRF Sniffer for Bluetooth LE van de website van Nordic Semiconductor. Pak het zip-bestand uit in een nieuwe map. In de map hex vind je het firmwarebestand sniffer_nrf52840dongle_nrf52840_7cc811f.hex voor de dongel. Is er ondertussen een nieuwere versie uit, dan zullen de hexadecimale cijfers op het einde van het bestand verschillen. Maar controleer dat je het bestand met dongle in de naam kiest.

Deze hex-bestanden zijn gemaakt voor de standaard bootloader van Nordic Semiconductor. Om ze met de bootloader van Adafruit te installeren, moet je ze nog omzetten naar het juiste formaat, namelijk UF2. Dat staat voor USB Flashing Format en is ontwikkeld door Microsoft. Op de GitHub-pagina van het project staat ook een Python-script uf2conv.py om hex-bestanden naar uf2 om te zetten. Download het door op de GitHub-pagina van het script op Raw te klikken en dan het bestand op te slaan, bijvoorbeeld in dezelfde map als de hex-bestanden.

UF2-firmware

Zorg dat je eerst Python op je besturingssysteem hebt geïnstalleerd. Vink in Windows de optie Add Python to environment variables aan. Ga daarna in een opdrachtregelvenster (in Windows de Opdrachtprompt) naar de map van Nordic Semiconductors nRF Sniffer en daarin naar de map hex waar de firmwarebestanden staan. Zet het juiste hex-bestand nu met het Python-script van Microsoft om naar een uf2-bestand met het commando:

python3 uf2conv.py sniffer_nrf52840dongle_nrf52840_7cc811f.hex -c -f 0xada52840

Dit gaat ervan uit dat het script uf2conv.py zich in dezelfde directory als het hex-bestand bevindt, pas het pad indien nodig aan. Met de optie -c converteert het script het bestand en met de optie -f geven we de microcontrollerfamilie aan (nRF52840). Na het uitvoeren van dat commando bevindt zich in de map een bestand flash.uf2 met de UF2-versie van de firmware.

Firmware installeren

Om de firmware nu te installeren, dien je de dongel eerst in DFU-modus (Device Firmware Update) te zetten. Bij de dongel van April Brother doe je dat door het pinnetje van een mannelijke jumperwire in het gaatje in de behuizing ingedrukt te houden, dan de dongel in de usb-poort van je computer te schuiven en het pinnetje los te laten. Met de dongel van makerdiary gaat het vergelijkbaar: houd de knop bovenaan ingedrukt, schuif de dongel in de usb-poort van je computer en laat de knop los.

Daarna verbindt de dongel zich als een usb-stick op je computer. Bij de April Brother heet die NRF52BOOT, bij makerdiary is dat MDK-DONGLE. Versleep dan het bestand flash.uf2 naar het usb-opslagapparaat van de dongel. Als je het apparaat daarna uit de usb-connector van je computer verwijdert en weer insteekt, heb je een BLE-sniffer.

Plug-in voor Wireshark

Nu de sniffer-firmware op de dongel staat, moeten we alleen Wireshark nog duidelijk maken hoe het deze kan gebruiken om bluetooth-verkeer af te luisteren. De plug-in daarvoor vind je in de map extcap van de nRF-sniffer. Ga op het opdrachtregelvenster naar die map en installeer de benodigdheden met:

pip3 install -r requirements.txt

Open dan in Wireshark het menu Help / About Wireshark en dan het tabblad Folders. Dubbelklik op Personal Extcap path en bevestig dat je deze map wilt aanmaken. Kopieer nu de hele inhoud van de map extcap van de nRF-sniffer naar die map. Open daarna een opdrachtregel in die map en kijk of het script een extcap-interface vindt. Op Windows doe je dat met het volgende commando:

rf_sniffer_ble.bat --extcap-interfaces

En op Linux en macOS met:

./rf_sniffer_ble.sh --extcap-interfaces

Druk in Wireshark op F5 om de interface te verversen en vink in het menu View / Interface Toolbars het onderdeel nRF Sniffer for Bluetooth LE aan.

Als Wireshark je dongel niet herkent of als je geen bluetooth-pakketten te zien krijgt, controleer dan eerst of je wel alle stappen in dit artikel gevolgd hebt. Bekijk daarna de pagina Troubleshooting in het infocenter van Nordic Semiconductor, waar de oplossingen voor enkele veel voorkomende problemen staan uitgelegd (de uitleg over J-Link mag je negeren omdat je de UF2-bootloader gebruikt).

Met de makerdiary-dongel zijn we zelf nog een ander probleem tegengekomen, waarbij Wireshark eerst de dongel herkende, maar bij het starten van het sniffen hem plots niet meer herkende. De oplossing vonden we op het forum van Nordic Semiconductor: start Wireshark, steek de dongel in een usb-poort, druk op F5, waarna Wireshark de dongel herkent. Druk dan op de resetknop van de dongel en dubbelklik dan, zonder op F5 te drukken, onmiddellijk op nRF Sniffer for Bluetooth LE, waarna het sniffen start. Lukt het nog niet, haal de dongel dan uit de usb-poort en steek die er weer in.

Bluetooth-profiel installeren

Je zou nu al bluetooth-verkeer moeten kunnen sniffen. De nRF-sniffer bevat ook een profiel voor bluetooth low-energy waardoor Wireshark meer kolommen met informatie toont. Open daarvoor weer Help / About Wireshark en dubbelklik in het tabblad Folders op Personal configuration. Kopieer de map Profile_nRF_Sniffer_Bluetooth_LE van de nRF-sniffer naar de map Profiles van de map met je persoonlijke Wireshark-configuratie. Open daarna in Wireshark het menu Edit / Configuration Profiles, selecteer Profile_nRF_Sniffer_Bluetooth_LE en klik op OK.

Advertisements bekijken

Wireshark is nu klaar voor gebruik met je nRF-sniffer. Steek de dongel in een usb-poort, druk in Wireshark op F5 om de interface te verversen en dubbelklik op nRF Sniffer for Bluetooth LE. Daarna start Wireshark met sniffen. 

Standaard toont Wireshark alle advertisements van BLE-apparaten: dat zijn pakketjes die de apparaten broadcasten zodat ze gevonden kunnen worden. Sommige apparaten, zoals temperatuursensoren, sturen ook informatie rond in zogenoemde manufacturer data in de advertisements. Die krijg je te zien als je in Wireshark op een pakketje klikt en dan Bluetooth Low Energy Link Layer / Advertising Data / Manufacturer Specific / Data openklapt.

Pakketten filteren

Als je meer dan een handvol BLE-apparaten hebt, zul je continu uitgezonden pakketjes te zien krijgen. In de kolom Info vind je het type Protocol Data Unit (PDU), meestal ADV_IND (waarmee apparaten aangeven dat je ermee kunt verbinden) of ADV_NONCONN_IND (waarmee ze aangeven dat je er niet mee kunt verbinden). Maar wanneer je verbindingsproblemen wilt onderzoeken, zijn enkele andere PDU’s interessant: SCAN_REQ (een scan), SCAN_RSP (een antwoord op een scan) en CONNECT_REQ (een verbindingsaanvraag).

Stel dat je wilt weten welke bluetooth-apparaten op een scan reageren, wacht dan tot er een pakket met PDU SCAN_RSP voorbijkomt en selecteer dit. Klap dan in het middelste deelvenster Bluetooth Low Energy Link Layer / Packet Header uit en klik met rechts op 0100 = PDU Type: SCAN_RSP (0x04). Kies dan Apply as Filter / Selected. Bovenaan verschijnt dan de weergavefilter btle.advertising_header.pdu_type == 0x4 en je krijgt nu alleen de antwoorden op scans te zien.

Verbindingen bekijken

Wil je problemen met een specifieke verbinding bekijken, dan kun je Wireshark instrueren om je tot pakketten van of naar een specifiek adres te beperken. Klik daarvoor boven op het uitklapmenu naast Device en kies je apparaat. Naast de advertisements kan Wireshark dan ook pakketjes binnen een verbinding onderscheppen, tenminste als het niet om een beveiligde verbinding gaat of als je in het veld ernaast de passkey- of out-of-band-sleutel invult.

Begin daarvoor het netwerkverkeer van het apparaat te sniffen en laat dan een apparaat hiermee verbinden. Je zult onmiddellijk allerlei pakketjes voorbij zien komen, en in de detailweergaven van het geselecteerde pakketje vind je nu ook informatie over de hogere lagen van BLE, inclusief L2CAP en het Attribute Protocol (ATT). Je kunt nu ook zien welke waardes er via het protocol doorgegeven worden als de client een bluetooth-karakteristiek leest of schrijft.

Firmware voor 802.15.4

Nordic Semiconductor heeft ook firmware die van de nRF52840 een sniffer maakt voor IEEE 802.15.4, het onderliggende netwerkprotocol in de fysieke laag en MAC-laag van Zigbee en Thread. Dit is dus ideaal om bijvoorbeeld verbindingsproblemen met je Philips Hue-lampen te analyseren.

Download nRF Sniffer for 802.15.4 van GitHub, bijvoorbeeld door op het groene knopje Code te klikken en dan op Download ZIP. Navigeer dan naar de map nrf802154_sniffer. De firmware voor de dongel vind je in het bestand nrf802154_sniffer_dongle.hex. Zet dit om naar het UF2-formaat met het Python-script uf2conv.py dat je hiervoor al gebruikte (pas het pad naar uf2conv.py aan):

python3 uf2conv.py nrf802154_sniffer_dongle.hex -c -f 0xada52840

Steek nu je nRF52840-dongel in je computer en druk snel twee keer op de resetknop binnen een halve seconde om de DFU-modus op te starten. Nadat het opslagapparaat is gekoppeld, kopieer je het bestand flash.uf2 naar de schijf. Daarna werkt je dongel als 802.15.4-sniffer.

Plug-in installeren

Open nu weer in Wireshark de map met extcap-plug-ins door het menu Help / About Wireshark te doorlopen, het tabblad Folders te openen en dan te dubbelklikken op Personal Extcap path. Kopieer daarnaar het bestand nrf802154_sniffer.py en onder Windows het bestand nrf802154_sniffer.bat.

Installeer daarna de Python-module pySerial:

pip3 install pyserial

Open daarna een opdrachtregel in de map waarnaar je de bestanden hebt gekopieerd en kijk of het script een extcap-interface vindt. Op Windows doe je dat met het commando:

nrf802154_sniffer.bat --extcap-interfaces

En op Linux en macOS met:

python3 nrf802154_sniffer.py --extcap-interfaces

Zigbee-verkeer sniffen

Druk in Wireshark op F5 om de interface te verversen en vink in het menu View / Interface Toolbars het onderdeel nRF Sniffer for 802.15.4 aan. Die voor Bluetooth LE kun je uitvinken als je die niet meer nodig hebt. Open ook het menu Edit / Configuration Profiles, selecteer het profiel Default en klik op OK om dit te activeren.

In de lijst met interfaces verschijnt nu nRF Sniffer for 802.15.4 en dan je interface-apparaat (COM-poort op Windows en /dev/ttyACM0 op Linux). Klik op het icoontje van een tandwiel en stel het kanaal in op het kanaal van je Zigbee-netwerk (standaard 11). Kies bij Out-Of-Band meta-data voor IEEE 802.15.4 TAP. Klik daarna op Start om het sniffen te starten.

Encryptiesleutels

Als je de detailweergave van je Zigbee-pakketjes bekijkt, zie je normaal in het onderdeel Zigbee Network Layer Data als je Frame Control Field uitklapt dat de flag Security op True staat. Dat betekent dat de applicatielaag die eronder wordt getoond, versleuteld is. Je krijgt dus wel te zien dat er Zigbee-pakketjes verstuurd worden, maar niet wat er in staat.

Om de applicatielaag van de pakketjes in Wireshark te kunnen bekijken, heb je de netwerksleutel nodig. Gebruik je Zigbee2MQTT, dan vind je die in het bestand configuration.yaml onder advanced. Daar staat de netwerksleutel in deze vorm:

[225, 167, 199, 215, 99, 234, 178, 75, 98, 151, 167, 200, 155, 149, 50, 85]

Dat zijn 16 bytes in decimale waardes. Wireshark heeft de sleutel nodig in hexadecimale vorm. Open een Python-shell met de opdracht python3 en voer de volgende opdracht uit om de sleutel in de juiste vorm voor Wireshark te zetten:

':'.join(["{0:0{1}x}".format(i, 2) for i in [225, 167, 199, 215, 99, 234, 178, 75, 98, 151, 167, 200, 155, 149, 50, 85]])

Als je na dit commando op Enter drukt, geeft Python onderstaande regel als resultaat:

'e1:a7:c7:d7:63:ea:b2:4b:62:97:a7:c8:9b:95:32:55'

Open vervolgens de instellingen van Wireshark in Edit / Preferences, open Protocols / Zigbee, klik bij Pre-configured Keys op Edit en voeg je netwerksleutel toe. Dat kan met een klik op het groene plusteken en door je sleutel in de vorm e1:a7:c7:d7:63:ea:b2:4b:62:97:a7:c8:9b:95:32:55 (dus zonder de enkele aanhalingstekens eromheen die Python toonde) te plakken. Vul bij Label een naam in (zoals Zigbee Network Key) en klik op OK.

Vanaf nu kan Wireshark alle communicatie van je Zigbee-apparaten ontcijferen en toont het ook de applicatielaag. Zo krijg je nu in de detailweergave een onderdeel ZigBee Application Support Layer Data te zien, met bij Profile de waarde Home Automation. En bij een deurcontactsensor krijg je dan in het onderdeel ZigBee Cluster Library Frame een Attribute Field te zien met de waarde On of Off.

Netwerksleutel onderscheppen

Als laatste tonen we een zwakheid van veel Zigbee-netwerken. Verwijder de netwerksleutel uit Wireshark. De applicatielaag krijg je nu niet meer te zien. Voeg nu een nieuwe sleutel toe (5A:69:67:42:65:65:41:6C:6C:69:61:6E:63:65:30:39) met als label ZigBeeAlliance09. Dit is de ‘globale trust center link key’ van de Zigbee Alliance, die door de meeste Zigbee-apparaten wordt ondersteund als er geen andere sleutel ingesteld is.

Voeg nu een apparaat toe aan je Zigbee-netwerk. In Zigbee2MqttAssistant klik je daarvoor op de pagina Status op Allow new devices to join the network. Zoek daarna op de webpagina met ondersteunde apparaten naar je apparaat en kijk op de apparaatspecifieke pagina naar de instructies voor pairing. Meestal dien je een knop enkele seconden in te drukken.

Als dat is gebeurd, kijk dan naar de Zigbee-pakketjes die in Wireshark voorbij zijn gekomen. Zoek naar een pakketje met Device Announcement in de kolom Info. Klap in de detailweergave van het pakket ZigBee Network Layer Data uit en dan ZigBee Security Header. Achter Key vind je nu gewoon de netwerksleutel van je Zigbee-netwerk! Iedereen in je buurt kan die netwerksleutel onderscheppen op het moment dat je Zigbee-apparaten aan je netwerk toevoegt.

Geschreven door: Koen Vervloesem op

Category: Workshop, Netwerk

Tags: netwerk, bluetooth, iot, zigbee