Sniffing dei pacchetti con Pispinel

Visualizza il codice sorgente su GitHub

Questa guida spiega come configurare Wireshark ed eseguire Pyspinel per sniffare i pacchetti da una rete Thread.

Per utilizzare il plug-in extcap di Wireshark per l'analisi dei pacchetti, consulta Analisi dei pacchetti con extcap.

Configura l'ambiente dello sniffer

Prima di iniziare, completa i seguenti passaggi:

Crea lo sniffer

Compila e esegui il flashing di un dispositivo NCP da utilizzare come sniffer utilizzando l'output binario ot-rcp.

Nordic nRF52840

Per configurare l'esempio Nordic nRF52840 per l'utilizzo come sniffer, clona openthread/ot-nrf528xx e configura l'ambiente di compilazione:

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

Imposta la velocità in baud su 460800. Trova la riga #define UART_BAUDRATE NRF_UARTE_BAUDRATE_115200 in src/nrf52840/transport-config.h e sostituiscila con #define UART_BAUDRATE NRF_UARTE_BAUDRATE_460800.

Crea il file binario:

./script/build nrf52840 UART_trans

Converti l'output binario ot-rcp in esadecimale:

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

Esegui il flashing del file ot-rcp.hex sulla scheda nRF52840 come descritto in Eseguire il flashing del nRF52840.

Disattiva il dispositivo di archiviazione di massa (MSD) su nRF52840 per evitare problemi di corruzione o perdita di dati quando utilizzi la porta di debug:

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.

Proprietà della rete Thread

Prima di continuare, ottieni le seguenti proprietà per la rete Thread che vuoi sniffare. Ti serviranno per la configurazione di Wireshark e per l'esecuzione dello sniffer Pyspinel.

Prefisso locale mesh

Per ottenere il prefisso locale mesh da un dispositivo nella rete Thread di destinazione:

  1. Utilizzo dell'interfaccia a riga di comando OpenThread:

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

  2. Utilizzo di wpanctl con un NCP:

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

  3. Utilizzando la GUI web OTBR, seleziona Stato. Il prefisso locale del mesh è indicato come IPv6:MeshLocalPrefix, in modo simile a wpanctl.

Canale

Per ottenere il canale da un dispositivo nella rete Thread di destinazione:

  1. Utilizzo dell'interfaccia a riga di comando OpenThread:

    channel
    15
    

  2. Utilizzo di wpanctl con un NCP:

    wpanctl getprop NCP:Channel
    NCP:Channel = 15
    

  3. Utilizzando la GUI web OTBR, seleziona Stato. Il canale è indicato come NCP:Channel, in modo simile a wpanctl.

Chiave di rete

La chiave di rete Thread viene utilizzata da Wireshark per decriptare i pacchetti dopo la cattura. Per ottenere la chiave di rete da un dispositivo nella rete Thread di destinazione:

  1. Utilizzo dell'interfaccia a riga di comando OpenThread:

    networkkey
    33334444333344443333444433334444
    

  2. Utilizzo di wpanctl con un NCP:

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

La chiave di rete Thread non è disponibile nella GUI web OTBR.

Opzioni di sniffer

Opzioni
-u or --uart
Valore predefinito
Nessuno: deve essere fornito se utilizzi un dispositivo con una connessione seriale e non una connessione a socket.
Descrizione
Il flag -u o --uart seguito da un percorso del dispositivo come /dev/ttyUSB0.
-c or --channel
Valore predefinito
11
Descrizione
Il flag -c o --channel seguito dal canale configurato sulla rete Thread su cui eseguire lo sniffing dei pacchetti.
--no-reset
Valore predefinito
Questo flag sostituisce il comportamento predefinito.
Descrizione
Il flag --no-reset è necessario se il dispositivo NCP è collegato all'host con la connessione USB nativa.
--crc
Valore predefinito
Questo flag sostituisce il comportamento predefinito.
Descrizione
Il flag --crc è necessario per piattaforme come le schede Thread di TI e Nordic Semiconductor. Il flag rielabora il CRC per evitare un avviso "Bad FCS" (frame check sequence) in Wireshark.
-b or --baudrate
Valore predefinito
115200
Descrizione
Il flag -b o --baudrate viene utilizzato per sostituire la velocità in baud predefinita. Imposta questo valore sulla stessa velocità in baud utilizzata con la build NCP (consigliamo 460800).
--rssi
Valore predefinito
Questo flag sostituisce il comportamento predefinito.
Descrizione
Il flag --rssi viene utilizzato per assicurarsi che l'RSSI sia incluso nell'output pcap. Devi utilizzare questo flag se l'opzione Formato FCS TI CC24xx è attivata in Wireshark.
--tap
Valore predefinito
Questo flag sostituisce il comportamento predefinito.
Descrizione
Il flag --tap specifica DLT_IEEE802_15_4_TAP(283) per il formato del frame, con uno pseudo-intestazione contenente TLV con metadati (ad esempio FCS, RSSI, LQI, Channel). Se non specificato, per impostazione predefinita viene utilizzato DLT_IEEE802_15_4_WITHFCS(195) con gli indicatori RSSI e LQI aggiuntivi che seguono direttamente il frame PHY, come nel formato FCS di TI CC24xx. Devi utilizzare questo flag se l'opzione ITU-T CRC-16 è attivata in Wireshark. Se questa opzione non è attivata in Wireshark, non utilizzare questo flag.

Esegui lo sniffer

Assicurati di utilizzare il percorso del dispositivo specifico per il tuo NCP e il canale per la rete Thread che stai tentando di sniffare.

Se segui questa guida, il kit di sviluppo nRF52840 deve essere collegato alla macchina host tramite la porta di debug, come descritto in Eseguire il flashing del chip nRF52840. Per eseguire lo sniffer Pyspinel, utilizza il flag -b per specificare la velocità in baud (se è stata modificata rispetto al valore predefinito) e ometti il flag --no-reset.

Se configuri Wireshark per visualizzare l'RSSI, devi includere anche il flag --rssi quando esegui lo strumento di sniffing. Ad esempio, per eseguire lo sniffing sul canale 15 utilizzando un dispositivo montato a /dev/ttyACM0 con RSSI incluso nell'output di Wireshark:

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

Ora dovresti essere in grado di visualizzare i pacchetti e i protocolli correlati per questa configurazione in Wireshark:

Acquisizione Wireshark

Per ulteriori informazioni sull'esecuzione dello sniffer Pyspinel, consulta la documentazione di riferimento dello sniffer Spinel.

Connessione USB nativa

L'utilizzo della porta USB del DK nRF52840 richiede che il codice binario OpenThread ot-rcp sia compilato con USB_trans:

./script/build nrf52840 USB_trans
Esegui il flashing del DK nRF52840, collegalo alla macchina host tramite la porta USB, quindi utilizza il flag --no-reset, ma ometti il flag -b quando esegui lo sniffer:

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

Risorse

Per altri strumenti Nordic, consulta Nordic Semiconductor - Thread Sniffer basato su nRF52840 con Wireshark.