पिस्पिनल के साथ पैकेट स्निफ़िंग

GitHub पर सोर्स देखें

इस गाइड में, Wireshark को कॉन्फ़िगर करने और Thread नेटवर्क से पैकेट को स्निफ़ करने के लिए Pyspinel को चलाने का तरीका बताया गया है.

पैकेट स्निफ़िंग के लिए Wireshark extcap प्लग इन का इस्तेमाल करने के लिए, extcap का इस्तेमाल करके पैकेट स्निफ़िंग लेख पढ़ें.

स्निफ़र एनवायरमेंट सेट अप करना

शुरू करने से पहले, यह तरीका अपनाएं:

स्निफ़र बनाना

ot-rcp बाइनरी आउटपुट का इस्तेमाल करके, एक एनसीपी डिवाइस बनाएं और उसे फ़्लैश करें, ताकि वह स्निफ़र के तौर पर काम कर सके.

Nordic 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 बाइनरी आउटपुट को हेक्स में बदलें:

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

ot-rcp.hex फ़ाइल को nRF52840 बोर्ड पर फ़्लैश करें. इसके लिए, 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.

Thread नेटवर्क की प्रॉपर्टी

जारी रखने से पहले, उस थ्रेड नेटवर्क के लिए ये प्रॉपर्टी पाएं जिसे आपको स्निफ करना है. आपको Wireshark कॉन्फ़िगरेशन और Pyspinel sniffer को चलाने के लिए, इनकी ज़रूरत पड़ेगी.

मेश लोकल प्रीफ़िक्स

टारगेट किए गए Thread नेटवर्क में किसी डिवाइस से मेश लोकल प्रीफ़िक्स पाने के लिए:

  1. OpenThread सीएलआई का इस्तेमाल करके:

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

  2. एनसीपी के साथ wpanctl का इस्तेमाल करना:

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

  3. OTBR वेब जीयूआई का इस्तेमाल करके, स्टेटस चुनें. मेश लोकल प्रीफ़िक्स को wpanctl की तरह ही, IPv6:MeshLocalPrefix के तौर पर सूची में शामिल किया गया है.

चैनल

टारगेट किए गए Thread नेटवर्क में मौजूद किसी डिवाइस से चैनल पाने के लिए:

  1. OpenThread सीएलआई का इस्तेमाल करके:

    channel
    15
    

  2. एनसीपी के साथ wpanctl का इस्तेमाल करना:

    wpanctl getprop NCP:Channel
    NCP:Channel = 15
    

  3. OTBR वेब जीयूआई का इस्तेमाल करके, स्टेटस चुनें. चैनल को wpanctl की तरह ही, सूची में NCP:Channel के तौर पर दिखाया गया है.

नेटवर्क कुंजी

Wireshark, कैप्चर करने के बाद पैकेट को डिक्रिप्ट करने के लिए, Thread नेटवर्क पासकोड का इस्तेमाल करता है. टारगेट किए गए Thread नेटवर्क में मौजूद किसी डिवाइस से नेटवर्क पासकोड पाने के लिए:

  1. OpenThread सीएलआई का इस्तेमाल करके:

    networkkey
    33334444333344443333444433334444
    

  2. एनसीपी के साथ wpanctl का इस्तेमाल करना:

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

OTBR वेब जीयूआई में, थ्रेड नेटवर्क पासकोड उपलब्ध नहीं है.

स्निफ़र के विकल्प

