Reniflage de paquets avec Pyspinel

Afficher la source sur GitHub

Ce guide explique comment configurer Wireshark et exécuter Pyspinel pour analyser les paquets d'un réseau Thread.

Pour utiliser le plug-in extcap de Wireshark pour la détection des paquets, consultez Détection des paquets à l'aide d'extcap.

Configurer l'environnement du sniffer

Avant de commencer, procédez comme suit:

Créer le sniffer

Créez et flashez un appareil NCP pour qu'il serve de sniffer, à l'aide de la sortie binaire ot-rcp.

Nordic nRF52840

Pour configurer l'exemple Nordic nRF52840 pour l'utiliser comme sniffer, clonez openthread/ot-nrf528xx et configurez l'environnement de compilation:

git clone https://github.com/openthread/ot-nrf528xx --recursive
./script/bootstrap

Définissez la vitesse de transmission sur 460 800. Recherchez la ligne #define UART_BAUDRATE NRF_UARTE_BAUDRATE_115200 dans src/nrf52840/transport-config.h et remplacez-la par #define UART_BAUDRATE NRF_UARTE_BAUDRATE_460800.

Créez le binaire:

./script/build nrf52840 UART_trans

Convertissez la sortie binaire ot-rcp au format hexadécimal:

arm-none-eabi-objcopy -O ihex build/bin/ot-rcp ot-rcp.hex

Flashez le fichier ot-rcp.hex sur la carte nRF52840, comme décrit dans la section Flasher le nRF52840.

Désactivez le dispositif de stockage de masse (MSD) sur le nRF52840 pour éviter les problèmes de corruption ou de perte de données lors de l'utilisation du port de débogage:

expect <<EOF
spawn JLinkExe
expect "J-Link>"
send "msddisable\n"
expect "Probe configured successfully."
exit
EOF
spawn JLinkExe
SEGGER J-Link Commander V6.42b (Compiled Feb  5 2019 17:35:31)
DLL version V6.42b, compiled Feb  5 2019 17:35:20
 
Connecting to J-Link via USB...O.K.
Firmware: J-Link OB-SAM3U128-V2-NordicSemi compiled Jan  7 2019 14:07:15
Hardware version: V1.00
S/N: 683411111
VTref=3.300V
 
Type "connect" to establish a target connection, '?' for help
J-Link>msddisable
Probe configured successfully.

Propriétés du réseau Thread

Avant de continuer, obtenez les propriétés suivantes pour le réseau Thread que vous souhaitez renifler. Vous en aurez besoin pour la configuration de Wireshark et l'exécution du sniffer Pyspinel.

Préfixe local du réseau maillé

Pour obtenir le préfixe local de maillage à partir d'un appareil du réseau Thread cible:

  1. À l'aide de la CLI OpenThread :

    dataset active
    Mesh Local Prefix: fd33:3333:3344:0/64
    

  2. Utiliser wpanctl avec un NCP :

    wpanctl getprop IPv6:MeshLocalPrefix
    IPv6:MeshLocalPrefix = "fd33:3333:3344:0::/64"
    

  3. Dans l'IUG Web de l'OTBR, sélectionnez État. Le préfixe local du réseau maillé est listé sous la forme IPv6:MeshLocalPrefix, semblable à wpanctl.

Chaîne

Pour obtenir le canal à partir d'un appareil du réseau Thread cible:

  1. À l'aide de la CLI OpenThread :

    channel
    15
    

  2. Utiliser wpanctl avec un NCP :

    wpanctl getprop NCP:Channel
    NCP:Channel = 15
    

  3. Dans l'IUG Web de l'OTBR, sélectionnez État. La chaîne est listée comme NCP:Channel, comme wpanctl.

Clé réseau

La clé réseau Thread est utilisée par Wireshark pour déchiffrer les paquets après la capture. Pour obtenir la clé de réseau à partir d'un appareil du réseau Thread cible:

  1. À l'aide de la CLI OpenThread :

    networkkey
    33334444333344443333444433334444
    

  2. Utiliser wpanctl avec un NCP :

    wpanctl getprop Network:Key
    Network:Key = [33334444333344443333444433334444]
    

La clé de réseau Thread n'est pas disponible dans l'IUG Web de l'OTBR.

Options du sniffeur

