Pyspinel でパケット スニッフィングを行う

GitHub でソースを見る

このガイドでは、Thread ネットワークからパケットを盗聴するように Wireshark を構成し、Pyspinel を実行する方法について説明します。

パケット スニッフィングに Wireshark の extcap プラグインを使用するには、extcap を使用したパケット スニッフィングをご覧ください。

スニッファ環境を設定する

開始する前に、次の手順を行います。

スニッファをビルドする

ot-rcp バイナリ出力を使用して、スニッファとして機能する NCP デバイスをビルドしてフラッシュします。

北欧 nRF52840

スニッファーとして使用する Nordic nRF52840 の例を設定するには、openthread/ot-nrf528xx のクローンを作成し、ビルド環境を設定します。

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

ボーレートを 460800 に設定します。src/nrf52840/transport-config.h#define UART_BAUDRATE NRF_UARTE_BAUDRATE_115200 行を見つけて、#define UART_BAUDRATE NRF_UARTE_BAUDRATE_460800 に置き換えます。

バイナリをビルドします。

./script/build nrf52840 UART_trans

ot-rcp バイナリ出力を 16 進数に変換します。

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

nRF52840 のフラッシュの説明に沿って、ot-rcp.hex ファイルを nRF52840 ボードにフラッシュします。

nRF52840 のマスストレージ デバイス(MSD)を無効にして、デバッグポート使用時のデータの破損やドロップを回避します。

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.

スレッド ネットワーク プロパティ

続行する前に、スニッフィングするスレッド ネットワークの次のプロパティを取得します。これは、Wireshark の構成と Pyspinel スニッファの実行に必要です。

メッシュ ローカル プレフィックス

ターゲット Thread ネットワーク内のデバイスからメッシュ ローカル プレフィックスを取得するには:

  1. OpenThread CLI の使用:

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

  2. wpanctl を NCP に使用する:

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

  3. OTBR ウェブ GUI を使用して、[ステータス] を選択します。メッシュのローカル プレフィックスは、wpanctl と同様に IPv6:MeshLocalPrefix として一覧表示されます。

チャンネル

対象スレッド ネットワークのデバイスからチャンネルを取得するには:

  1. OpenThread CLI の使用:

    channel
    15
    

  2. wpanctl を NCP に使用する:

    wpanctl getprop NCP:Channel
    NCP:Channel = 15
    

  3. OTBR ウェブ GUI を使用して、[ステータス] を選択します。このチャネルは、wpanctl のように NCP:Channel として表示されます。

ネットワーク キー

Thread ネットワークキーは、キャプチャ後にパケットを復号するために Wireshark によって使用されます。ターゲット Thread ネットワーク内のデバイスからネットワーク キーを取得するには:

  1. OpenThread CLI の使用:

    networkkey
    33334444333344443333444433334444
    

  2. wpanctl を NCP に使用する:

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

スレッド ネットワーク キーは、OTBR ウェブ GUI では使用できません。

スニッファ オプション

オプション
-u or --uart
デフォルト値
なし - ソケット接続ではなくシリアル接続でデバイスを使用する場合に指定する必要があります。
説明
-u フラグまたは --uart フラグに続けて、/dev/ttyUSB0 などのデバイスパス。
-c or --channel
デフォルト値
11
説明
-c フラグまたは --channel フラグの後に、Thread ネットワーク上で構成されたチャネルに続けて、パケットをスニッフィングします。
--no-reset
デフォルト値
このフラグは、デフォルトの動作をオーバーライドします。
説明
NCP デバイスがネイティブ USB 接続でホストに接続されている場合は、--no-reset フラグが必要です。
--crc
デフォルト値
このフラグは、デフォルトの動作をオーバーライドします。
説明
--crc フラグは、TI や Nordic Semiconductor のスレッドボードなどのプラットフォームに必要です。このフラグは、Wireshark で「Bad FCS」(フレーム チェック シーケンス)の警告を回避するように CRC を再計算します。
-b or --baudrate
デフォルト値
115,200
説明
デフォルトのボーレートをオーバーライドするには、-b フラグまたは --baudrate フラグを使用します。この値は、NCP ビルドと同じボーレートに設定します(460800 を推奨)。
--rssi
デフォルト値
このフラグは、デフォルトの動作をオーバーライドします。
説明
--rssi フラグは、RSSI が pcap 出力に含まれるようにするために使用されます。Wireshark で TI CC24xx FCS 形式 オプションが有効になっている場合は、このフラグを使用する必要があります。
--tap
デフォルト値
このフラグは、デフォルトの動作をオーバーライドします。
説明
--tap フラグには、フレーム形式の DLT_IEEE802_15_4_TAP(283) を指定します。疑似ヘッダーには、メタデータ(FCS、RSSI、LQI、チャンネルなど)を含む TLV が含まれます。指定しない場合、デフォルトで DLT_IEEE802_15_4_WITHFCS(195) が使用されます。TI CC24xx FCS 形式のように、PHY フレームの直後に追加の RSSI と LQI が含まれます。Wireshark で ITU-T CRC-16 オプションが有効になっている場合は、このフラグを使用する必要があります。Wireshark でこのオプションが有効になっていない場合は、このフラグを使用しないでください。

スニッファを実行する

NCP 用の特定のデバイスパスと、スニッフィングする Thread ネットワークのチャネルを使用してください。

このガイドの手順を行うと、nRF52840 のフラッシュで説明されているように、デバッグポートによって nRF52840 DK をホストマシンに接続する必要があります。Pyspinel スニッファーを実行するには、-b フラグを使用してボーレートを指定します(デフォルトから変更した場合)。--no-reset フラグも省略します。

RSSI を表示するように Wireshark を設定する場合は、スニッファーツールの実行時に --rssi フラグも指定する必要があります。たとえば、Wireshark の出力に含まれる RSSI とともに /dev/ttyACM0 にマウントされたデバイスを使用して、チャンネル 15 でスニッフィングを行うには:

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

これで、この構成のパケットと関連プロトコルを Wireshark に表示できるようになります。

Wireshark のキャプチャ

Pyspinel スニッファの実行方法については、Spinel スニッファ リファレンスをご覧ください。

ネイティブ USB 接続

nRF52840 DK USB ポートを使用するには、OpenThread ot-rcp バイナリを USB_trans でビルドする必要があります。

./script/build nrf52840 USB_trans
nRF52840 DK をフラッシュし、USB ポートでホストマシンに接続してから、--no-reset フラグを使用します。スニッファの実行時に -b フラグを省略します。

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

リソース

その他の北欧ツールについては、Nordic Semiconductor - nRF52840 と Wireshark に基づく Thread スニッファを参照してください。