विकल्प
-u or --uart
डिफ़ॉल्ट वैल्यू
कोई नहीं - अगर किसी डिवाइस का इस्तेमाल सीरियल कनेक्शन के साथ किया जा रहा है, तो यह जानकारी देना ज़रूरी है.
जानकारी
-u या --uart फ़्लैग के बाद, डिवाइस का पाथ, जैसे कि /dev/ttyUSB0.
-c or --channel
डिफ़ॉल्ट वैल्यू
11
जानकारी
-c या --channel फ़्लैग के बाद, आपके थ्रेड नेटवर्क पर कॉन्फ़िगर किया गया चैनल, जिस पर पैकेट को स्निफ़ करना है.
--no-reset
डिफ़ॉल्ट वैल्यू
यह फ़्लैग, डिफ़ॉल्ट व्यवहार को बदल देता है.
जानकारी
अगर आपका एनसीपी डिवाइस, होस्ट से नेटिव यूएसबी कनेक्शन से कनेक्ट है, तो --no-reset फ़्लैग की ज़रूरत होती है.
--crc
डिफ़ॉल्ट वैल्यू
यह फ़्लैग, डिफ़ॉल्ट व्यवहार को बदल देता है.
जानकारी
--crc फ़्लैग, TI और Nordic Semiconductor Thread बोर्ड जैसे प्लैटफ़ॉर्म के लिए ज़रूरी है. यह फ़्लैग, Wireshark में 'खराब एफ़सीएस' (फ़्रेम की जांच का क्रम) चेतावनी से बचने के लिए, सीआरसी की फिर से गिनती करता है.
-b or --baudrate
डिफ़ॉल्ट वैल्यू
115200
जानकारी
-b या --baudrate फ़्लैग का इस्तेमाल, डिफ़ॉल्ट बाउड रेट को बदलने के लिए किया जाता है. इस वैल्यू को उसी Baud rate पर सेट करें जिसका इस्तेमाल आपके NCP बिल्ड के साथ किया गया है. हमारा सुझाव है कि आप इसे 460800 पर सेट करें.
--rssi
डिफ़ॉल्ट वैल्यू
यह फ़्लैग, डिफ़ॉल्ट व्यवहार को बदल देता है.
जानकारी
--rssi फ़्लैग का इस्तेमाल, यह पक्का करने के लिए किया जाता है कि आरएसएसआई को pcap आउटपुट में शामिल किया गया हो. अगर Wireshark में TI CC24xx एफ़सीएस फ़ॉर्मैट विकल्प चालू है, तो आपको इस फ़्लैग का इस्तेमाल करना होगा.
--tap
डिफ़ॉल्ट वैल्यू
यह फ़्लैग, डिफ़ॉल्ट व्यवहार को बदल देता है.
जानकारी
--tap फ़्लैग, फ़्रेम फ़ॉर्मैट के लिए DLT_IEEE802_15_4_TAP(283) की जानकारी देता है. इसमें एक स्यूडो-हेडर होता है, जिसमें मेटाडेटा (जैसे कि FCS, RSSI, LQI, चैनल) के साथ टीएलवी होते हैं. अगर इसकी जानकारी नहीं दी जाती है, तो DLT_IEEE802_15_4_WITHFCS(195) का इस्तेमाल डिफ़ॉल्ट रूप से, PHY फ़्रेम के बाद अतिरिक्त आरएसएसआई और एलक्यूआई के साथ किया जाएगा. जैसे, TI CC24xx एफ़सीएस फ़ॉर्मैट में. अगर Wireshark में ITU-T CRC-16 विकल्प चालू है, तो आपको इस फ़्लैग का इस्तेमाल करना होगा. अगर Wireshark में यह विकल्प चालू नहीं है, तो इस फ़्लैग का इस्तेमाल न करें.

स्निफ़र चलाना

पक्का करें कि आपने अपने एनसीपी के लिए डिवाइस के खास पाथ और उस Thread नेटवर्क के चैनल का इस्तेमाल किया हो जिसे आपको स्निफ़ करना है.

इस गाइड का पालन करते समय, nRF52840 DK को होस्ट मशीन से डिबग पोर्ट के ज़रिए अटैच किया जाना चाहिए. इस बारे में nRF52840 को फ़्लैश करना में बताया गया है. Pyspinel sniffer को चलाने के लिए, Baud rate (अगर इसे डिफ़ॉल्ट से बदला गया है) बताने के लिए -b फ़्लैग का इस्तेमाल करें और --no-reset फ़्लैग को हटाएं.

अगर आरएसएसआई दिखाने के लिए Wireshark को कॉन्फ़िगर किया जाता है, तो आपको स्निफ़र टूल चलाते समय --rssi फ़्लैग भी शामिल करना होगा. उदाहरण के लिए, /dev/ttyACM0 पर माउंट किए गए डिवाइस का इस्तेमाल करके, चैनल 15 पर स्निफ़ करने के लिए, Wireshark के आउटपुट में आरएसएसआई शामिल करें:

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

अब आपको Wireshark में इस कॉन्फ़िगरेशन के लिए पैकेट और उससे जुड़े प्रोटोकॉल दिखने चाहिए:

Wireshark कैप्चर

Pyspinel sniffer को चलाने के बारे में ज़्यादा जानकारी के लिए, Spinel sniffer के रेफ़रंस देखें.

नेटिव यूएसबी कनेक्शन

nRF52840 DK के यूएसबी पोर्ट का इस्तेमाल करने के लिए, OpenThread ot-rcp बाइनरी को USB_trans के साथ बनाया जाना चाहिए:

./script/build nrf52840 USB_trans
nRF52840 DK को फ़्लैश करें, उसे यूएसबी पोर्ट से होस्ट मशीन से कनेक्ट करें. इसके बाद, --no-reset फ़्लैग का इस्तेमाल करें, लेकिन स्निफ़र चलाते समय -b फ़्लैग को हटाएं:

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

संसाधन

Nordic के अन्य टूल के बारे में जानने के लिए, Nordic Semiconductor — Wireshark के साथ nRF52840 पर आधारित Thread sniffer लेख पढ़ें.