Options
-u or --uart
Valeur par défaut
Aucun : doit être fourni si vous utilisez un appareil avec une connexion série et non une connexion socket.
Description
L'indicateur -u ou --uart suivi d'un chemin d'accès à l'appareil tel que /dev/ttyUSB0.
-c or --channel
Valeur par défaut
11
Description
L'indicateur -c ou --channel, suivi du canal configuré sur votre réseau Thread sur lequel sniffer les paquets.
--no-reset
Valeur par défaut
Cette option remplace le comportement par défaut.
Description
L'indicateur --no-reset est nécessaire si votre appareil NCP est connecté à l'hôte via la connexion USB native.
--crc
Valeur par défaut
Cette option remplace le comportement par défaut.
Description
L'indicateur --crc est nécessaire pour les plates-formes telles que les cartes Thread de TI et Nordic Semiconductor. L'indicateur recalcule le CRC pour éviter un avertissement "Bad FCS" (mauvaise séquence de contrôle de trame) dans Wireshark.
-b or --baudrate
Valeur par défaut
115200
Description
L'indicateur -b ou --baudrate permet de remplacer le débit en bauds par défaut. Définissez cette valeur sur la même vitesse de transmission que celle utilisée avec votre build du contrôleur de réseau (nous vous recommandons de choisir 460800).
--rssi
Valeur par défaut
Cette option remplace le comportement par défaut.
Description
L'indicateur --rssi permet de s'assurer que le RSSI est inclus dans la sortie pcap. Vous devez utiliser cet indicateur si l'option TI CC24xx FCS format (Format de FCS TI CC24xx) est activée dans Wireshark.
--tap
Valeur par défaut
Cette option remplace le comportement par défaut.
Description
L'indicateur --tap spécifie DLT_IEEE802_15_4_TAP(283) pour le format de trame, avec un pseudo-en-tête contenant des TLV avec des métadonnées (telles que FCS, RSSI, LQI, Channel). Si cette option n'est pas spécifiée, DLT_IEEE802_15_4_WITHFCS(195) est utilisé par défaut avec les RSSI et LQI supplémentaires qui suivent directement le frame PHY, comme dans le format FCS TI CC24xx. Vous devez utiliser cette option si l'option ITU-T CRC-16 est activée dans Wireshark. Si cette option n'est pas activée dans Wireshark, n'utilisez pas cet indicateur.

Exécuter le sniffer

Veillez à utiliser le chemin d'accès spécifique à votre NCP et le canal du réseau Thread que vous essayez d'analyser.

Si vous suivez ce guide, le DK nRF52840 doit être connecté à la machine hôte via le port de débogage, comme décrit dans la section Flasher le nRF52840. Pour exécuter le sniffer Pyspinel, utilisez l'option -b pour spécifier le débit en bauds (s'il a été modifié par rapport à la valeur par défaut) et omettez l'option --no-reset.

Si vous configurez Wireshark pour afficher le RSSI, vous devez également inclure l'indicateur --rssi lorsque vous exécutez l'outil d'analyseur de paquets. Par exemple, pour renifler sur le canal 15 à l'aide d'un appareil monté sur /dev/ttyACM0 avec RSSI inclus dans la sortie Wireshark:

cd path-to-pyspinel
python sniffer.py -c 15 -u /dev/ttyACM0 --crc --rssi -b 460800 | wireshark -k -i -

Vous devriez maintenant pouvoir afficher les paquets et les protocoles associés à cette configuration dans Wireshark:

Capture Wireshark

Pour en savoir plus sur l'exécution du sniffeur Pyspinel, consultez la documentation de référence du sniffeur Spinel.

Connexion USB native

L'utilisation du port USB du nRF52840 DK nécessite la compilation du binaire ot-rcp OpenThread avec USB_trans :

./script/build nrf52840 USB_trans
Flashez le nRF52840 DK, connectez-le à la machine hôte via le port USB, puis utilisez l'indicateur --no-reset, mais omettez l'indicateur -b lorsque vous exécutez le sniffer:

python sniffer.py -c 15 -u /dev/ttyACM0 --crc --no-reset --rssi | wireshark -k -i -

Ressources

Pour en savoir plus sur les outils Nordic, consultez Nordic Semiconductor : analyseur de protocole Thread basé sur nRF52840 avec Wireshark.