Packet Sniffing mit Pyspinel

Quellcode auf GitHub ansehen

In dieser Anleitung wird beschrieben, wie Sie Wireshark konfigurieren und Pyspinel ausführen, um Pakete aus einem Thread-Netzwerk zu sniffen.

Informationen zur Verwendung des Wireshark-extcap-Plug-ins für das Paket-Sniffing finden Sie unter Paket-Sniffing mit extcap.

Sniffer-Umgebung einrichten

Führen Sie zuerst die folgenden Schritte aus:

Sniffer erstellen

Erstellen und flashen Sie ein NCP-Gerät, das als Sniffer dient, mithilfe der ot-rcp-Binärausgabe.

Nordic nRF52840

Wenn Sie das Nordic nRF52840-Beispiel als Sniffer verwenden möchten, klonen Sie openthread/ot-nrf528xx und richten Sie die Build-Umgebung ein:

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

Legen Sie die Baudrate auf 460800 fest. Suchen Sie in src/nrf52840/transport-config.h nach der Zeile #define UART_BAUDRATE NRF_UARTE_BAUDRATE_115200 und ersetzen Sie sie durch #define UART_BAUDRATE NRF_UARTE_BAUDRATE_460800.

Erstellen Sie die Binärdatei:

./script/build nrf52840 UART_trans

Wandeln Sie die Binärausgabe von ot-rcp in Hexadezimalzahlen um:

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

Flashen Sie die Datei ot-rcp.hex auf das nRF52840-Board, wie unter nRF52840 flashen beschrieben.

Deaktivieren Sie das Massenspeichergerät (Mass Storage Device, MSD) auf dem nRF52840, um Probleme mit Datenbeschädigungen oder -ausfällen bei der Verwendung des Debug-Ports zu vermeiden:

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.

Thread-Netzwerkeigenschaften

Bevor Sie fortfahren, rufen Sie die folgenden Eigenschaften für das Thread-Netzwerk ab, das Sie sniffen möchten. Sie benötigen sie für die Wireshark-Konfiguration und zum Ausführen des Pyspinel-Sniffers.

Mesh-Lokales Präfix

So rufen Sie das lokale Mesh-Präfix von einem Gerät im Ziel-Thread-Netzwerk ab:

  1. Mit der OpenThread-Befehlszeile:

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

  2. wpanctl mit einem NCP verwenden:

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

  3. Wählen Sie in der OTBR-Web-GUI die Option Status aus. Das lokale Mesh-Präfix wird ähnlich wie wpanctl als IPv6:MeshLocalPrefix aufgeführt.

Kanal

So rufen Sie den Channel von einem Gerät im Ziel-Thread-Netzwerk ab:

  1. Mit der OpenThread-Befehlszeile:

    channel
    15
    

  2. wpanctl mit einem NCP verwenden:

    wpanctl getprop NCP:Channel
    NCP:Channel = 15
    

  3. Wählen Sie in der OTBR-Web-GUI die Option Status aus. Der Kanal wird ähnlich wie wpanctl als NCP:Channel aufgeführt.

Netzwerkschlüssel

Der Thread-Netzwerkschlüssel wird von Wireshark verwendet, um Pakete nach der Erfassung zu entschlüsseln. So rufen Sie den Netzwerkschlüssel von einem Gerät im Ziel-Thread-Netzwerk ab:

  1. Mit der OpenThread-Befehlszeile:

    networkkey
    33334444333344443333444433334444
    

  2. wpanctl mit einem NCP verwenden:

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

Der Thread-Netzwerkschlüssel ist in der OTBR-Web-GUI nicht verfügbar.

Sniffer-Optionen

