Sniffing de paquetes con Pyspinel

Ver código fuente en GitHub

En esta guía, se explica cómo configurar Wireshark y ejecutar Pyspinel para detectar paquetes desde una red Thread.

Si deseas utilizar el complemento extcap de Wireshark para realizar análisis de paquetes, consulta Sniffing de paquetes con extcap.

Configura el entorno de sniffer

Antes de comenzar, completa los siguientes pasos:

Crea el detector

Compila e instala un dispositivo NCP para que funcione como detector con el resultado binario ot-rcp.

NRF52840 de los países nórdicos

Para configurar el ejemplo Nordic nRF52840 para usarlo como detector, clona openthread/ot-nrf528xx y configura el entorno de compilación:

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

Establece la tasa de baudios en 460800. Busca la línea #define UART_BAUDRATE NRF_UARTE_BAUDRATE_115200. en src/nrf52840/transport-config.h y reemplázalo por #define UART_BAUDRATE NRF_UARTE_BAUDRATE_460800.

Compila el objeto binario:

./script/build nrf52840 UART_trans

Convierte el resultado binario ot-rcp en hexadecimal:

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

Escribe el archivo ot-rcp.hex en la memoria flash de la placa nRF52840 como se indica en Escribe el nRF52840 en la memoria flash.

Inhabilita el dispositivo de almacenamiento masivo (MSD) en el nRF52840 para evitar problemas con los datos daños o pérdidas cuando se usa el puerto de depuración:

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.

Propiedades de red de Thread

Antes de continuar, obtén las siguientes propiedades para la red Thread que quieras para oler. Los necesitarás para configurar Wireshark y ejecutar el Pyspinel. o olor.

Prefijo local de malla

Para obtener el prefijo local de malla de un dispositivo en la red Thread de destino, haz lo siguiente:

  1. Con la CLI de OpenThread:

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

  2. Usa wpanctl con un NCP:

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

  3. En la GUI web de OTBR, selecciona Status. Se muestra el prefijo local de malla como IPv6:MeshLocalPrefix es similar a wpanctl.

Canal

Para obtener el canal desde un dispositivo en la red Thread de destino, haz lo siguiente:

  1. Con la CLI de OpenThread:

    channel
    15
    

  2. Usa wpanctl con un NCP:

    wpanctl getprop NCP:Channel
    NCP:Channel = 15
    

  3. En la GUI web de OTBR, selecciona Status. El canal aparece en la lista como NCP:Canal similar a wpanctl.

Clave de red

Wireshark usa la clave de red Thread para desencriptar paquetes para cada captura. Para obtener la clave de red de un dispositivo en la red Thread de destino, haz lo siguiente:

  1. Con la CLI de OpenThread:

    networkkey
    33334444333344443333444433334444
    

  2. Usa wpanctl con un NCP:

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

La clave de red de Thread no está disponible en la GUI web de OTBR.

Opciones de sniffer

Opciones
-u or --uart
Valor predeterminado
Ninguno: Se debe proporcionar si utilizas un dispositivo con una una conexión en serie, no una de socket.
Descripción
La marca -u o --uart seguida de una ruta de acceso de dispositivo, como /dev/ttyUSB0
-c or --channel
Valor predeterminado
11
Descripción
Sigue la marca -c o --channel canal configurado en tu red Thread, después de lo cual para detectar paquetes.
--no-reset
Valor predeterminado
Esta marca anula el comportamiento predeterminado.
Descripción
La marca --no-reset es necesaria si tu NCP El dispositivo está conectado al host con el USB nativo. conexión.
--crc
Valor predeterminado
Esta marca anula el comportamiento predeterminado.
Descripción
La marca --crc es necesaria para plataformas como Placas Thread TI y Nordic Semiconductor. La bandera vuelve a calcular la CRC para evitar un “FCS deficiente” (verificación de marco secuencia) en Wireshark.
-b or --baudrate
Valor predeterminado
115200
Descripción
Se usa la marca -b o --baudrate. para anular la tasa de baudios predeterminada. Establece este valor en el mismo valor tasa de baudios usada con tu NCP build (recomendamos el 460800)
--rssi
Valor predeterminado
Esta marca anula el comportamiento predeterminado.
Descripción
La marca --rssi se usa para garantizar que el RSSI se incluido en el resultado del pcap. Debes usar esta marca si la TI CC24xx FCS format esté habilitada en Wireshark.
--tap
Valor predeterminado
Esta marca anula el comportamiento predeterminado.
Descripción
La marca --tap especifica DLT_IEEE802_15_4_TAP(283) para el formato de fotograma con un seudoencabezado que contenga TLV con metadatos (como FCS, RSSI, LQI y canal). Si no se especifica, DLT_IEEE802_15_4_WITHFCS(195) de forma predeterminada con los RSSI y LQI adicionales que siguen a PHY directamente, como en el formato TI CC24xx FCS. Debes usar esta marca si la ITU-T CRC‐16 esté habilitada en Wireshark. Si esa opción no está habilitada en Wireshark, no uses esta marca.

Ejecuta el detector

Asegúrate de usar la ruta de acceso del dispositivo específica para tu NCP y el canal del Red de Thread que intentas detectar.

Si sigues esta guía, debes conectar el nRF52840 DK a la máquina anfitrión. el puerto de depuración, como se describe en Escribe en la memoria flash el nRF52840. Para ejecutar el detector Pyspinel, Usa la marca -b para especificar la tasa de baudios (si se cambió de la configuración predeterminada). y omite la marca --no-reset.

Si configuras Wireshark para mostrar RSSI, también debes incluir --rssi. cuando ejecutes la herramienta sniffer. Por ejemplo, para husmear en el Canal 15 con un dispositivo activado en /dev/ttyACM0 con RSSI incluido en el resultado de Wireshark:

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

Ahora deberías poder ver los paquetes y los protocolos relacionados para esto. en Wireshark:

Captura de Wireshark

Consulta la herramienta Spinel sniffer referencia de más información sobre cómo ejecutar el detector Pyspinel.

Conexión USB nativa

El uso del puerto USB nRF52840 DK requiere el objeto binario ot-rcp de OpenThread para lo siguiente: Se creará con USB_trans:

./script/build nrf52840 USB_trans
Escribe en la memoria flash el nRF52840 DK, conéctalo a la máquina anfitrión por USB y, luego, usa la marca --no-reset pero omite la marca -b cuando ejecutes el detector:

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

Recursos

Para conocer más herramientas nórdicas, consulta Nordic Semiconductor: Thread Sniffer basado en nRF52840 con Wireshark.