
Resolvable Private Address (RPA) समाधान हेतु Identity Resolving Keys (IRKs) का उपयोग करने वाला Bluetooth Low Energy (BLE) स्कैनर
उन्नत रिज़ॉल्वेबल प्राइवेट एड्रेस (RPA) रिज़ॉल्यूशन के साथ एक ब्लूटूथ लो एनर्जी (BLE) स्कैनर। आस-पास के BLE डिवाइसों को खोजें, MAC एड्रेस द्वारा किसी विशेष डिवाइस को ट्रैक करें, या आइडेंटिटी रिज़ॉल्विंग की (IRK) का उपयोग करके प्राइवेसी-रैंडमाइज़्ड एड्रेस को रिज़ॉल्व करें।
लेखक: डेविड कैनेडी (@HackingDave) कंपनी: TrustedSec
-o - समर्थित है)GPS स्थान स्टैम्पिंग के लिए कनेक्टेड GPS रिसीवर के साथ चल रहे gpsd डेमन की आवश्यकता होती है। यदि gpsd नहीं चल रहा है, तो btrpa-scan GPS के बिना सामान्य रूप से कार्य करता रहता है।
gpsd काम कर रहा है यह सत्यापित करने के लिए:
# जाँचें कि gpsd सुन रहा है
gpspipe -w -n 5
# या कर्सेस मॉनिटर का उपयोग करें
cgps
यह प्रोजेक्ट pyproject.toml (PEP 621) — आधुनिक Python पैकेजिंग मानक का उपयोग करता है। यह प्रोजेक्ट को पंजीकृत CLI कमांड के साथ एक इंस्टॉल करने योग्य पैकेज के रूप में परिभाषित करता है — .py फ़ाइलों को सीधे चलाने की आवश्यकता नहीं है।
uvx btrpa-scan --all
uvx --from git+https://github.com/hackingdave/btrpa-scan.git btrpa-scan --all
uv tool install btrpa-scan
या सीधे GitHub से:
uv tool install git+https://github.com/hackingdave/btrpa-scan.git
pip install btrpa-scan
GUI समर्थन के लिए (Flask-आधारित रडार इंटरफ़ेस):
pip install btrpa-scan[gui]
git clone https://github.com/hackingdave/btrpa-scan.git
cd btrpa-scan
pip install .
usage: btrpa-scan [-h] [-a] [--irk HEX] [--irk-file PATH] [-t TIMEOUT]
[--output {csv,json,jsonl}] [-o FILE] [--log FILE]
[-v | -q] [--min-rssi DBM] [--rssi-window N] [--active]
[--environment {free_space,indoor,outdoor}]
[--ref-rssi DBM] [--name-filter PATTERN]
[--alert-within METERS] [--tui] [--gui] [--gui-port PORT]
[--no-gps] [--adapters LIST] [mac]
BLE स्कैनर — सभी डिवाइस खोजें या किसी विशेष की खोज करें
positional arguments:
mac खोजने के लिए लक्षित MAC एड्रेस (सभी स्कैन करने के लिए छोड़ दें)
optional arguments:
-h, --help यह सहायता संदेश दिखाएँ और बाहर निकलें
-a, --all सभी प्रसारण करने वाले डिवाइसों के लिए स्कैन करें
--irk HEX इस आइडेंटिटी रिज़ॉल्विंग की का उपयोग करके RPA रिज़ॉल्व करें (32 हेक्स वर्ण)
--irk-file PATH फ़ाइल से IRK पढ़ें (प्रति पंक्ति एक, हेक्स प्रारूप)
-t, --timeout TIMEOUT स्कैन टाइमआउट सेकंड में (डिफ़ॉल्ट: 30, या --irk के लिए अनंत)
--output {csv,json,jsonl}
स्कैन के अंत में लिखा जाने वाला बैच आउटपुट प्रारूप
-o, --output-file FILE
आउटपुट फ़ाइल पथ (डिफ़ॉल्ट: btrpa-scan-results.<format>;
stdout के लिए - उपयोग करें)
--log FILE डिटेक्शन को रीयल टाइम में CSV फ़ाइल में स्ट्रीम करें
-v, --verbose वर्बोज़ मोड — अतिरिक्त विवरण दिखाएँ
-q, --quiet क्वाइट मोड — प्रति-डिवाइस आउटपुट दबाएँ, केवल सारांश दिखाएँ
--min-rssi DBM न्यूनतम RSSI थ्रेशोल्ड (जैसे -70) — कमज़ोर सिग्नलों को अनदेखा करें
--rssi-window N औसत के लिए RSSI स्लाइडिंग विंडो आकार (डिफ़ॉल्ट: 1 = कोई औसत नहीं)
--active सक्रिय स्कैनिंग का उपयोग करें (अतिरिक्त डेटा के लिए SCAN_REQ भेजता है)
--environment {free_space,indoor,outdoor}
दूरी अनुमान पाथ-लॉस मॉडल (डिफ़ॉल्ट: free_space)
--ref-rssi DBM दूरी अनुमान के लिए 1 मीटर पर कैलिब्रेटेड RSSI
--name-filter PATTERN नाम द्वारा डिवाइस फ़िल्टर करें (केस-असंवेदनशील सबस्ट्रिंग मिलान)
--alert-within METERS निकटता अलर्ट जब डिवाइस इस दूरी के भीतर हो
--tui स्क्रॉलिंग आउटपुट के बजाय लाइव-अपडेट होने वाली टर्मिनल तालिका
--gui ब्राउज़र में वेब-आधारित रडार इंटरफ़ेस लॉन्च करें
--gui-port PORT GUI वेब सर्वर के लिए पोर्ट (डिफ़ॉल्ट: 5000)
--no-gps GPS स्थान स्टैम्पिंग अक्षम करें (GPS डिफ़ॉल्ट रूप से gpsd के माध्यम से चालू है)
--adapters LIST अल्पविराम-पृथक ब्लूटूथ अडैप्टर नाम (जैसे hci0,hci1)
सभी प्रसारण करने वाले BLE डिवाइसों के लिए स्कैन करें (डिफ़ॉल्ट 30-सेकंड टाइमआउट):
btrpa-scan --all
कस्टम टाइमआउट के साथ:
btrpa-scan --all -t 60
MAC एड्रेस द्वारा किसी विशेष डिवाइस को खोजें:
btrpa-scan AA:BB:CC:DD:EE:FF
आइडेंटिटी रिज़ॉल्विंग की का उपयोग करके रिज़ॉल्वेबल प्राइवेट एड्रेस रिज़ॉल्व करें। यह मोड डिफ़ॉल्ट रूप से अनिश्चित काल तक चलता है जब तक Ctrl+C से रोका न जाए:
btrpa-scan --irk 0123456789ABCDEF0123456789ABCDEF
IRK कई प्रारूपों में प्रदान की जा सकती है:
| प्रारूप | उदाहरण |
|---|---|
| सादा हेक्स | 0123456789ABCDEF0123456789ABCDEF |
| कोलन-पृथक | 01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF |
फ़ाइल से एक या अधिक IRK लोड करें। प्रत्येक पंक्ति में किसी भी समर्थित हेक्स प्रारूप में एक IRK होनी चाहिए। # से शुरू होने वाली पंक्तियाँ टिप्पणियाँ मानी जाती हैं:
btrpa-scan --irk-file keys.txt
उदाहरण keys.txt:
# ऐलिस का फ़ोन
0123456789ABCDEF0123456789ABCDEF
# बॉब की घड़ी
FEDCBA9876543210FEDCBA9876543210
जब कई IRK लोड की जाती हैं, तो प्रत्येक पता लगाया गया RPA सभी कीज़ के विरुद्ध जाँचा जाता है। सारांश सभी कीज़ में कुल मिलान दिखाता है।
कमांड लाइन पर की पास करने से बचने के लिए BTRPA_IRK पर्यावरण चर सेट करें:
export BTRPA_IRK=0123456789ABCDEF0123456789ABCDEF
btrpa-scan
प्राथमिकता: --irk > --irk-file > BTRPA_IRK
केवल उन डिवाइसों को दिखाएँ जिनकी सिग्नल स्ट्रेंथ थ्रेशोल्ड से ऊपर है:
btrpa-scan --all --min-rssi -70
BLE RSSI स्वाभाविक रूप से शोर-युक्त होता है। अधिक स्थिर दूरी अनुमानों और स्पूरियस कमज़ोर डिटेक्शनों को फ़िल्टर करने के लिए स्लाइडिंग विंडो औसत का उपयोग करें:
btrpa-scan --all --rssi-window 5
जब विंडोइंग सक्रिय होती है, तो डिस्प्ले कच्चा और औसत RSSI दोनों दिखाता है (जैसे RSSI: -65 dBm (avg: -62 dBm over 5 readings)), और दूरी अनुमान औसत मान का उपयोग करता है। --min-rssi फ़िल्टर भी औसत RSSI पर लागू होता है, जिससे एक अकेला शोर स्पाइक किसी डिवाइस को हटाने से रोकता है।
केस-असंवेदनशील सबस्ट्रिंग मिलान का उपयोग करके नाम द्वारा डिवाइस फ़िल्टर करें:
btrpa-scan --all --name-filter "AirPods"
केवल वे डिवाइस दिखाए जाएँगे जिनके विज्ञापित नाम में दिया गया पैटर्न शामिल है। नाम फ़िल्टर सक्रिय होने पर बिना नाम वाले डिवाइस बाहर कर दिए जाते हैं।
पैसिव स्कैनिंग (डिफ़ॉल्ट) केवल विज्ञापन देखती है। सक्रिय स्कैनिंग SCAN_REQ भेजती है और SCAN_RSP प्राप्त करती है, जो अतिरिक्त सर्विस UUID और डिवाइस नाम प्रकट कर सकती है:
btrpa-scan --all --active
नोट: macOS पर, CoreBluetooth इस फ़्लैग की परवाह किए बिना हमेशा सक्रिय रूप से स्कैन करता है। Linux/BlueZ पर, सक्रिय स्कैनिंग के लिए root या
CAP_NET_ADMINकी आवश्यकता हो सकती है।
दूरी अनुमान एक पाथ-लॉस एक्सपोनेंट का उपयोग करता है जो पर्यावरण के अनुसार भिन्न होता है। डिफ़ॉल्ट (free_space, n=2.0) बिना किसी अवरोध के मानता है। इनडोर अधिक यथार्थवादी अनुमानों के लिए:
btrpa-scan --all --environment indoor
| प्रीसेट | पाथ-लॉस एक्सपोनेंट (n) | उपयोग केस |
|---|---|---|
free_space | 2.0 | खुली हवा, दृष्टि रेखा |
समान RSSI के लिए उच्च n मान बड़े दूरी अनुमान उत्पन्न करते हैं, जो दीवारों और बाधाओं से सिग्नल क्षीणन को दर्शाता है।
डिफ़ॉल्ट रूप से btrpa-scan अनुभवजन्य रूप से मान्य 59 dB ऑफ़सेट (iBeacon मानक) का उपयोग करके विज्ञापित TX पावर से 1 मीटर पर अपेक्षित RSSI प्राप्त करता है। और भी बेहतर सटीकता के लिए आप अपने स्वयं के वातावरण में मापा गया कैलिब्रेटेड मान प्रदान कर सकते हैं:
--ref-rssi के साथ पास करें:btrpa-scan --all --ref-rssi -55
जब --ref-rssi सेट होता है, तो TX पावर को पूरी तरह से अनदेखा किया जाता है। यह उन डिवाइसों के लिए भी दूरी अनुमान सक्षम करता है जो TX पावर का विज्ञापन नहीं करते।
जब कोई डिवाइस किसी दी गई दूरी के भीतर होने का अनुमान लगाया जाता है तो श्रव्य घंटी और दृश्य अलर्ट ट्रिगर करें। इसके लिए लक्षित डिवाइस को TX पावर का विज्ञापन करना आवश्यक है:
btrpa-scan AA:BB:CC:DD:EE:FF --alert-within 5.0
IRK रिज़ॉल्यूशन सहित सभी मोड में काम करता है:
btrpa-scan --irk <key> --alert-within 3.0
स्क्रॉलिंग आउटपुट को सिग्नल स्ट्रेंथ द्वारा क्रमबद्ध लाइव-अपडेट होने वाली टर्मिनल तालिका से बदलें:
btrpa-scan --all --tui
TUI सभी पता लगाए गए डिवाइसों को एड्रेस, नाम, RSSI, औसत RSSI, अनुमानित दूरी, डिटेक्शन गणना और अंतिम-देखे जाने के समय के साथ एक संक्षिप्त तालिका में दिखाता है। रिज़ॉल्व किए गए IRK मिलान बोल्ड में दिखाए जाते हैं, और --alert-within थ्रेशोल्ड के भीतर के डिवाइस हाइलाइट किए जाते हैं।
अन्य फ़्लैग के साथ संयोजित करें:
btrpa-scan --irk <key> --tui --rssi-window 5 --environment indoor --alert-within 5.0
एनिमेटेड स्वीप, रीयल-टाइम डिवाइस ट्रैकिंग और GPS मानचित्र के साथ ब्राउज़र-आधारित रडार इंटरफ़ेस लॉन्च करें:
btrpa-scan --all --gui
GUI की विशेषताएँ:
GUI मोड डिफ़ॉल्ट रूप से निरंतर स्कैन करता है (कोई 30-सेकंड टाइमआउट नहीं)। रोकने के लिए Ctrl+C दबाएँ। विशिष्ट स्कैन अवधि सेट करने के लिए -t का उपयोग करें:
# इनडोर पाथ-लॉस मॉडल के साथ 60 सेकंड स्कैन करें
btrpa-scan --all --gui -t 60 --environment indoor
# कस्टम पोर्ट
btrpa-scan --all --gui --gui-port 8080
# RSSI औसत और निकटता अलर्ट के साथ संयोजित करें
btrpa-scan --all --gui --rssi-window 5 --alert-within 5.0
नोट:
--guiके लिए Flask और flask-socketio आवश्यक हैं (pip install btrpa-scan[gui])।--tuiया--quietके साथ संयोजित नहीं किया जा सकता।
प्रत्येक डिटेक्शन को होते ही CSV फ़ाइल में स्ट्रीम करें (लंबे समय तक चलने वाले स्कैन के लिए उपयोगी जहाँ आप वृद्धिशील डेटा चाहते हैं):
btrpa-scan --all --log scan.csv
इसे अलग बैच निर्यात के लिए --output के साथ संयोजित किया जा सकता है:
btrpa-scan --all --log live.csv --output json -o results.json
स्कैन के अंत में सभी परिणाम CSV, JSON या JSONL (JSON Lines) प्रारूप में निर्यात करें:
btrpa-scan --all --output json -o results.json -t 30
btrpa-scan --all --output csv -t 30
btrpa-scan --all --output jsonl -o results.jsonl -t 30
JSONL प्रति पंक्ति एक JSON ऑब्जेक्ट लिखता है, जिससे jq के माध्यम से पाइप करना आसान हो जाता है:
btrpa-scan --all --output jsonl -o results.jsonl -t 10
cat results.jsonl | jq .
पाइपिंग के लिए आउटपुट stdout पर लिखें:
btrpa-scan --all --output json -o - -t 10 -q | jq .
व्यापक कवरेज के लिए एक साथ कई ब्लूटूथ अडैप्टर के साथ स्कैन करें:
btrpa-scan --all --adapters hci0,hci1
प्रत्येक अडैप्टर समान डिटेक्शन कॉलबैक साझा करते हुए अपना स्वयं का स्कैनर उदाहरण चलाता है। सभी डिटेक्शन एक ही आउटपुट में विलीन हो जाते हैं।
GPS डिफ़ॉल्ट रूप से चालू है। प्रत्येक डिटेक्शन को gpsd से वर्तमान GPS निर्देशांक के साथ टैग किया जाता है। स्कैनर प्रति डिवाइस सर्वोत्तम GPS फ़िक्स भी ट्रैक करता है — सबसे मज़बूत RSSI वाले डिटेक्शन से निर्देशांक (सबसे निकट निकटता = सबसे सटीक स्थान)।
यदि gpsd नहीं चल रहा है, तो स्कैनर एक नोट प्रिंट करता है और GPS के बिना सामान्य रूप से कार्य करता रहता है:
# gpsd चलने के साथ — डिटेक्शन में अक्षांश/देशांतर शामिल होते हैं
btrpa-scan --all --output json
# gpsd के बिना — ठीक काम करता है, GPS फ़ील्ड खाली हैं
btrpa-scan --all
# GPS स्पष्ट रूप से अक्षम करें (कनेक्शन प्रयास छोड़ देता है)
btrpa-scan --all --no-gps
GPS निर्देशांक इनमें दिखाई देते हैं:
latitude, longitude, gps_altitude फ़ील्डक्वाइट मोड में चलाएँ (केवल सारांश, कोई प्रति-डिवाइस आउटपुट नहीं — --output या --log के साथ उपयोगी):
btrpa-scan --all -q --output json -t 30
वर्बोज़ मोड में चलाएँ (IRK मोड में गैर-मेल खाने वाले RPA दिखाएँ):
btrpa-scan --irk 0123456789ABCDEF0123456789ABCDEF -v
ब्लूटूथ लो एनर्जी डिवाइस ट्रैकिंग रोकने के लिए रिज़ॉल्वेबल प्राइवेट एड्रेस (RPA) का उपयोग करते हैं। RPA एक अस्थायी MAC एड्रेस होता है जो समय-समय पर बदलता रहता है, लेकिन डिवाइस की आइडेंटिटी रिज़ॉल्विंग की (IRK) रखने वाला कोई भी व्यक्ति इसे रिज़ॉल्व कर सकता है।
RPA में निम्न शामिल होते हैं:
01 पर सेट एक यादृच्छिक मानAES-128-ECB(IRK, padding || prand) के रूप में परिकलित, 3 बाइट्स तक छोटाbtrpa-scan ब्लूटूथ कोर स्पेसिफिकेशन (Vol 3, Part H, Section 2.2.2) से ah() फ़ंक्शन लागू करता है ताकि इन एड्रेसों को रीयल टाइम में रिज़ॉल्व किया जा सके।
AES-ECB पर नोट:
ah()फ़ंक्शन के लिए ECB मोड में AES का उपयोग ब्लूटूथ कोर स्पेसिफिकेशन द्वारा अनिवार्य है। चूँकि केवल एक 16-बाइट ब्लॉक कभी एन्क्रिप्ट होता है, ECB की ब्लॉकों में प्रसार की कमी अप्रासंगिक है — यह एक भेद्यता नहीं है।
ps के माध्यम से सिस्टम पर अन्य उपयोगकर्ताओं को दिखाई देते हैं। IRK को उजागर करने से बचने के लिए, फ़ाइल से पढ़ने हेतु --irk-file का उपयोग करें, या BTRPA_IRK पर्यावरण चर सेट करें। कंसोल आउटपुट IRK को डिफ़ॉल्ट रूप से मास्क करता है (केवल पहले और अंतिम 4 हेक्स वर्ण दिखाता है)।--no-gps का उपयोग करें।--output-file और --log विकल्प निर्दिष्ट पथ पर लिखते हैं। सुनिश्चित करें कि गंतव्य के पास आपके उपयोग के मामले के लिए उपयुक्त अनुमतियाँ हैं।pip install pytest
python -m pytest test_btrpa_scan.py -v
Mode: DISCOVER ALL - showing every broadcasting device
Scanning: passive
GPS: connected (37.774929, -122.419418)
Timeout: 30s | Press Ctrl+C to stop
------------------------------------------------------------
============================================================
DEVICE #1 - seen 1x
============================================================
Address : AA:BB:CC:DD:EE:FF
Name : MyDevice
RSSI : -45 dBm
TX Power : -59 dBm
Est. Distance: ~0.4 m
Manufacturer : 0x004C -> 0215abcdef
Best GPS : 37.774929, -122.419418
Timestamp : 14:32:07
============================================================
------------------------------------------------------------
Scan complete - 30.0s elapsed
Total detections : 142
Unique devices : 12
Results written to btrpa-scan-results.json
स्कैन को सुचारू रूप से रोकने और सारांश आँकड़े प्रदर्शित करने के लिए किसी भी समय Ctrl+C दबाएँ।
| प्लेटफ़ॉर्म | इंस्टॉल | स्टार्ट |
|---|
| macOS | brew install gpsd | gpsd -n /dev/tty.usbserial-* |
| Debian/Ubuntu | sudo apt install gpsd gpsd-clients | sudo systemctl start gpsd |
| Fedora/RHEL | sudo dnf install gpsd gpsd-clients | sudo systemctl start gpsd |
| Arch | sudo pacman -S gpsd | sudo systemctl start gpsd |
| Windows | WSL या MSYS2 के माध्यम से gpsd का उपयोग करें | ऊपर WSL निर्देश देखें |
| प्लेटफ़ॉर्म | नोट्स |
|---|
| macOS | CoreBluetooth का उपयोग करता है। IRK मोड UUID के बजाय वास्तविक ब्लूटूथ एड्रेस प्राप्त करने के लिए एक अप्रमाणित API का लाभ उठाता है। --active का कोई प्रभाव नहीं होता — CoreBluetooth हमेशा सक्रिय रूप से स्कैन करता है। |
| Linux | स्कैनिंग के लिए root या CAP_NET_ADMIN क्षमता की आवश्यकता हो सकती है। |
| Windows | नेटिव WinRT ब्लूटूथ API — वास्तविक MAC एड्रेस मूल रूप से उपलब्ध होते हैं। TUI के लिए pip install windows-curses आवश्यक है। |
| डैश-पृथक | 01-23-45-67-89-AB-CD-EF-01-23-45-67-89-AB-CD-EF |
| 0x-उपसर्गित | 0x0123456789ABCDEF0123456789ABCDEF |
outdoor | 2.2 | पार्क, पार्किंग स्थल |
indoor | 3.0 | कार्यालय, घर, इमारतें |