Análisis 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 usar el complemento de la extensión extcap de Wireshark para detectar paquetes, consulta Detección de paquetes mediante extcap.

Configura el entorno de detección

Antes de comenzar, completa los siguientes pasos:

Compila el detector

Compila e instala un dispositivo NCP para que funcione como el detector, mediante la salida binaria ot-rcp.

nRF 52840 nórdico

A fin de configurar el ejemplo nRF52840 nórdico 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 velocidad en baudios en 460,800. Busca la línea #define UART_BAUDRATE NRF_UARTE_BAUDRATE_115200 en src/nrf52840/transport-config.h y reemplázala por #define UART_BAUDRATE NRF_UARTE_BAUDRATE_460800.

Compila el objeto binario:

./script/build nrf52840 UART_trans

Convierte la salida binaria ot-rcp en hexadecimal:

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

Escribe en la memoria flash el archivo ot-rcp.hex en la placa nRF52840, como se detalla en Flash nRF52840.

Inhabilita el dispositivo de almacenamiento masivo (MSD) en la nRF52840 para evitar problemas con la corrupción o caídas de datos 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 la red Thread

Antes de continuar, obtén las siguientes propiedades de la red Thread que deseas probar. Las necesitarás para la configuración de Wireshark y la ejecución del detector de Pyspinel.

Prefijo local de la malla

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

  1. Mediante 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. Mediante la GUI web de OTBR, selecciona Estado. El prefijo local de malla aparece como IPv6:MeshLocalPrefix similar a wpanctl.

Canal

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

  1. Mediante la CLI de OpenThread:

    channel
    15
    

  2. Usa wpanctl con un NCP:

    wpanctl getprop NCP:Channel
    NCP:Channel = 15
    

  3. Mediante la GUI web de OTBR, selecciona Estado. El canal se muestra como NCP:Channel similar a wpanctl.

Clave de red

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

  1. Mediante 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 detección

Opciones
-u or --uart
Valor predeterminado
Ninguno: se debe proporcionar si usas un dispositivo con una conexión en serie y no con una conexión de socket.
Descripción
Las marcas -u o --uart seguidas de una ruta de acceso del dispositivo, como /dev/ttyUSB0.
-c or --channel
Valor predeterminado
11
Descripción
Las marcas -c o --channel y, luego, el canal configurado en tu red Thread, a la que deben detectarse paquetes
--no-reset
Valor predeterminado
Esta marca anula el comportamiento predeterminado.
Descripción
La marca --no-reset es necesaria si tu dispositivo NCP está conectado al host con la conexión USB nativa.
--crc
Valor predeterminado
Esta marca anula el comportamiento predeterminado.
Descripción
La marca --crc es necesaria para plataformas como TI y placas de Nordic Semiconductor Thread. La marca recalcula la CRC para evitar una advertencia de “FCS malo” (secuencia de verificación de marcos) en Wireshark.
-b or --baudrate
Valor predeterminado
115200
Descripción
Las marcas -b o --baudrate se usan para anular la velocidad en baudios predeterminada. Establece este valor en la misma velocidad en baudios que se usa con tu compilación NCP (recomendamos 460800).
--rssi
Valor predeterminado
Esta marca anula el comportamiento predeterminado.
Descripción
La marca --rssi se usa para garantizar que el RSSI se incluya en el resultado del pcap. Debes usar esta marca si la opción Formato CC24xx FCS de TI 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 marco, con un seudoencabezado que contiene los TLV con metadatos (como FCS, RSSI, LQI, Channel). Si no se especifica, DLT_IEEE802_15_4_WITHFCS(195) se usará de forma predeterminada con RSSI y LQI adicionales, directamente en el marco PHY, como en formato CCS CC24xx de TI. Debes usar esta marca si la opción 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 específica del dispositivo del NCP y el canal de la red Thread que intentas detectar.

Si sigues esta guía, el DK nRF52840 debe conectarse a la máquina anfitrión mediante el puerto de depuración, como se describe en Flash el nRF52840. Para ejecutar el detector de Pyspinel, usa la marca -b a fin de especificar la velocidad en baud (si se cambió desde la opción predeterminada) y omite la marca --no-reset.

Si configuras Wireshark para mostrar RSSI, también debes incluir la marca --rssi cuando ejecutes la herramienta sniffer. Por ejemplo, para detectar 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 con esta configuración en Wireshark:

Captura de Wireshark

Consulta la referencia del detector de spinel para obtener más información sobre cómo ejecutar el detector de Pyspinel.

Conexión USB nativa

El uso del puerto USB nRF52840 DK requiere que el objeto binario ot-rcp de OpenThread se compile con USB_trans:

./script/build nrf52840 USB_trans
Flash el nRF52840 DK, conéctalo a la máquina host por el puerto USB y, luego, usa la marca --no-reset, pero omite la marca -b cuando se ejecuta el detector:

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

Recursos

Para herramientas nórdicas adicionales, consulta Semiconductor nórdico: Thread Sniffer basado en nRF52840 con Wireshark.