Сниффер Zigbee трафика в Linux

При разработке нового устройства с Zigbee весьма полезно, и кроме этого рекомендуется TI, использовать сниффер пакетов, для получения всеобъемлющей информации о том, что происходит в сети. TI рекомендует два решения:

  1. Ubiqua Protocol Analyzer — мощное решение для анализа сетей IEEE 802.15.4, у которого есть поддержка CC2531 USB стика. Данный стик я как раз планирую использовать в качестве сниффера. Минус данного решения в том, что приложение работает по подписке, которая стоит 65$ в месяц! Если у вас есть лишние 65$ в месяц, то как работать с данной программой можно прочесть в инструкции пользователя от TI.
  2. Wireshark — открытая и бесплатная утилита, которая может работать в паре с TI Packet Sniffer. Это уже более интересное решение, его и попробуем запустить, тем более что все уже довольно хорошо описано на страницах проекта zigbee2mqtt.

Существует 2 версии данной утилиты: Packet Sniffer и Packet Sniffer 2, последняя работает с отладочными платами CC13xx или CC26xx Launchpad. Первая же версия работает с CC2531 USB стиком и она то нам и нужна. Первым делом нужно залить в CC2531 прошивку сниффера.

Прошивка CC2531 USB стика

Прошивка влючена в Packet Sniffer, качаем его. Т.к. прошивка доступна только как инсталлятор для Windows, то необходимо предварительно извлечь ее. Для этого нужно использовать утилиту 7zip.

$ unzip swrc045z.zip -d PACKET-SNIFFER
$ 7z e PACKET-SNIFFER/Setup_SmartRF_Packet_Sniffer_2.18.0.exe bin/general/firmware/sniffer_fw_cc2531.hex

Прошить CC2531 можно несколькими способами, но самый простой это использовать CC Debugger, который у меня есть и мне не придется использовать альтернативные способы прошивки.

Нужна будет утилита CC-Tool для которой требуется установить несколько зависимостей

$ sudo apt install dh-autoreconf libusb-1.0 libboost-all-dev

После чего необходимо осуществить сборку CC-Tool

$ git clone https://github.com/dashesy/cc-tool.git
$ cd cc-tool
$ ./bootstrap
$ ./configure
$ make

Из директории /udev утилиты скопируйте файл 90-cc-debugger.rules в /etc/udev/rules.d. После необходимо перезагрузить udev

$ sudo /etc/init.d/udev stop
$ sudo udevadm control --reload-rules
$ sudo /etc/init.d/udev start

Теперь можно подключить cc-debugger и CC2531 USB сниффер к компьютеру.

cc2531 usb сниффер linux

Если светодиод на отладчике горит красным, то необходимо нажать кнопку RESET, светодиод должен загореться зеленым. Если этого не происходит, то необходимо обратиться к руководству пользователя cc-debugger и искать причину неисправности. В моем случае меня ждал именно такой вариант.

Красное свечение светодиода говорит о том, что отладчик не может определить SoC, который к нему подключен. В руководстве сказано, что первым делом стоит обновить прошивку программатора. Но как оказалось проблема была в замыкании выводов GND и Target Voltage Sense на плате переходника.

После устранения замыкания прошивка сразу прошла успешно. Прошивка осуществляется командой:

$ sudo <path-to>/cc-tool -e -w <path-to>/sniffer_fw_cc2531.hex
cc2531 usb firmware download

Установка необходимых программ

$ cd /opt
$ sudo apt-get install -y libusb-1.0-0-dev wireshark
$ curl -L https://github.com/homewsn/whsniff/archive/v1.1.tar.gz | tar zx
$ cd whsniff-1.1
$ make
$ sudo make install

Запуск сниффера пакетов

Запустить сниффер можно командой

$ sudo whsniff -c ZIGBEE_CHANNEL_NUMBER | wireshark -k -i -

Откроется окно wireshark и начнется запись пакетов. Но поскольку пакеты данных зашифрованы, нам необходимо добавить 2 ключа шифрования. Первый это Trust Center ключ, который одинаков почти для всех сетей Zigbee. И второй — ключ шифрования сети (Network Key).

Первый ключ добавляется через меню Edit > Preferences > Protocols > ZigBee. Здесь нужно выбрать уровень безопасности AES-128 Encryption, 32-bit Integrity Protection и нажать кнопку Edit. Откроется окно, в котором нужно создать новый ключ 5A:69:67:42:65:65:41:6C:6C:69:61:6E:63:65:30:39 с полем Byte Order, установленным в Normal.

Со вторым ключом все сложнее. Чтобы выяснить каков Network Key обратимся к настройкам демо проекта ccstudio, который я ранее разбирал в предыдущей статье. В моем проекте он задан последовательностью нулей, что делает сетевой ключ генерируемым случайно.

zigbee network key

Но к счастью, ключ шифрования сети можно получить в момент добавления устройства к сети. Для этого мне пришлось отсоединить одно из устройств от сети и подключить его вновь. Ключ сети можно найти в пакете с Info полем, начинающимся со слов Device Announcement… Открываем данное сообщение и заходим в структуру ZigBee Network Layer Data > ZigBee Security Header. Здесь лежит наш ключ сети.

zigbee network key сниффер

Точно также как и с первым ключом копируем его и вставляем через меню Edit > Preferences > Protocols > ZigBee. Теперь Wireshark может дешифровать сообщения, к примеру, в момент включения света можно получить сообщение, похожее на следующее:

Надеюсь статья была вам полезна, поделитесь ей, если считаете, что она может быть полезна и другим. Если вы интересуетесь разработкой Zigbee устройств, то подписывайтесь на мой канал телеграм, чтобы не пропустить новые статьи.