Jako obvykle se hodí začít tím, proč se vlastně do něčeho jako Zigbee sniffer pouštět a k čemu nám to vlastně může být dobré.
Odpověď na tuhle základní otázku bude tentokráte poněkud složitější, jelikož si sám nejsem úplně jistý jednoznačnou odpovědí.
Pro mě bylo hlavní motivací poznat zase trochu více jak Zigbee protokol a jeho zařízení fungují a jaké zprávy a informace si mezi sebou vyměňují. Do budoucna by to mohl být dobrý startovní bod pokud by něco nefungovalo tak jak by mělo.
Potřebný hardware
Ukážeme si návod pro náš starý známý USB dongle CC2531, pričemž já jsem se tentokráte rozhodl vyzkoušet verzi s pořádnou anténou, nicméně můžete použít i tu s anténou integrovanou.
Jelikož budeme nahrávat do donglu nový firmware doporučuji pro pohodlnost obstarat si CC Debugger programátor a nebo jeho levnější variantu SmartRF04EB.
Vše potřebné hezky pohromadě – není toho mnoho:
Zigbee Sniffer Wireless Board CC2531 + 10pin redukce
Samotný Zigbee modul sloužící jako gateway = Zigbee koordinátor
$9.48 AliExpress
CC Debugger – Bluetooth / Zigbee Emulated Programmer
Programátor Bluetooth / Zigbee čipů od firmy Texas Instruments – použijeme pro nahrání firmware do Zigbee modulu.
$8.5
AliExpress
Alternativně:
Zigbee Sniffer CC2531 s anténou
Alternativní CC2531, který obsahuje konektor pro externí anténu s větším dosahem.
SmartRF04EB Programmer
Alternativní Bluetooth / Zigbee programátor pro čipy od firmy Texas Instruments – nemám zatím odzkoušeno.
Kompletně zapojeno v mém případě:
Nahrání firmware
Jelikož bych se hodně opakoval poprosím kouknout se do článku o vytvoření vlastní Zigbee gateway do sekce nahrání firmware, kde postup detailně uveden pro všechny platformy a já se dále zaměřím jen na odlišnosti.
Původně jsem zde chtěl detailně popisovat jak získat firmware pro sniffer, ale raději vás o tuto část ochudím a nabídnu rovnou ke stažení příslušný soubor.
? Tento firmware je vhodný pouze pro CC2531 od Texas Instruments.
Soubor je opravdu malý a jak můžete vidět například nahrání v MacOS pomocí utility CC-tool bylo doslova hned.
$ ./cc-tool -e -w sniffer_fw_cc2531.hex
Programmer: CC Debugger Target: CC2531 Erasing flash... Completed Writing flash (8 KB)... Completed (0.68 s.)
Potřebný software
Postup se liší v závislosti na operačním systému, ale základní idea je stejná. Potřebujeme získat určité rozhraní (interface), které umožní prostřednictvím USB donglu s CC2531 a odchytávat provoz pro protokol IEEE 802.15.4 což není nic jiného než Zigbee. Tyto data si pak pošleme na vstup a následnou analýzu do aplikace Wireshark.
Zachytávač zpráv
Windows
Je potřeba si nejprve vytvořit uživatelský účet na stránkách ZBOSS a odtamtud si stáhnout ZBOSS Sniffer. Aplikaci není potřeba instalovat, jen si ji někam rozbalíme.
?♂️ Přiznám se, že jsem jsem tuhle část na Windows nezkoušel a objevíte-li nějaké záludnosti dejte prosím vědět v komentářích.
MacOS / Linux
V případě MacOS / Linux potřebujeme dvě části. Knihovnu libusb a aplikaci whsniff.
V případě MacOS si nainstalujeme libusb pomocí Homebrew:
$ brew install libusb
Na Linuxu pak použijeme balíčkovací systém:
$ sudo apt-get install libusb-1.0.0-dev
Pro whsniff je potřeba si nejprve stáhnout a rozbalit zdrojové kódy a aplikaci zkompilovat:
$ curl -L https://github.com/homewsn/whsniff/archive/v1.3.tar.gz | tar zx $ cd whsniff-1.3 $ make $ sudo make install
Tím máme vše pro zachytávání a ještě můžeme se vrhnout na další část v podobě aplikace Wireshark.
Analýza zpráv – Wireshark
Wireshark (kdysi pod názvem Ethereal) je aplikace pro analýzu paketů, ale také pro odchytávání provozu ze standardních síťových rozhraní jako ethernetová karta a nebo WiFi rozhraní. Jelikož náš případ je poněkud speciální – počítač obvykle nemá potřebu přímo komunikovat se Zigbee sítí – potřebovali jsme ještě prostředníky z předchozí kapitoly.
Windows / MacOS
V případě Wireshark je postup instalace víceméně totožný pro Windows a MacOS. Stačí navštívit stránku pro stažení, kde si vybereme soubor dle našeho systému.
Na MacOS je pak potřeba kromě přesunu aplikace Wireshark do Applications ještě instalace ChmodBPF a přidání Wireshark aplikace systémové cesty – dvě spodní ikonky nalevo.
Linux
V Linuxu by měl být Wireshark součástí balíčkovacích repositářů a tak např. pro Ubuntu/Debian stačí zadat pouze:
$ sudo apt-get install wireshark
Než se pustíme do samotného spuštění odchytávání Zigbee provozu je potřeba si zjistit dva údaje a to network-key a číslo Zigbee kanálu.
Získání network-key a čísla kanálu
Network-key si můžeme představit jako privátní klíč, kterým jsou následně všechny zprávy v jedné Zigbee síti zašifrovány. Pro nás je tedy získání tohoto klíče kritické, abychom vůbec byli schopni číst obsah zpráv.
Ve všech případech platí, že Network-key je definovaný v koordinátoru a jeho získání se liší na základě toho jaký software na koordinátoru provozujeme.
Kromě network-key budeme potřebovat ještě číslo kanálu (můžeme si zjednodušeně představit jako číslo kanálu v TV), abychom se dívali na správnou síť.
Zigbee2MQTT
Pokud Zigbee2MQTT provozujeme jako jako HomeAssistant addon pak veškerou konfiguraci najdeme právě v nastavení addonu. Pokud máme Zigbee2MQTT jako samostatnou aplikaci tak se podíváme po souboru configuration.yaml.
?Pro postup instalace Zigbee2MQTT koukněte do mého staršího článku.
Zajímá nás sekce advanced, kdy klíč channel odpovídá číslu kanálu a network_key je klíč je network-key v poněkud jiném zápisu než potřebujeme.
advanced: channel: 11 network_key: - 1 - 3 - 5 - 7 - 9 - 11 - 13 - 15 - 0 - 2 - 4 - 6 - 8 - 10 - 12 - 13
Někdy můžeme být v konfiguraci network-key uložen v také v tomto formátu:
network_key: [1, 3, 5, 7, 9, 11, 13, 15, 0, 2, 4, 6, 8, 10, 12, 13]
… který je ale je jiný zápis seznamu hodnot pro YAML konfiguraci.
Než klíč použijeme, je potřeba ho transformovat z výše uvedeného zápisu do šestnáctkové soustavy tak, abychom měli vždy dva znaky – doplníme nuly pokud je potřeba, tj. pro náš příklad:
01:03:05:07:09:0B:0D:0F:00:02:04:06:08:0A:0C:0D
deCONZ
V případě deCONZ je situace jednoduší pokud máme rozchozeno VNC připojení. Samotný klíč pak najdeme v nastavení deCONZ sítě, menu Network ▶︎ Edit settings nebo zmáčkneme F9 a network-key je jednou s položek.
?Pro postup instalace deCONZ koukněte do mého staršího článku.
Podobně jako u Zigbee2MQTT i v případe deCONZ je uložený klíč před použitím nejprve trochu převést, ale v tomto případě to bude víceméně jen formátování.
Z hodnoty odstraníme 0x a mezi každé dva znaky dáme dvojtečku.
Na stejné obrazovce najdeme dole i číslo kanálu – Channel Mask.
Spuštění odchytávání ve Wireshark
Nyní už konečně nastal čas si spustit Wireshark pro odchytávání Zigbee provozu což se opět liší pro MacOS / Linux a Windows
MacOS / Linux
$ sudo whsniff -c ZIGBEE_CHANNEL_NUMBER | wireshark -k -i -
Text ZIGBEE_CHANNEL_NUMBER
nahradíme číslem kanálu, který jsme zjistili v předchozí pasáži.
Windows
Nejprve spustíme aplikaci gui\zboss_sniffer.exe
, zadáme cestu k Wireshark aplikaci a klikneme na tlačítko Start.
?Je potřeba se ještě ujistit, že je správně nastavený kanál pro Zigbee, jelikož ten je ve výchozím nastavením 12, ale pro Zigbee2MQTT mohou být tyhle údaje jiné.
Nastavení Zigbee TC a network-key pro odchytávání
Jako další je potřeba nastavit dva klíče.
První – TC key – by měl být stejný bez ohledu na to zda jsme použili Zigbee2MQTT a nebo deCONZ a jeho hodnota je:
5A:69:67:42:65:65:41:6C:6C:69:61:6E:63:65:30:39
Druhý – network-key – jsme si už zjistili v předchozí kapitole.
Oba klíče se nyní vezmeme a v nastavení Wireshark si najdeme položku Protocols ▶︎ Zigbee, kde necháme Security Level na hodnotě AES-128 Encryption, 32-bit Integrity Protection
a klikneme na Edit.
Postupně zadáme oba kódy pomocí tlačítka +
.
A tím máme hotovo veškeré nastavení a měli bychom být schopni vidět kompletní Zigbee provoz ?
Příklad čtení odchycené zprávy
Jakmile zachytávání zpráv spustíme začne se nám log zaplňovat v závislosti na velikosti vaší sítě větším či menším počtem zpráv.
U každé zprávy je pak informace o tom kdo zprávu posílá Source – jedná se o první čtyři znaky ze Zigbee adresy – níže uvádím příklad sítě, kde lze adresy vidět.
deCONZ
V případě použití deCONZ máme v jeho rozhraní seznam jednotlivých uzlů, které obsahují i adresy ve sloupci NWK, které odpovídají těm, které vidím v logu jako Source či Destination.
Pokud se podíváme na označenou zprávu (s číslem 1670) a porovnáme s výše uvedenou tabulkou, pak zjišťujeme, že zařízení které odpovídalo byla žárovka Philips Hue #1.
Tento závěr si můžeme ještě i ověřit pomocí vlastnosti Extended Source
ve zprávě, kde vidíme i MAC adresu.
Jako cíl zprávy je adresa 0x0000 což není nic jiného než koordinátor a v těle zprávy pak můžeme vidět, že obsahem zprávy je stav atributu On/Off
, který má aktuálně hodnotu Off
.
Zigbee2MQTT
V případě použití Zigbee2MQTT máme defakto dvě možnosti jak NWK adresu zjistit. Prvním pohodlnějším je vyčtení z mapy Zigbee sítě v HomeAssistantovi – jedná se o položku v závorkách na druhém řádku, tj. například zde adresa je 0x14027:
Druhou možností je pak otevřením souboru database.db (soubor je ve složce share/zigbee2mqtt) se seznamem zaregistrovaných Zigbee zařízeních do sítě, který je v JSON formátu, tj. např. pro výše uvedené teplotní čidlo je odpovídající záznam:
{ "id": 7, "type": "EndDevice", "ieeeAddr": "0x00158d00025e949f", "nwkAddr": 14027, "manufId": 4151, "manufName": "LUMI", "powerSource": "Battery", "modelId": "lumi.sensor_ht", ... }
.. a adresu najdeme pod klíčem nwkAddr
.
Pokud jste si již někdo s odchytáváním hráli a máte z toho nějaké závěry dejte vědět do komentářů 🙂
Zároveň pokud máte nějaký dotaz neváhejte se zeptat – je to přeci jen náročnější téma nebo alespoň na začátku.
Přiznám se, že nevím, proč se takto složitě hledá nějaký klíč, když v zigbee2qtt jen stačí v configu nastavit, aby registroval nová zařízení a pak jen v jeho blízkosti na zařízení dá vyvolat párování a ono se to do configu zapíše.
Takto to používám já