การดมแพ็กเก็ตด้วย Pyspinel

ดูซอร์สโค้ดใน GitHub

คู่มือนี้ครอบคลุมวิธีกำหนดค่า Wireshark และเรียกใช้ Pyspinel เพื่อสนิฟแพ็กเก็ตจากเครือข่ายเทรด

หากต้องการใช้ปลั๊กอิน extcap ของ Wireshark เพื่อตรวจหาแพ็กเก็ต โปรดดูการตรวจหาแพ็กเก็ตโดยใช้ extcap

ตั้งค่าสภาพแวดล้อมของโปรแกรมสนิฟเฟอร์

ก่อนเริ่มต้น ให้ทำตามขั้นตอนต่อไปนี้

สร้างโปรแกรมสนิฟเฟอร์

สร้างและแฟลชอุปกรณ์ NCP เพื่อใช้เป็น Sniffer โดยใช้เอาต์พุตไบนารี ot-rcp

Nordic nRF52840

หากต้องการตั้งค่าตัวอย่าง Nordic nRF52840 เพื่อใช้เป็น Sniffer ให้ทําการโคลน openthread/ot-nrf528xxและตั้งค่าสภาพแวดล้อมการสร้างดังนี้

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

ตั้งค่าอัตราบอดเป็น 460800 ค้นหาบรรทัด #define UART_BAUDRATE NRF_UARTE_BAUDRATE_115200 ใน src/nrf52840/transport-config.h แล้วแทนที่ด้วย #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

แฟลชไฟล์ ot-rcp.hex ไปยังบอร์ด nRF52840 ตามรายละเอียดในหัวข้อแฟลช nRF52840

ปิดใช้อุปกรณ์เก็บข้อมูลขนาดใหญ่ (MSD) ใน nRF52840 เพื่อหลีกเลี่ยงปัญหาการสูญเสียหรือความเสียหายของข้อมูลเมื่อใช้พอร์ตแก้ไขข้อบกพร่อง โดยทำดังนี้

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

Prefix ของ Mesh ในพื้นที่

วิธีรับ Mesh Local Prefix จากอุปกรณ์ในเครือข่ายเทรดเป้าหมาย

  1. การใช้ CLI ของ OpenThread

    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. เลือกสถานะโดยใช้ GUI ของเว็บ OTBR คำนำหน้า Mesh Local จะแสดงเป็น IPv6:MeshLocalPrefix ซึ่งคล้ายกับ wpanctl

ช่อง

วิธีรับแชแนลจากอุปกรณ์ในเครือข่ายเทรดเป้าหมาย

  1. การใช้ CLI ของ OpenThread

    channel
    15
    

  2. การใช้ wpanctl กับ NCP

    wpanctl getprop NCP:Channel
    NCP:Channel = 15
    

  3. เลือกสถานะโดยใช้ GUI ของเว็บ OTBR ช่องแสดงเป็น NCP:Channel คล้ายกับ wpanctl

คีย์เครือข่าย

Wireshark จะใช้คีย์เครือข่ายเทรดเพื่อถอดรหัสแพ็กเก็ตหลังจากบันทึก วิธีรับคีย์เครือข่ายจากอุปกรณ์ในเครือข่ายเทรดเป้าหมาย

  1. การใช้ CLI ของ OpenThread

    networkkey
    33334444333344443333444433334444
    

  2. การใช้ wpanctl กับ NCP

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

รหัสเครือข่ายเทรดไม่พร้อมใช้งานใน GUI ของเว็บ OTBR

ตัวเลือกเครื่องมือวิเคราะห์แพ็กเก็ต

