
यह परियोजना LoRaWAN पैकेटों के एक सेट को तैयार करने, पार्स करने, भेजने, विश्लेषण करने और क्रैक करने के लिए उपकरणों की एक श्रृंखला प्रदान करने का इरादा रखती है ताकि LoRaWAN बुनियादी ढांचे की सुरक्षा का ऑडिट या पेंटेस्ट किया जा सके।
IoT तैनातियाँ लगातार बढ़ रही हैं, और इस महत्वपूर्ण वृद्धि का एक भाग दुनिया भर के सैकड़ों शहरों (स्मार्ट सिटीज) के साथ-साथ उद्योगों और घरों में तैनात लाखों LPWAN (लो-पावर वाइड-एरिया नेटवर्क) सेंसरों से बना है। सबसे अधिक उपयोग की जाने वाली LPWAN तकनीकों में से एक LoRa है, जिसके लिए LoRaWAN नेटवर्क मानक (MAC लेयर) है। LoRaWAN एक सुरक्षित प्रोटोकॉल है जिसमें अंतर्निहित एन्क्रिप्शन है, लेकिन कार्यान्वयन संबंधी समस्याएँ और कमज़ोरियाँ अधिकांश वर्तमान तैनातियों की सुरक्षा को प्रभावित करती हैं।
यह प्रोजेक्ट LoRaWAN पैकेटों के एक सेट को तैयार करने, पार्स करने, भेजने, विश्लेषण करने और क्रैक करने के लिए उपकरणों की एक श्रृंखला प्रदान करने का इरादा रखता है, ताकि LoRaWAN बुनियादी ढाँचे की सुरक्षा का ऑडिट या पेंटेस्ट किया जा सके।
नीचे, इस रिपॉजिटरी की संरचना है:
|-- tools
|-- UdpSender.py
|-- UdpProxy.py
|-- TcpProxy.py
|-- lorawan
|-- BruteForcer.py
|-- MicGenerator.py
|-- PacketCrafter.py
|-- PacketParser.py
|-- SessionKeysGenerator.py
|-- Loracrack (https://github.com/matiassequeira/Loracrack/tree/master)
|-- utils
|-- DevAddrChanger.py
|-- Fuzzer.py
|-- FileLogger.py
|-- auditing
|-- datacollectors
|-- MqttCollector.py
|-- UdpForwarderProxy.py
|-- analyzers
|-- LafProcessData.py
|-- bruteForcer
|-- LafBruteforcer.py
|-- keys
|-- dataanalysis
|-- LafPacketAnalysis.py
|-- printer
|-- LafPrinter.py
|-- db
|-- __init__.py
|-- Models.py
|-- Service.py
|-- lorawanwrapper
|-- LorawanWrapper.py
|-- utils
|-- jsonUnmarshaler.go
|-- lorawanWrapper.go
|-- micGenerator.go
|-- sessionKeysGenerator.go
|-- scripts
|-- gateway_channel_changer
|-- LoRa-GW-Installer.sh
|-- Continuous-Channel-Switch.sh
|-- LoRa-GW-Channel-Setup.sh
हम आपके LoRaWAN ऑडिटिंग फ्रेमवर्क को चालू करने के लिए विभिन्न विकल्प प्रदान करते हैं:
tools/ निर्देशिका में स्थित पेंटेस्टिंग उपकरणों का उपयोग करना हो, ताकि डॉकर पोर्ट मैपिंग की समस्याओं से बचा जा सके।localhost के माध्यम से Postgres से कनेक्ट करने का प्रयास करेगा। डॉकर सेट करने के निर्देश नीचे देखें।ये निर्देश आपको अपनी स्थानीय मशीन पर प्रोजेक्ट और इसकी निर्भरताओं की एक प्रति प्राप्त करने देंगे। नीचे दिए गए कमांड Debian आधारित वातावरण के लिए हैं:
इस रिपॉजिटरी को क्लोन करें: git clone --recurse-submodules https://github.com/IOActive/laf.git
python3 स्थापित करें:
sudo apt-get updatesudo apt-get install python3.6पायथॉन निर्भरताएँ डाउनलोड और स्थापित करें:
sudo pip3 install paho-mqtt && sudo pip3 install sqlalchemy && sudo pip3 install psycopg2-binary &&sudo pip3 install python-dateutilPYTHONPATH और ENVIRONMENT सेट करें
cd laf && export PYTHONPATH=$(pwd) && export ENVIRONMENT='DEV'golang स्थापित और सेटअप करें:
cd ~/Downloadssudo tar -C /usr/local -xvzf YOUR_GOLANG_FILEexport PATH=$PATH:/usr/local/go/binऔर बस इतना ही!
यह दृष्टिकोण निर्भरताओं की स्थापना से निपटने से बचाता है और एक PostgreSQL DB शुरू करता है जहाँ उपकरण पैकेट और डेटा सहेजते हैं। कंटेनर:
चरण:
git clone https://github.com/IOActive/laf.gitcd laf/ पर जाएँdocker-compose up --builddocker exec -ti laf_tools_1 /bin/bashआप pgAdmin का उपयोग करके DB में डेटा जाँच सकते हैं:
पहले, pgAdmin तक पहुँचें:
फिर, आपको सर्वर जोड़ना होगा:
यहाँ निर्देशिकाओं और उनके अंदर के उपकरणों/कार्यों का विवरण दिया गया है।
इस निर्देशिका में प्रदान किए गए उपकरणों का मुख्य उद्देश्य LoRaWAN बुनियादी ढाँचे के लिए पैठ परीक्षण के निष्पादन को आसान बनाना है।
यह उपकरण अपलिंक पैकेट (नेटवर्क सर्वर या गेटवेब्रिज को, बुनियादी ढाँचे पर निर्भर करता है) या डाउनलिंक पैकेट (पैकेट-फॉरवर्डर को) भेजने का इरादा रखता है। वैकल्पिक रूप से, पैकेटों को फ़ज़ किया जा सकता है और एक वैध MIC की गणना की जा सकती है।
वैकल्पिक तर्क:
-h, --help यह सहायता संदेश दिखाएं और बाहर निकलें।
--lcl-port LCL_PORT स्रोत पोर्ट, उदा. --lcl-port=623।
--timeout TIMEOUT प्रत्येक भेजे गए पैकेट के बीच सेकंड में समय। डिफ़ॉल्ट 1 सेकंड है।
इस समय में, प्रेषक उत्तरों के लिए सुनेगा।
--repeat संदेशों को कई बार भेजें
--fuzz-out FUZZ_OUT [FUZZ_OUT ...]
गंतव्य पोर्ट पर भेजे गए डेटा को फ़ज़ करें (फ़ज़िंग मोड देखें
utils/fuzzer.py में), उदा. --fuzz-out 1 2।
--key KEY पैकेटों पर हस्ताक्षर करने के लिए कुंजी दर्ज करें (हेक्स प्रारूप में, कुल 32 वर्ण
/ 16 बाइट्स) (नया MIC गणना और जोड़ें)। ध्यान दें कि JoinRequests के लिए यह
AppKey होना चाहिए, और डेटा पैकेटों के लिए NwkSKey। इस कार्यक्रम द्वारा
पहले से इसकी पुष्टि नहीं की जा सकती। उदा.
00112233445566778899AABBCCDDEEFF
-a DEVADDR, --devaddr DEVADDR
पहचान का DeviceAddress, हेक्स प्रारूप में दिया गया (कुल 8 वर्ण), उदा. AABB0011।
--fcnt FCNT दिए गए डेटा पैकेट में सेट किया जाने वाला फ़्रेम काउंटर।
यह JoinRequest/JoinAccept में काम नहीं करेगा क्योंकि इस पैकेट में fCnt नहीं है।
आवश्यक तर्क:
--dst-ip DST_IP गंतव्य ip, उदा. --dst-ip 192.168.3.101।
--dst-port DST_PORT गंतव्य पोर्ट, उदा. --dst-port 623।
--data DATA UDP पैकेट। इस स्क्रिप्ट के अंत में "data" सरणी में और अधिक पैकेट भी जोड़े जा सकते हैं।
पैकेट एक बाइट स्ट्रिंग होना चाहिए (आपको डबल कोट्स को एस्केप करना होगा)।
***उदाहरण*** पैकेट_फॉरवर्डर प्रारूप के साथ: --data "b'\x02\xe67\x00\xb8\'\xeb\xff\xfez\x80
\xdb{\"rxpk\":[{\"tmst\":2749728315,\"chan\":0,\"rfch\
":0,\"freq\":902.300000,\"stat\":1,\"modu\":\"LORA\",\
"datr\":\"SF7BW125\",\"codr\":\"4/5\",\"lsnr\":9.5,\"r
ssi\":-76,\"size\":23,\"data\":\"AMQAAAAAhQAAAgAAAAAAA
ACH9PRMJi4=\"}]}'" ***उदाहरण*** गेटवाइस [GV] प्रारूप का उपयोग करके
इमीडिएट मोड में, BW125 और फ़्रीक्वेंसी 902.3 पर भेजना
है "b'{\"tx_mode\": 0, \"freq\": 902.3,
\"rfch\": 0, \"modu\": 16, \"datarate\": 16,
\"bandwidth\":3, \"codr\": 1, \"ipol\":false,
\"size\": 24, \"data\":
\"QOOL8AGA6AMCnudJqz3syCkeooCvqbSn\", \"class\": 2}'"
उदाहरण:
हर 2 सेकंड में (localhost, 10001) पर पोर्ट 10000 से एकल पैकेट भेजने के लिए, MIC और FCounter को यादृच्छिक रूप से फ़ज़ करते हुए:
python3 UdpSender.py --lcl-port 10000 --dst-ip 127.0.0.1 --dst-port 10001 --timeout 2 --fuzz-out 4 5 --data "b'\x02\xe67\x00\xb8\'\xeb\xff\xfez\x80\xdb{\"rxpk\":[{\"tmst\":2749728315,\"chan\":0,\"rfch\":0,\"freq\":902.300000,\"stat\":1\"modu\":\"LORA\",\"datr\":\"SF7BW125\",\"codr\":\"4/5\",\"lsnr\":9.5,\"rssi\":-76,\"size\":23,\"data\":\"AMQAAAAAhQAAAgAAAAAAAACH9PRMJi4=\"}]}'"
यह UDP प्रॉक्सी मुख्य रूप से गेटवे (पैकेट_फॉरवर्डर) और नेटवर्क सर्वर या गेटवे ब्रिज के बीच रखे जाने का इरादा रखता है, जो मूल्यांकन किए जा रहे बुनियादी ढाँचे पर निर्भर करता है। यह वांछित दिशा (अपलिंक या डाउनलिंक) में डेटा को फ़ज़ करने की संभावना भी प्रदान करता है।
वैकल्पिक तर्क:
-h, --help यह सहायता संदेश दिखाएं और बाहर निकलें।
--collector-port COLLECTOR_PORT
पैकेट फॉरवर्डर डेटा कलेक्टर पोर्ट, उदा. --collector-
port 1701। देखें
auditing/datacollectors/PacketForwarderCollector.py
--collector-ip COLLECTOR_IP
पैकेट फॉरवर्डर डेटा कलेक्टर ip। डिफ़ॉल्ट localhost है।
उदा. --collector-ip 192.168.1.1। देखें
auditing/datacollectors/PacketForwarderCollector.py
--fuzz-in FUZZ_IN [FUZZ_IN ...]
dst-port पर भेजे गए डेटा को फ़ज़ करें दिए गए मोड में (देखें
utils/fuzzer.py में फ़ज़िंग मोड), उदा. --fuzz-in 1 2 ...
--fuzz-out FUZZ_OUT [FUZZ_OUT ...]
(स्रोत) पोर्ट पर भेजे गए डेटा को फ़ज़ करें दिए गए मोड में
(देखें utils/fuzzer.py में फ़ज़िंग मोड), उदा. --fuzz-out
1 2 ...
-k KEY, --key KEY किसी डिवाइस का AppSKey दर्ज करें (हेक्स प्रारूप में, कुल 32
वर्ण / 16 बाइट्स) ताकि इसके FRMPayload को डिक्रिप्ट किया जा सके और इसे
सादे टेक्स्ट में प्रिंट किया जा सके। यदि आप किसी दिए गए Join Accept को डिक्रिप्ट करना चाहते हैं तो आप AppKey भी दर्ज कर सकते हैं। उदा.
00112233445566778899AABBCCDDEEFF
-p PATH, --path PATH फ़ाइलपथ जहाँ डेटा सहेजना है। यदि नहीं दिया गया, तो डेटा
सहेजा नहीं जाएगा।
--no-log UDP पैकेज को कंसोल में प्रिंट न करें
--no-parse PHYPayload को पार्स न करें। यदि यह विकल्प चुना जाता है,
/lorawanwrapper/ से Golang लाइब्रेरीज़ आयात नहीं की जाएंगी
(golang libs संकलन आवश्यक नहीं है)
आवश्यक तर्क:
--port PORT सुनने के लिए स्थानीय पोर्ट, उदा. --port 623।
--dst-ip DST_IP गंतव्य होस्ट ip, उदा. --dst-ip 192.168.3.101।
--dst-port DST_PORT गंतव्य होस्ट पोर्ट, उदा. --dst-port 623।
उदाहरण:
पोर्ट 1234 पर प्राप्त पैकेटों को (localhost, 1235) पर भेजने और वाइस-वर्सा करने के लिए। पोर्ट पर प्राप्त पैकेटों को फ़ज़ किया जाएगा (devNonce को यादृच्छिक रूप से बदला जाएगा) और (localhost, 1235) पर अग्रेषित किया जाएगा।
python3 UdpProxy.py --port 1234 --dst-ip 127.0.0.1 --dst-port 1235 --fuzz-in 9
यह TCP प्रॉक्सी मुख्य रूप से नेटवर्क सर्वर और MQTT ब्रोकर के बीच रखे जाने का इरादा रखता है। यह डेटा को फ़ज़ करने की संभावना भी प्रदान करता है।
वैकल्पिक तर्क:
-h, --help यह सहायता संदेश दिखाएं और बाहर निकलें।
--fuzz-in FUZZ_IN [FUZZ_IN ...]
dst-port पर भेजे गए डेटा को फ़ज़ करें दिए गए मोड में (देखें
utils/fuzzer.py में फ़ज़िंग मोड)
आवश्यक तर्क:
--lcl-port LCL_PORT सुनने के लिए स्थानीय पोर्ट, उदा. --lcl-port=623।
--dst-ip DST_IP गंतव्य होस्ट ip, उदा. --dst-ip=192.168.3.101।
--dst-port DST_PORT गंतव्य होस्ट पोर्ट, उदा. --dst-port=623।
उदाहरण:
(localhost, 1884) और (localhost, 1883) से डेटा भेजें और प्राप्त करें
python3 TcpProxy.py --lcl-port 1884 --dst-ip 127.0.0.1 --dst-port 1883
इस निर्देशिका में LoRaWAN पैकेटों को पार्स करने, तैयार करने, ब्रूटफोर्स करने आदि के लिए स्क्रिप्ट्स की एक श्रृंखला है।
यह स्क्रिप्ट Base64 में JoinAccept या JoinRequest प्राप्त करता है और संभावित कुंजियों के एक सेट के साथ इसके AppKey को डिक्रिप्ट करने का प्रयास करता है, जो एक फ़ाइल में प्रदान किया जा सकता है या फ्लाई पर उत्पन्न किया जा सकता है।
वैकल्पिक तर्क:
-h, --help यह सहायता संदेश दिखाएं और बाहर निकलें।
-k KEYS, --keys KEYS कुंजियों की सूची वाली फ़ाइल, \n द्वारा अलग की गई। डिफ़ॉल्ट रूप से
/auditing/analyzers/bruteForcer/keys.txt का उपयोग करेगा
--dont-generate यदि आप निम्नलिखित संयोजनों के साथ फ्लाई पर कुंजियाँ उत्पन्न नहीं करना चाहते हैं तो यह विकल्प चुनें: 1- पहले बाइट और अंतिम पंद्रह बाइट्स को मिलाएं। उदा.
AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 2- सम और विषम बाइट स्थितियों को समान रूप से मिलाएं। उदा.
AABBAABBAABBAABBAABBAABBAABBAABB 3- पहले 14 बाइट्स को 00 में रखें और अंतिम 2 को मिलाएं। उदा.
0000000000000000000000000000BA01
आवश्यक तर्क:
-a ACCEPT, --accept ACCEPT
ब्रूटफोर्स करने के लिए Join Accept Base64 प्रारूप में। उदा. -a
IHvAP4MXo5Qo6tdV+Yfk08o=
-r REQUEST, --request REQUEST
ब्रूटफोर्स करने के लिए Join Request Base64 प्रारूप में। उदा.
-r AMQAAAAAhQAAAgAAAAAAAADcYldcgbc=
उदाहरण:
my-keys.txt से कुंजियों के एक सेट के साथ JoinRequest को क्रैक करें और अतिरिक्त रूप से लगभग 200000 और गतिशील रूप से उत्पन्न करें।
python3 BruteForcer.py -a IHvAP4MXo5Qo6tdV+Yfk08o= -r AMQAAAAAhQAAAgAAAAAAAADcYldcgbc= -k ./my-keys.txt
यह स्क्रिप्ट Base64 में एक PHYPayload पैकेट और एक कुंजी प्राप्त करता है जो पैकेट प्रकार के आधार पर NwkSKey या AppKey हो सकती है, और नया MIC उत्पन्न करता है।
वैकल्पिक तर्क:
-h, --help यह सहायता संदेश दिखाएं और बाहर निकलें।
--jakey JAKEY [JoinAccept ONLY]. पहले JoinAccept को एन्क्रिप्ट करने के लिए उपयोग की गई कुंजी दर्ज करें (हेक्स प्रारूप में, कुल 32
वर्ण / 16 बाइट्स)। इस कार्यक्रम द्वारा पहले से इसकी पुष्टि नहीं की जा सकती। उदा.
00112233445566778899AABBCCDDEEFF। JoinAccept "IB1scNmwJRA32RfMbvwe3oI=" के लिए
एक मान्य कुंजी नमूना "f5a3b185dfe452c8edca3499abcd0341" है।
आवश्यक तर्क:
-d DATA, --data DATA हस्ताक्षरित होने वाला Base64 डेटा। उदा. -d
AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU=
-k KEY, --key KEY पैकेटों पर हस्ताक्षर करने के लिए नई कुंजी दर्ज करें (हेक्स प्रारूप में, कुल 32
वर्ण / 16 बाइट्स) (नई MIC गणना और जोड़ें)। ध्यान दें कि JoinRequest/JoinAccept के लिए
यह AppKey होना चाहिए, और डेटा पैकेटों के लिए NwkSKey। इस कार्यक्रम द्वारा
पहले से इसकी पुष्टि नहीं की जा सकती। उदा. 00112233445566778899AABBCCDDEEFF
उदाहरण:
दिए गए PHYPayload को AppKey 00112233445566778899AABBCCDDEEFF से हस्ताक्षरित करें।
python3 MicGenerator.py -d AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU= -k 00112233445566778899AABBCCDDEEFF
यह स्क्रिप्ट एक लोरावन JSON पैकेट प्राप्त करता है और इसे Base64 में बदलता है। यह packetParser.py के विपरीत करता है, इसलिए उस स्क्रिप्ट के आउटपुट का उपयोग यहाँ और वाइस-वर्सा किया जा सकता है।
वैकल्पिक तर्क:
-h, --help यह सहायता संदेश दिखाएं और बाहर निकलें।
-k KEY, --key KEY एक डिवाइस AppSKey या AppKey दर्ज करें (हेक्स प्रारूप में, कुल
32 वर्ण / 16 बाइट्स) FRMPayload या Join Accept को एन्क्रिप्ट करने के लिए। उदा.
F5A3B185DFE452C8EDCA3499ABCD0341
--nwkskey NWKSKEY यदि आप वैध MIC के साथ डेटा पैकेट उत्पन्न करना चाहते हैं तो नेटवर्क सत्र कुंजी दर्ज करें।
आवश्यक तर्क:
-j JSON, --json JSON पार्स करने के लिए JSON ऑब्जेक्ट। उदा. -j '{"mhdr":
{"mType":"JoinRequest","major":"LoRaWANR1"},"macPayloa
d":{"joinEUI":"55d239ac716f234d","devEUI":"b827eb891cf
50003","devNonce":51639},"mic":"7005c4a5"}'
उदाहरण:
JSON में दिए गए मानों के साथ एक JoinRequest PHYPayload Base64 में प्राप्त करें।
python3 PacketCrafter.py -j '{"mhdr":{"mType":"JoinRequest","major":"LoRaWANR1"},"macPayload":{"joinEUI":"55d239ac716f234d","devEUI":"b827eb891cf50003","devNonce":51639},"mic":"7005c4a5"}'
यह स्क्रिप्ट Base64 में एक एकल LoRaWAN PHYPayload डेटा को पार्स और प्रिंट करता है। यह packetCrafter.py के विपरीत करता है, इसलिए उस स्क्रिप्ट के आउटपुट का उपयोग यहाँ और वाइस-वर्सा किया जा सकता है।
वैकल्पिक तर्क:
-h, --help यह सहायता संदेश दिखाएं और बाहर निकलें।
-k KEY, --key KEY पैकेट के आधार पर डिक्रिप्ट करने के लिए डिवाइस AppKey या AppSKey दर्ज करें (join accept या data packet)।
हेक्स प्रारूप में होना चाहिए, कुल 32 वर्ण / 16 बाइट्स। उदा. 00112233445566778899AABBCCDDEEFF
आवश्यक तर्क:
-d DATA, --data DATA पार्स करने के लिए Base64 डेटा। उदा. -d
AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU=
उदाहरण:
ऊपर दिए गए उदाहरण से JoinRequest JSON प्रारूप में प्राप्त करें।
python3 PacketParser.py -d AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU=
यह स्क्रिप्ट Base64 में JoinAccept और JoinRequest प्राप्त करता है, और सत्र कुंजियाँ उत्पन्न करने के लिए एक AppKey प्राप्त करता है। उपयोग का एक उदाहरण:
वैकल्पिक तर्क:
-h, --help यह सहायता संदेश दिखाएं और बाहर निकलें।
आवश्यक तर्क:
-a JACCEPT, --jaccept JACCEPT
JoinAccept payload base64 में
-r JREQUEST, --jrequest JREQUEST
JoinRequest payload base64 में
-k KEY, --key KEY एक डिवाइस AppKey दर्ज करें (हेक्स प्रारूप में, कुल 32
वर्ण / 16 बाइट्स)। उदा.
00112233445566778899AABBCCDDEEFF
उदाहरण:
निम्नलिखित जॉइन डेटा के साथ AppSKey और NwkSKey प्राप्त करें।
python3 SessionKeysGenerator.py -r AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU= -a IB1scNmwJRA32RfMbvwe3oI= -k f5a3b185dfe452c8edca3499abcd0341
ये सहायक फ़ंक्शन हैं जिनका उपयोग UdpSender.py और UdpProxy.py द्वारा किया जाता है। Fuzzer.py में आप लागू फ़ज़िंग मोड देख सकते हैं।
इस निर्देशिका का सामान्य उद्देश्य LoRaWAN पैकेट एकत्र करना और ट्रैफ़िक के विभिन्न पहलुओं का विश्लेषण करना है, साथ ही AppKey को ब्रूटफोर्स करने के लिए कुंजियों का एक सेट आज़माना है।
इस निर्देशिका में स्क्रिप्ट्स का एक सेट है जो विभिन्न स्रोतों (जैसे गेटवे पैकेट_फॉरवर्डर, द थिंग्स नेटवर्क, आदि) से LoRaWAN पैकेट प्राप्त करता है और उन्हें एक मानक प्रारूप के साथ फ़ाइलों में सहेजता है। इन फ़ाइलों को बाद में विभिन्न उप-उपकरणों को निष्पादित करने के लिए स्क्रिप्ट /auditing/analyzers/LafProcessData.py द्वारा लाया जाना चाहिए।
यह स्क्रिप्ट mqqt ब्रोकर से कनेक्ट होता है, सभी विषयों को पुनः प्राप्त करता है और संदेशों को निर्दिष्ट फ़ील्ड में एक फ़ाइल में सहेजता है। फ़ाइल का नाम उस तारीख से बना होता है जब यह स्क्रिप्ट शुरू की गई थी।
वैकल्पिक तर्क:-h, --help show this help message and exit --collector-id COLLECTOR_ID डेटाकलेक्टर की आईडी। यह आईडी DB में सहेजे गए पैकेटों से जुड़ी होगी। उदा. --id 1 --organization-id ORGANIZATION_ID डेटाकलेक्टर की आईडी। यह आईडी DB में सहेजे गए पैकेटों से जुड़ी होगी। उदा. --id 1 --topics TOPICS [TOPICS ...] उन विषयों की सूची बनाएं जिन्हें आप सब्सक्राइब करना चाहते हैं, स्पेस से अलग करके। यदि कुछ नहीं दिया गया, तो डिफ़ॉल्ट "#" होगा।
अनिवार्य तर्क:
--ip IP MQTT ब्रोकर का IP, उदा. --ip 192.168.3.101।
--port PORT MQTT ब्रोकर का पोर्ट, उदा. --port 623।
उदाहरण:
IP 200.200.200.200 वाले MQTT ब्रोकर से डिफ़ॉल्ट पोर्ट (1883) पर कनेक्ट करें।
python3 GenericMqttCollector.py --ip 200.200.200.200 --port 1883
यह स्क्रिप्ट लोरासर्वर.आईओ MQTT ब्रोकर से कनेक्ट होती है और संदेशों को DB में सहेजती है। आपको एक अद्वितीय कलेक्टरआईडी निर्दिष्ट करनी होगी और आप उन विषयों को निर्दिष्ट कर सकते हैं जिन्हें आप सब्सक्राइब करना चाहते हैं।
वैकल्पिक तर्क:
-h, --help show this help message and exit
--port PORT MQTT ब्रोकर का पोर्ट, उदा. --port 623। डिफ़ॉल्ट 1883।
--collector-id COLLECTOR_ID
डेटाकलेक्टर की आईडी। यह आईडी DB में सहेजे गए पैकेटों से जुड़ी होगी। उदा. --id 1
--organization-id ORGANIZATION_ID
डेटाकलेक्टर की आईडी। यह आईडी DB में सहेजे गए पैकेटों से जुड़ी होगी। उदा. --id 1
--topics TOPICS [TOPICS ...]
उन विषयों की सूची बनाएं जिन्हें आप सब्सक्राइब करना चाहते हैं, स्पेस से अलग करके। यदि कुछ नहीं दिया गया, तो डिफ़ॉल्ट "#" होगा।
अनिवार्य तर्क:
--ip IP MQTT ब्रोकर का IP, उदा. --ip 192.168.3.101।
यह स्क्रिप्ट गेटवे पैकेट_फॉरवर्डर प्रारूप में UDP प्रॉक्सी से UDP पैकेट प्राप्त करती है और उन्हें संग्रहीत करती है।
वैकल्पिक तर्क:
-h, --help show this help message and exit
--collector-id COLLECTOR_ID
डेटाकलेक्टर की आईडी। यह आईडी DB में सहेजे गए पैकेटों से जुड़ी होगी। उदा. --id 1
--organization-id ORGANIZATION_ID
डेटाकलेक्टर की आईडी। यह आईडी DB में सहेजे गए पैकेटों से जुड़ी होगी। उदा. --id 1
अनिवार्य तर्क:
-n NAME, --name NAME डेटा कलेक्टर का अद्वितीय स्ट्रिंग पहचानकर्ता। उदा. --name semtech_collector
-p PORT, --port PORT UDP पैकेट सुनने के लिए पोर्ट। --port 1702।
उदाहरण:
एक गेटवे से स्थानीय पोर्ट 1700 पर भेजे जा रहे डेटा और एक नेटवर्क xserver (localhost, 1701) पर सुनने वाले के बीच रिकॉर्ड करें। डेटा को ./ निर्देशिका में सहेजें।
python3 PacketForwarderCollector.py --name semtech_collector --port 1700
यह स्क्रिप्ट एक या एक से अधिक फ़ाइलों या stdin से पढ़ती है और विभिन्न उप-टूल्स को निष्पादित करती है। चुने गए विकल्प के आधार पर, आप LoRaWAN ट्रैफ़िक का विश्लेषण कर सकते हैं, AppKey को ब्रूटफोर्स करने का प्रयास कर सकते हैं, या प्राप्त सभी पैकेटों को पार्स कर सकते हैं। इन विकल्पों को जोड़ा जा सकता है।
वैकल्पिक तर्क:
यह स्क्रिप्ट DB से पैकेट प्राप्त करती है और विभिन्न उप-टूल्स को निष्पादित करती है।
फिर, प्रत्येक उप-टूल आउटपुट डेटा को DB में सहेजेगा। अधिक जानकारी के लिए प्रत्येक विकल्प देखें।
optional arguments:
-h, --help show this help message and exit
-a, --analyze ट्रैफ़िक से विभिन्न पहलुओं को एकत्र और विश्लेषित करें। यदि
ब्रूटफोर्सर (-b) सक्रिय है, तो परिणाम सहसंबद्ध होंगे।
-b, --bforce JoinRequests और JoinAccepts पेलोड के साथ AppKeys को
ब्रूटफोर्स करने का प्रयास करें।
-k KEYS, --keys KEYS [ब्रूटफोर्सर] कुंजी फ़ाइल का फ़ाइलपथ। यदि प्रदान नहीं किया गया,
"bruteForcer/keys.txt" का उपयोग किया जाएगा।
--no-gen [ब्रूटफोर्सर] कुंजियाँ उत्पन्न न करें, केवल फ़ाइलों से कुंजियाँ आज़माएँ।
-p, --parse PHYPayload को पढ़ने योग्य जानकारी में पार्स करें।
--from-id FROM_ID प्रक्रिया शुरू करने के लिए पैकेट आईडी।
--to-id TO_ID प्रक्रिया किए जाने वाले अंतिम पैकेट आईडी।
उदाहरण:
DB में पैकेट को पैकेट आईडी 1000 से प्रक्रिया करें, ट्रैफ़िक विश्लेषण करें, और my-keys.txt में दी गई AppKeys को क्रैक करने का प्रयास करें, लेकिन अतिरिक्त कुंजियाँ गतिशील रूप से उत्पन्न न करें।
python3 LafProcessData.py -a -b -k my-keys.txt --no-gen --from-id 1000
ये स्क्रिप्ट LafProcessData.py द्वारा आयोजित कार्यक्षमता प्रदान करती हैं। नीचे वे अलर्ट दिए गए हैं जो LafPacketAnalysis.py और LafBruteForcer.py द्वारा लागू किए गए हैं:
यह निर्देशिका https://github.com/brocaar/lorawan/ लाइब्रेरी के लिए रैपरों का एक सेट प्रदान करती है, जो Golang में लिखी गई है। ये फ़ंक्शन उपकरणों द्वारा कार्यान्वित किए जाते हैं।
यहां आपको विभिन्न कार्यों को स्वचालित करने के उद्देश्य से स्क्रिप्ट की एक श्रृंखला मिलेगी। यदि आवश्यक हो तो उन्हें निष्पादन अनुमति देना सुनिश्चित करें (Linux/MacOS के लिए chmod +x your_script)।
आसानी से अपना गेटवे सेटअप करें और स्निफिंग उद्देश्यों के लिए इसके चैनल स्विच करें। इनका उपयोग कैसे करें, इसके बारे में अधिक जानकारी के लिए, आप इस निर्देशिका में readme देख सकते हैं।
यह स्क्रिप्ट एक Raspberry PI पर सभी आवश्यक सॉफ़्टवेयर पैकेज स्थापित करने के लिए उपयोग की जाती है, ताकि एक जुड़े LoRa कंसंट्रेटर (iC980-SPI, RHF0M301-SPI, RAK831-SPI या मैन्युअल सेटअप द्वारा कोई अन्य) के साथ LoRaWAN गेटवे बनाया जा सके।
चूँकि यह जानना संभव नहीं है कि LoRa उपकरण किस आवृत्ति पर काम कर रहे हैं, हमने एक स्क्रिप्ट बनाई है जो स्निफिंग उद्देश्यों के लिए US915 और EU868 आवृत्ति बैंड से गेटवे चैनलों को स्विच कर सकती है। हालाँकि पेशेवर और महंगे गेटवे हैं जो 32 या 64 चैनलों का समर्थन करते हैं, अधिकांश गेटवे 8 तक चैनलों का समर्थन करते हैं। यह स्क्रिप्ट इस प्रकार के गेटवे पर चलाने के लिए है।
कम से कम US915 आवृत्ति बैंड में, पहले 8 चैनल सबसे अधिक उपयोग किए जाते हैं। लेकिन कुछ प्रसिद्ध कार्यान्वयन हैं जो चैनलों के दूसरे समूह का उपयोग करते हैं, जैसे The Things Networks, जो अपलिंक संचार के लिए दूसरे समूह (8-15) का उपयोग करता है।
वर्तमान में हम अन्य आवृत्ति बैंड का समर्थन नहीं करते हैं, लेकिन इन स्क्रिप्ट्स में थोड़े से बदलाव के साथ आप इसे स्वयं करने में सक्षम होंगे :)।
TODO
यह प्रोजेक्ट BSD-3-Clause लाइसेंस के तहत लाइसेंस प्राप्त है।
export GOPATH="$HOME/go"go लाइब्रेरी को संकलित करें:
cd laf/lorawanwrapper/utilsgo build -o lorawanWrapper.so -buildmode=c-shared jsonUnmarshaler.go lorawanWrapper.go micGenerator.go sessionKeysGenerator.go hashGenerator.goआप किस DB का उपयोग करना चाहते हैं, इसके आधार पर:
a. PostgreSQL: 'Docker का उपयोग करके LAF स्थापित करें' अनुभाग में तीसरे चरण तक के निर्देशों का पालन करें।
b. SQLite:
cd laf/auditing/db__init__.py को अपने पसंदीदा टेक्स्ट एडिटर से संशोधित करें और Postgres के साथ उपयोग करने के लिए लाइनों को कमेंट करें (DB कनेक्शन और पर्यावरण चर) और sqlite के साथ उपयोग करने के लिए लाइन को अनकमेंट करें।| आईडी | शीर्षक | विश्लेषक | जोखिम स्तर | विवरण | अनुशंसित कार्रवाई |
|---|
| LAF-001 | डिवनॉन्स (DevNonce) दोहराया गया | LafPacketAnalysis.py | कम | प्रत्येक उपकरण के लिए डिवनॉन्स इतने यादृच्छिक होने चाहिए कि वे टकराएँ नहीं। यदि एक ही डिवनॉन्स कई संदेशों में दोहराया गया, तो यह अनुमान लगाया जा सकता है कि उपकरण रीप्ले हमले के अंतर्गत है। अर्थात, एक हमलावर जिसने JoinRequest को कैप्चर किया है और उसे गेटवे पर फिर से भेजने का प्रयास कर रहा है। | जाँचें कि डिवनॉन्स कैसे उत्पन्न होते हैं: उन्हें उत्पन्न करने वाला फ़ंक्शन एक यादृच्छिक लाइब्रेरी का उपयोग करके लागू किया जाना चाहिए। इसके अलावा, सुनिश्चित करें कि सर्वर पुराने डिवनॉन्स की जाँच करे (उन्हें DB में संग्रहीत किया जाना चाहिए), ताकि उपकरण द्वारा पहले भेजी गई एक पुरानी मान्य JoinRequest को स्वीकार न किया जाए और इस प्रकार एक नया सत्र उत्पन्न न हो। |
| LAF-002 | डिवयूआई (DevEUI) समान डिवएड्र (DevAddr) साझा कर रहे हैं | LafPacketAnalysis.py | सूचना | दो अलग-अलग उपकरणों को एक ही DevAddr आवंटित किया जा सकता है। यह कोई सुरक्षा खतरा नहीं है। | यदि उपकरण ओवर-द-एयर सक्रिय (OTAA) है: DevAddr आवंटित करने के लिए उपयोग किए जाने वाले तर्क की जाँच करें, और सुनिश्चित करें कि सर्वर एक ही DevAddr विभिन्न उपकरणों को नहीं देता। यदि उपकरण वैयक्तिकरण द्वारा सक्रिय (ABP) है: डिवाइस के फर्मवेयर में कॉन्फ़िगर किए गए DevAddr की जाँच करें कि वह लोरावन नेटवर्क में अद्वितीय है। |
| LAF-003 | जॉइन रीप्ले | TODO | मध्यम | एक डुप्लिकेट जॉइन अनुरोध पैकेट का पता चला, जो संकेत दे सकता है कि लोरावन सर्वर रीप्ले हमले के अंतर्गत है। अर्थात, एक हमलावर जिसने पिछला जॉइन अनुरोध पैकेट कैप्चर किया है और उसे फिर से लोरावन सर्वर पर भेज रहा है, ताकि एक नया सत्र उत्पन्न करने का प्रयास किया जा सके। | जाँचें कि डिवनॉन्स कैसे उत्पन्न होते हैं: उन्हें उत्पन्न करने वाला फ़ंक्शन एक यादृच्छिक लाइब्रेरी का उपयोग करके लागू किया जाना चाहिए। इसके अलावा, सुनिश्चित करें कि सर्वर पुराने डिवनॉन्स की जाँच करे (उन्हें DB में संग्रहीत किया जाना चाहिए), ताकि उपकरण द्वारा पहले भेजी गई एक पुरानी मान्य JoinRequest को स्वीकार न किया जाए और इस प्रकार एक नया सत्र उत्पन्न न हो। |
| LAF-004 | अपलिंक डेटा पैकेटों का रीप्ले | TODO | मध्यम | एक डुप्लिकेट अपलिंक पैकेट का पता चला, जो संकेत दे सकता है कि लोरावन सर्वर रीप्ले हमले के अंतर्गत है। अर्थात, एक हमलावर जिसने एक अपलिंक पैकेट (डिवाइस से भेजा गया) कैप्चर किया है और उसे फिर से लोरावन सर्वर पर भेज रहा है। | ओवर-द-एयर सक्रिय (OTAA) उपकरणों में: सुनिश्चित करें कि प्रत्येक उपकरण रीसेट या काउंटर ओवरफ्लो के बाद सत्र कुंजियाँ पुनः उत्पन्न होती हैं ताकि इस हमले के किसी भी प्रभाव से बचा जा सके। लोरावन v1.0.* से वैयक्तिकरण द्वारा सक्रिय (ABP) उपकरणों के साथ, रीप्ले हमले को रोकने के लिए कुछ नहीं किया जा सकता सिवाय डिवाइस को OTAA में बदलने के। |
| LAF-005 | डाउनलिंक डेटा पैकेटों का रीप्ले | TODO | उच्च | एक डुप्लिकेट डाउनलिंक पैकेट का पता चला। सर्वर रीप्ले हमले का जवाब दे रहा है या उपकरणों के लिए असामान्य ट्रैफ़िक उत्पन्न कर रहा है। | सर्वर के लॉग जाँचें और सुनिश्चित करें कि पिछले अनुशंसित कार्यों को लागू किया गया है। |
| LAF-006 | संभावित ABP उपकरण (काउंटर रीसेट और कोई जॉइन नहीं) | LafPacketAnalysis.py | उच्च | यदि काउंटर रीसेट हो गया (0 पर वापस आ गया), DevAddr वही रहता है, और कोई पिछली जॉइन प्रक्रिया का पता नहीं चला, तो यह संकेत दे सकता है कि उपकरण वैयक्तिकरण द्वारा सक्रिय (ABP) है। ABP उपकरणों का कार्यान्वयन हतोत्साहित किया जाता है क्योंकि कोई जॉइन प्रक्रिया नहीं की जाती है, जिसका अर्थ है कि सत्र कुंजियाँ हमेशा के लिए वही रहती हैं। एक उपकरण जो अपनी सत्र कुंजियाँ नहीं बदलता, वह विभिन्न हमलों जैसे कि छिपकर सुनना या रीप्ले के लिए प्रवण होता है। | सभी वैयक्तिकरण द्वारा सक्रिय (ABP) उपकरणों को यदि संभव हो तो ओवर-द-एयर सक्रिय (OTAA) उपकरणों से बदल दिया जाना चाहिए। ABP उपकरणों का कार्यान्वयन हतोत्साहित है। |
| LAF-007 | अपेक्षा से छोटा काउंटर प्राप्त हुआ (0 से भिन्न) | LafPacketAnalysis.py | मध्यम | यदि कोई हमलावर सत्र कुंजियों की एक जोड़ी प्राप्त करता है (OTAA उपकरणों में AppKey चुराकर या ABP उपकरणों में AppSKey/NwkSKey चुराकर), तो वह सर्वर को नकली मान्य डेटा भेजने में सक्षम होगा। सर्वर को स्पूफ किए गए संदेशों को स्वीकार करने के लिए, संदेश का FCnt (फ्रेम काउंटर) अंतिम भेजे गए संदेश के FCnt से अधिक होना आवश्यक है। ऐसे परिदृश्य में जहां मूल स्पूफ किया गया उपकरण संदेश भेजता रहता है, सर्वर (मान्य) संदेशों को अस्वीकार करना शुरू कर देगा क्योंकि उनका FCnt छोटा होगा। इसलिए, जब अपेक्षा से छोटे FCnt मान वाले संदेश प्राप्त हो रहे हैं, तो यह अनुमान लगाना संभव है कि एक समानांतर सत्र स्थापित किया गया था। | यदि उपकरण ओवर-द-एयर सक्रिय (OTAA) उपकरण है, तो इसकी AppKey बदलें क्योंकि यह संभवतः समझौता हो गया था। यदि यह वैयक्तिकरण द्वारा सक्रिय है, तो इसकी AppSKey और NwkSKey बदलें। इसके अलावा, सुनिश्चित करें कि लोरावन सर्वर अद्यतित है और डुप्लिकेट संदेशों को स्वीकार नहीं कर रहा है। |
| LAF-008 | JoinRequest के साथ पासवर्ड क्रैक हुआ | LafBruteforcer.py | उच्च | ज्ञात AppKey का उपयोग करके JoinRequest संदेश को डिक्रिप्ट करना संभव था। | विक्रेताओं द्वारा प्रदान किए गए AppKey से भिन्न AppKey का उपयोग करें या अधिक यादृच्छिक कुंजियाँ उपयोग करें। |
| LAF-009 | पासवर्ड क्रैक हुआ | LafBruteForcer.py | उच्च | डिवाइस का AppKey एक सुप्रसिद्ध या गैर-यादृच्छिक स्ट्रिंग के साथ प्रयास करके पाया गया। इसे जॉइन संदेशों (अनुरोध और स्वीकृति) की एक जोड़ी का उपयोग करके डिक्रिप्ट किया गया था। | AppKey के लिए एक यादृच्छिक कुंजी जनरेटर का उपयोग करें, न कि विक्रेताओं द्वारा प्रदान किए गए कुंजियों का। इसके अलावा, एक से अधिक उपकरणों को एक ही AppKey सेट न करें और पूर्वानुमेय तर्क (जैसे वृद्धिशील मान, कुछ बाइट्स फ़्लिप करना, आदि) का उपयोग करके AppKey उत्पन्न न करें। |
| LAF-010 | गेटवे का स्थान बदल गया | LafPacketAnalysis.py | मध्यम | यदि गेटवे को अपना स्थान बदलने वाला नहीं है। यह चोरी हो सकता है, स्थानांतरित हो सकता है, या कोई नकली गेटवे वैध गेटवे का प्रतिरूपण करने का प्रयास कर रहा हो सकता है। | सुनिश्चित करें कि गेटवे के साथ छेड़छाड़ नहीं की गई है, भौतिक या तार्किक रूप से। |