Optionen
-u or --uart
Standardwert
Keine – muss angegeben werden, wenn Sie ein Gerät mit einer seriellen Verbindung und nicht mit einer Socket-Verbindung verwenden.
Beschreibung
Das Flag -u oder --uart gefolgt von einem Gerätepfad wie /dev/ttyUSB0.
-c or --channel
Standardwert
11
Beschreibung
Das Flag -c oder --channel gefolgt vom Kanal, der in Ihrem Thread-Netzwerk konfiguriert ist und auf dem Pakete gesnifft werden sollen.
--no-reset
Standardwert
Dieses Flag überschreibt das Standardverhalten.
Beschreibung
Das Flag --no-reset ist erforderlich, wenn Ihr NCP-Gerät über die native USB-Verbindung mit dem Host verbunden ist.
--crc
Standardwert
Dieses Flag überschreibt das Standardverhalten.
Beschreibung
Das Flag --crc ist für Plattformen wie TI- und Nordic Semiconductor-Thread-Boards erforderlich. Das Flag berechnet den CRC neu, um eine Warnung „Bad FCS“ (Frame-Prüfzeichenfolge) in Wireshark zu vermeiden.
-b or --baudrate
Standardwert
115200
Beschreibung
Mit dem Flag -b oder --baudrate wird die Standardbaudrate überschrieben. Legen Sie für diesen Wert dieselbe Baudrate fest, die für Ihre NCP-Build verwendet wird (wir empfehlen 460800).
--rssi
Standardwert
Dieses Flag überschreibt das Standardverhalten.
Beschreibung
Mit dem Flag --rssi wird sichergestellt, dass der RSSI in der pcap-Ausgabe enthalten ist. Sie müssen dieses Flag verwenden, wenn die Option TI CC24xx FCS-Format in Wireshark aktiviert ist.
--tap
Standardwert
Dieses Flag überschreibt das Standardverhalten.
Beschreibung
Das Flag --tap gibt DLT_IEEE802_15_4_TAP(283) für das Frame-Format an, mit einem Pseudo-Header, der TLVs mit Metadaten enthält (z. B. FCS, RSSI, LQI, Channel). Wenn nicht angegeben, wird standardmäßig DLT_IEEE802_15_4_WITHFCS(195) mit den zusätzlichen RSSI- und LQI-Werten verwendet, die direkt nach dem PHY-Frame folgen, wie im TI CC24xx-FCS-Format. Sie müssen dieses Flag verwenden, wenn die Option ITU-T CRC-16 in Wireshark aktiviert ist. Wenn diese Option in Wireshark nicht aktiviert ist, verwenden Sie dieses Flag nicht.

Sniffer ausführen

Verwenden Sie den spezifischen Gerätepfad für Ihren NCP und den Kanal für das Thread-Netzwerk, das Sie sniffen möchten.

Wenn Sie dieser Anleitung folgen, sollte das nRF52840 DK über den Debug-Port mit dem Hostcomputer verbunden sein, wie unter nRF52840 flashen beschrieben. Wenn Sie den Pyspinel-Sniffer ausführen möchten, verwenden Sie das Flag -b, um die Baudrate anzugeben (falls sie vom Standardwert geändert wurde), und lassen Sie das Flag --no-reset weg.

Wenn Sie Wireshark so konfigurieren, dass RSSI angezeigt wird, müssen Sie beim Ausführen des Sniffer-Tools auch das Flag --rssi angeben. So sniffen Sie beispielsweise auf Kanal 15 mit einem Gerät, das an /dev/ttyACM0 montiert ist und RSSI in der Wireshark-Ausgabe enthält:

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

Sie sollten jetzt die Pakete und zugehörigen Protokolle für diese Konfiguration in Wireshark sehen können:

Wireshark-Aufzeichnung

Weitere Informationen zum Ausführen des Pyspinel-Sniffers finden Sie in der Spinel-Sniffer-Referenz.

Native USB-Verbindung

Wenn Sie den USB-Port des nRF52840 DK verwenden möchten, muss das OpenThread-ot-rcp-Binärprogramm mit USB_trans erstellt werden:

./script/build nrf52840 USB_trans
Flashen Sie den nRF52840 DK, verbinden Sie ihn über den USB-Port mit dem Hostcomputer und verwenden Sie dann das Flag --no-reset, aber lassen Sie das Flag -b beim Ausführen des Sniffers weg:

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

Ressourcen

Weitere Nordic-Tools finden Sie unter Nordic Semiconductor – Thread-Sniffer auf Basis von nRF52840 mit Wireshark.