ตัวเลือก
-u or --uart
ค่าเริ่มต้น
ไม่มี - ต้องระบุหากใช้อุปกรณ์ที่มีการเชื่อมต่อซีเรียล ไม่ใช่การเชื่อมต่อซ็อกเก็ต
คำอธิบาย
Flag -u หรือ --uart ตามด้วยเส้นทางอุปกรณ์ เช่น /dev/ttyUSB0
-c or --channel
ค่าเริ่มต้น
11
คำอธิบาย
Flag -c หรือ --channel ตามด้วยแชแนลที่กําหนดค่าไว้ในเครือข่ายเทรดที่จะสํารวจแพ็กเก็ต
--no-reset
ค่าเริ่มต้น
Flag นี้จะลบล้างลักษณะการทำงานเริ่มต้น
คำอธิบาย
ต้องมี Flag --no-reset หากอุปกรณ์ NCP เชื่อมต่อกับโฮสต์ด้วยการเชื่อมต่อ USB ดั้งเดิม
--crc
ค่าเริ่มต้น
Flag นี้จะลบล้างลักษณะการทำงานเริ่มต้น
คำอธิบาย
ต้องใช้ Flag --crc สำหรับแพลตฟอร์ม เช่น TI และบอร์ด Thread ของ Nordic Semiconductor โดยระบบจะคำนวณ CRC อีกครั้งเพื่อหลีกเลี่ยงคำเตือน "FCS ไม่ถูกต้อง" (ลำดับการตรวจสอบเฟรม) ใน Wireshark
-b or --baudrate
ค่าเริ่มต้น
115200
คำอธิบาย
ใช้แฟล็ก -b หรือ --baudrate เพื่อลบล้างอัตราบอดเริ่มต้น ตั้งค่านี้เป็นอัตราบอดเดียวกันกับที่ใช้กับบิลด์ NCP (เราขอแนะนําให้ใช้ 460800)
--rssi
ค่าเริ่มต้น
Flag นี้จะลบล้างลักษณะการทำงานเริ่มต้น
คำอธิบาย
ใช้ Flag --rssi เพื่อให้แน่ใจว่า RSSI จะรวมอยู่ในเอาต์พุต pcap คุณต้องใช้ Flag นี้หากเปิดใช้ตัวเลือกรูปแบบ FCS ของ TI CC24xx ใน Wireshark
--tap
ค่าเริ่มต้น
Flag นี้จะลบล้างลักษณะการทำงานเริ่มต้น
คำอธิบาย
Flag --tap จะระบุ DLT_IEEE802_15_4_TAP(283) สำหรับรูปแบบเฟรม โดยมีส่วนหัวจำลองที่มี TLV พร้อมข้อมูลเมตา (เช่น FCS, RSSI, LQI, Channel) หากไม่ได้ระบุ ระบบจะใช้ DLT_IEEE802_15_4_WITHFCS(195) โดยค่าเริ่มต้นพร้อม RSSI และ LQI เพิ่มเติมตามเฟรม PHY โดยตรง ดังในรูปแบบ FCS ของ TI CC24xx คุณต้องใช้ Flag นี้หากเปิดใช้ตัวเลือก ITU-T CRC-16 ใน Wireshark หากไม่ได้เปิดใช้ตัวเลือกดังกล่าวใน Wireshark อย่าใช้ Flag นี้

เรียกใช้โปรแกรมวิเคราะห์แพ็กเก็ต

ตรวจสอบว่าคุณใช้เส้นทางอุปกรณ์ที่เฉพาะเจาะจงสำหรับ NCP และช่องสำหรับเครือข่ายเทรดที่คุณพยายามสนิฟ

หากทำตามคำแนะนำนี้ คุณควรต่อ nRF52840 DK เข้ากับเครื่องโฮสต์ผ่านพอร์ตแก้ไขข้อบกพร่อง ตามที่อธิบายไว้ในแฟลช nRF52840 หากต้องการเรียกใช้โปรแกรมสนิฟเฟอร์ Pyspinel ให้ใช้ Flag -b เพื่อระบุอัตราบอด (หากมีการเปลี่ยนแปลงจากค่าเริ่มต้น) และละเว้น Flag --no-reset

หากกำหนดค่า Wireshark ให้แสดง RSSI คุณต้องใส่ Flag --rssi ด้วยเมื่อเรียกใช้เครื่องมือสนิฟเฟอร์ ตัวอย่างเช่น หากต้องการสนิฟในช่อง 15 โดยใช้อุปกรณ์ที่ติดตั้งที่ /dev/ttyACM0 โดยมี RSSI รวมอยู่ในเอาต์พุตของ Wireshark ให้ทำดังนี้

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

ตอนนี้คุณควรดูแพ็กเก็ตและโปรโตคอลที่เกี่ยวข้องสำหรับการกำหนดค่านี้ได้ใน Wireshark

การจับภาพ Wireshark

ดูข้อมูลเพิ่มเติมเกี่ยวกับการเรียกใช้โปรแกรมสนิฟเตอร์ Pyspinel ได้ในข้อมูลอ้างอิงเกี่ยวกับโปรแกรมสนิฟเตอร์ Spinel

การเชื่อมต่อ USB โดยตรง

การใช้พอร์ต USB ของ nRF52840 DK กำหนดให้ต้องสร้างไบนารี ot-rcp ของ OpenThread ด้วย USB_trans ดังนี้

./script/build nrf52840 USB_trans
แฟลช nRF52840 DK, เชื่อมต่อกับเครื่องโฮสต์ผ่านพอร์ต USB จากนั้นใช้ Flag --no-reset แต่ไม่ต้องใส่ Flag -b เมื่อเรียกใช้โปรแกรมสนิฟเฟอร์

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

แหล่งข้อมูล

ดูเครื่องมืออื่นๆ ของ Nordic ได้ที่ Nordic Semiconductor — Thread Sniffer based on nRF52840 with Wireshark