Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
laf — يهدف هذا المشروع إلى توفير مجموعة من الأدوات لصياغة وتحليل وإرسال وفحص واختراق مجموعة من حزم LoRaWAN بهدف تدقيق أو اختبار أمان البنية التحتية لـ LoRaWAN. | Kitploit
أدوات/GitHubGitHub/ioactive/laf
التقاط وتحليل الحزمأمان إنترنت الأشياءتحليل الثغرات الأمنيةالاستغلالالاختبار العشوائيأمن الشبكات اللاسلكيةالتشفيراختبار الاختراق
GitHubioactive/laf

laf

يهدف هذا المشروع إلى توفير مجموعة من الأدوات لصياغة وتحليل وإرسال وفحص واختراق مجموعة من حزم LoRaWAN بهدف تدقيق أو اختبار أمان البنية التحتية لـ LoRaWAN.

عرض المستودع
18737منذ 3 سنواتتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

إطار عمل تدقيق LoRaWAN - نسخة ألفا

تستمر عمليات نشر إنترنت الأشياء في النمو، وجزء من هذا النمو الكبير يتكون من ملايين أجهزة الاستشعار منخفضة الطاقة واسعة النطاق (LPWAN) المنتشرة في مئات المدن (المدن الذكية) حول العالم، وكذلك في المصانع والمنازل. واحدة من أكثر تقنيات LPWAN استخدامًا هي LoRa، والتي تعتبر LoRaWAN معيار الشبكة لها (طبقة MAC). LoRaWAN هو بروتوكول آمن مع تشفير مدمج، ولكن مشكلات التنفيذ ونقاط الضعف تؤثر على أمان معظم عمليات النشر الحالية.

يهدف هذا المشروع إلى توفير مجموعة من الأدوات لصياغة وتحليل وإرسال وتحليل واختبار مجموعة من حزم LoRaWAN بهدف تدقيق أو اختبار اختراق أمان البنية التحتية لشبكة LoRaWAN.

أدناه، هيكل هذا المستودع:

root@kitploit:~
|-- 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 الخاص بك:

  1. الأول مخصص للأشخاص الذين يرغبون في تثبيته محليًا. نوصي بهذا الخيار إذا كان هدفك الرئيسي هو استخدام أدوات اختبار الاختراق الموجودة في دليل tools/، وذلك لتجنب مشاكل تعيين المنفذ في Docker.
  2. الخيار الآخر مخصص للأشخاص الذين يرغبون في تشغيله داخل حاوية Docker، وبالتالي تجنب تثبيت أي تبعيات يدويًا. نوصي بهذا الخيار إذا كنت ترغب في استخدام المحللات وليس لديك وقت كافٍ لإعداد البيئة يدويًا.
  3. بالطبع، يمكنك تشغيل LAF محليًا واستخدام قاعدة بيانات Postgres من حاوية Docker بدلاً من sqlite ;). سيحاول LAF الاتصال بـ Postgres عبر localhost. راجع التعليمات أدناه لإعداد Docker.

تثبيت LAF في بيئتك المحلية

ستحصل هذه التعليمات على نسخة من المشروع وتبعياته على جهازك المحلي. الأوامر أدناه مخصصة لبيئة تعتمد على Debian:

  1. استنساخ هذا المستودع: git clone --recurse-submodules https://github.com/IOActive/laf.git

  2. تثبيت python3:

    1. sudo apt-get update
    2. sudo apt-get install python3.6
  3. تنزيل وتثبيت تبعيات بايثون:

    1. sudo pip3 install paho-mqtt && sudo pip3 install sqlalchemy && sudo pip3 install psycopg2-binary &&sudo pip3 install python-dateutil
  4. تعيين PYTHONPATH و ENVIRONMENT

    1. cd laf && export PYTHONPATH=$(pwd) && export ENVIRONMENT='DEV'
  5. تثبيت وإعداد golang:

    1. قم بتنزيل golang من https://golang.org/dl/ حسب نظام التشغيل الخاص بك.
    2. انتقل إلى المجلد حيث تم تنزيل مثبت go: cd ~/Downloads
    3. قم بفك ضغط المثبت: sudo tar -C /usr/local -xvzf YOUR_GOLANG_FILE
    4. أضفه إلى PATH: export PATH=$PATH:/usr/local/go/bin
    5. تعيين GOPATH: export GOPATH="$HOME/go"

وهذا كل شيء!

تثبيت LAF باستخدام Docker

هذا الأسلوب يتجنب التعامل مع تثبيت التبعيات ويبدأ تشغيل قاعدة بيانات PostgreSQL حيث تقوم الأدوات بحفظ الحزم والبيانات. الحاويات:

  • الأدوات.
  • PostgreSQL.
  • PgAdmin4.

الخطوات:

  1. استنساخ هذا المستودع: git clone https://github.com/IOActive/laf.git
  2. انتقل إلى cd laf/
  3. قم بتشغيل الحاويات: docker-compose up --build
  4. إذا كنت ترغب في استخدام الأدوات داخل الحاوية: docker exec -ti laf_tools_1 /bin/bash
  5. استمتع!

اتصال قاعدة بيانات pgAdmin

يمكنك التحقق من البيانات في قاعدة البيانات باستخدام pgAdmin:

أولاً، الوصول إلى pgAdmin:

  • الرابط: http://localhost:5001
  • المستخدم: pgadmin
  • كلمة المرور: pgadmin

ثم، تحتاج إلى إضافة الخادم:

  • المضيف: db
  • المنفذ: 5432
  • المستخدم: postgres
  • كلمة المرور: postgres

وصف الأدوات

فيما يلي وصف للأدلة والأدوات / الوظائف بداخلها.

/tools

الغرض الرئيسي من الأدوات المقدمة في هذا الدليل هو تسهيل تنفيذ اختبار الاختراق للبنية التحتية لشبكة LoRaWAN.

UdpSender.py

هذه الأداة مخصصة لإرسال الحزم الصاعدة (إلى خادم الشبكة أو gatewayBridge، حسب البنية التحتية) أو الحزم الهابطة (إلى packet-forwarder). اختياريًا، يمكن تشويش الحزم ويمكن حساب MIC صالح.

الوسائط الاختيارية:

root@kitploit:~
-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
                        عنوان الجهاز للانتحال، معطى بتنسيق سداسي عشري (إجمالي 8 أحرف)،
                        على سبيل المثال AABB0011.
--fcnt FCNT           عداد الإطار الذي سيتم تعيينه في حزمة البيانات المعطاة.
                        لن يعمل هذا في JoinRequest/JoinAccept لأن هذه الحزم لا تحتوي على fCnt

الوسائط المطلوبة:

root@kitploit:~
--dst-ip DST_IP       عنوان IP الوجهة، على سبيل المثال --dst-ip 192.168.3.101.
--dst-port DST_PORT   منفذ الوجهة، على سبيل المثال --dst-port 623.
--data DATA           حزمة UDP. يمكن أيضًا إضافة حزم أخرى في
                        مصفوفة "data" في نهاية هذا السكربت. يجب أن تكون الحزمة
                        سلسلة بايت (سيكون عليك الهروب من علامات الاقتباس المزدوجة). ***مثال***
                        بتنسيق packet_forwarder: --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=\"}]}'" ***مثال*** باستخدام تنسيق gatevice
                        [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}'"

مثال:

لإرسال حزمة واحدة كل ثانيتين إلى (localhost, 10001) من المنفذ 10000 مع تشويش عشوائي لـ MIC و FCounter:

root@kitploit:~
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=\"}]}'"

UdpProxy.py

هذا الوكيل UDP مخصص بشكل أساسي للوضع بين سلسلة من البوابات (packet_forwarders) وخادم الشبكة أو gateway Bridge حسب البنية التحتية التي يتم تقييمها. كما يوفر إمكانية تشويش البيانات في الاتجاه المطلوب (صاعد أو هابط)

الوسائط الاختيارية:

root@kitploit:~
-h, --help            عرض رسالة المساعدة هذه والخروج
--collector-port COLLECTOR_PORT
                        منفذ تجميع بيانات packet forwarder، على سبيل المثال --collector-
                        port 1701. انظر
                        auditing/datacollectors/PacketForwarderCollector.py
--collector-ip COLLECTOR_IP
                        عنوان IP لتجميع بيانات packet forwarder. القيمة الافتراضية هي
                        localhost. على سبيل المثال --collector-ip 192.168.1.1. انظر
                        auditing/datacollectors/PacketForwarderCollector.py
--fuzz-in FUZZ_IN [FUZZ_IN ...]
                        تشويش البيانات المرسلة إلى منفذ الوجهة في الأوضاع المحددة (انظر
                        أوضاع التشويش في 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 الخاص به وطباعته
                        بنص عادي. يمكنك أيضًا إدخال AppKey إذا كنت ترغب في فك تشفير
                        Join Accept معين. على سبيل المثال
                        00112233445566778899AABBCCDDEEFF
-p PATH, --path PATH  مسار الملف حيث سيتم حفظ البيانات. إذا لم يتم تقديمه،
                        لن يتم حفظ البيانات.
--no-log              لا تطبع حزم UDP في وحدة التحكم
--no-parse            لا تقم بتحليل PHYPayload. إذا تم تحديد هذا الخيار،
                        لن يتم استيراد مكتبات Golang من /lorawanwrapper/ (تجميع
                        مكتبات golang غير مطلوب)
                    

الوسائط المطلوبة:

root@kitploit:~
--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).

root@kitploit:~
python3 UdpProxy.py --port 1234 --dst-ip 127.0.0.1 --dst-port 1235 --fuzz-in 9

TcpProxy.py

هذا الوكيل TCP مخصص بشكل أساسي للوضع بين خادم الشبكة ووسطاء MQTT. كما يوفر إمكانية تشويش البيانات.

الوسائط الاختيارية:

root@kitploit:~
-h, --help            عرض رسالة المساعدة هذه والخروج
--fuzz-in FUZZ_IN [FUZZ_IN ...]
                    تشويش البيانات المرسلة إلى منفذ الوجهة في الأوضاع المحددة (انظر
                    أوضاع التشويش في utils/fuzzer.py)

الوسائط المطلوبة:

root@kitploit:~
--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)

root@kitploit:~
    python3 TcpProxy.py --lcl-port 1884 --dst-ip 127.0.0.1 --dst-port 1883

tools/lorawan

يحتوي هذا الدليل على سلسلة من النصوص البرمجية لتحليل وصياغة وكسر القوة العمياء لحزم LoRaWAN.

lorawan/BruteForcer.py

يستقبل هذا النص البرمجي JoinAccept أو JoinRequest بتنسيق Base64 ويحاول فك تشفير AppKey الخاص به باستخدام مجموعة من المفاتيح المحتملة التي يمكن توفيرها في ملف أو يمكن إنشاؤها أثناء التشغيل.

الوسائط الاختيارية:

root@kitploit:~
-h, --help            عرض رسالة المساعدة هذه والخروج
-k KEYS, --keys KEYS  ملف يحتوي على قائمة بالمفاتيح، مفصولة بـ \n. سيتم
                        استخدام /auditing/analyzers/bruteForcer/keys.txt افتراضيًا
--dont-generate       حدد هذا الخيار إذا كنت لا ترغب في إنشاء مفاتيح
                        أثناء التشغيل بالمجموعات التالية: 1- دمج البايت الأول
                        والخمسة عشر بايت الأخيرة. على سبيل المثال
                        AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 2- دمج المواضع الزوجية
                        والفردية للبايتات بالتساوي. على سبيل المثال
                        AABBAABBAABBAABBAABBAABBAABBAABB 3- أول 14 بايت
                        بقيمة 00 ودمج آخر 2. على سبيل المثال
                        0000000000000000000000000000BA01

الوسائط المطلوبة:

root@kitploit:~
-a ACCEPT, --accept ACCEPT
                Join Accept بتنسيق Base64 لكسر القوة العمياء. على سبيل المثال -a
                IHvAP4MXo5Qo6tdV+Yfk08o=
-r REQUEST, --request REQUEST
                Join Request بتنسيق Base64 لكسر القوة العمياء. على سبيل المثال
                -r AMQAAAAAhQAAAgAAAAAAAADcYldcgbc=

مثال:

اختراق JoinRequest باستخدام مجموعة مفاتيح من my-keys.txt وإنشاء حوالي 200000 مفتاح إضافي ديناميكيًا.

root@kitploit:~
python3 BruteForcer.py -a IHvAP4MXo5Qo6tdV+Yfk08o= -r AMQAAAAAhQAAAgAAAAAAAADcYldcgbc= -k ./my-keys.txt
lorawan/MicGenerator.py

يستقبل هذا النص البرمجي حزمة PHYPayload بتنسيق Base64 ومفتاح يمكن أن يكون NwkSKey أو AppKey حسب نوع الحزمة ويقوم بإنشاء MIC الجديد.

الوسائط الاختيارية:

root@kitploit:~
-h, --help            عرض رسالة المساعدة هذه والخروج
--jakey JAKEY         [JoinAccept فقط]. أدخل المفتاح المستخدم لتشفير
                        JoinAccept سابقًا (بتنسيق سداسي عشري، إجمالي 32
                        حرفًا / 16 بايت). لا يمكن التحقق من ذلك مسبقًا
                        بواسطة هذا البرنامج. على سبيل المثال
                        00112233445566778899AABBCCDDEEFF. مثال لمفتاح صالح
                        لـ JoinAccept "IB1scNmwJRA32RfMbvwe3oI=" هو
                        "f5a3b185dfe452c8edca3499abcd0341"

الوسائط المطلوبة:

root@kitploit:~
-d DATA, --data DATA  بيانات بصيغة Base64 ليتم توقيعها. على سبيل المثال -d
                        AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU=
-k KEY, --key KEY     أدخل المفتاح الجديد (بتنسيق سداسي عشري، إجمالي 32
                        حرفًا / 16 بايت) لتوقيع الحزم (حساب وإضافة MIC جديد).
                        لاحظ أنه بالنسبة لـ JoinRequest/JoinAccept يجب أن يكون
                        AppKey، وبالنسبة لحزم البيانات NwkSKey. لا يمكن التحقق
                        من ذلك مسبقًا بواسطة هذا البرنامج. على سبيل المثال
                        00112233445566778899AABBCCDDEEFF

مثال:

توقيع PHYPayload المعطى باستخدام AppKey 00112233445566778899AABBCCDDEEFF.

root@kitploit:~
python3 MicGenerator.py -d AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU= -k 00112233445566778899AABBCCDDEEFF
lorawan/PacketCrafter.py

يستقبل هذا النص البرمجي حزمة JSON من LoRaWAN ويحولها إلى Base64. يقوم بالعكس مما يفعله packetParser.py، لذا يمكن استخدام مخرجات هذا النص هنا والعكس صحيح.

الوسائط الاختيارية:

root@kitploit:~
-h, --help            عرض رسالة المساعدة هذه والخروج
-k KEY, --key KEY     أدخل مفتاح AppSKey أو AppKey لجهاز (بتنسيق سداسي عشري،
                        إجمالي 32 حرفًا / 16 بايت) لتشفير FRMPayload أو
                        Join Accept. على سبيل المثال
                        F5A3B185DFE452C8EDCA3499ABCD0341
--nwkskey NWKSKEY     أدخل مفتاح جلسة الشبكة إذا كنت ترغب في
                    إنشاء حزمة بيانات مع MIC صالح.

الوسائط المطلوبة:

root@kitploit:~
-j JSON, --json JSON  كائن JSON للتحليل. على سبيل المثال -j '{"mhdr":
                        {"mType":"JoinRequest","major":"LoRaWANR1"},"macPayloa
                        d":{"joinEUI":"55d239ac716f234d","devEUI":"b827eb891cf
                        50003","devNonce":51639},"mic":"7005c4a5"}'

مثال:

الحصول على JoinRequest PHYPayload بتنسيق Base64 مع القيم المعطاة في JSON.

root@kitploit:~
python3 PacketCrafter.py -j '{"mhdr":{"mType":"JoinRequest","major":"LoRaWANR1"},"macPayload":{"joinEUI":"55d239ac716f234d","devEUI":"b827eb891cf50003","devNonce":51639},"mic":"7005c4a5"}'
                      
lorawan/PacketParser.py

يقوم هذا النص البرمجي بتحليل وطباعة حزمة PHYPayload واحدة من LoRaWAN بتنسيق Base64. يقوم بالعكس مما يفعله packetCrafter.py، لذا يمكن استخدام مخرجات هذا النص هنا والعكس صحيح.

الوسائط الاختيارية:

root@kitploit:~
-h, --help            عرض رسالة المساعدة هذه والخروج
-k KEY, --key KEY     أدخل مفتاح AppKey أو AppSKey لجهاز حسب
                        الحزمة المراد فك تشفيرها (join accept أو حزمة بيانات).
                        يجب أن يكون بتنسيق سداسي عشري، إجمالي 32 حرفًا / 16
                        بايت. على سبيل المثال 00112233445566778899AABBCCDDEEFF

الوسائط المطلوبة:

root@kitploit:~
-d DATA, --data DATA  بيانات بصيغة Base64 ليتم تحليلها. على سبيل المثال -d
                    AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU=

مثال:

الحصول على JoinRequest بتنسيق JSON من المثال أعلاه.

root@kitploit:~
python3 PacketParser.py -d AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU=
lorawan/SessionKeysGenerator.py

يستقبل هذا النص البرمجي JoinAccept و JoinRequest بتنسيق Base64، ومفتاح AppKey لإنشاء مفاتيح الجلسة. مثال على الاستخدام:

الوسائط الاختيارية:

root@kitploit:~
-h, --help            عرض رسالة المساعدة هذه والخروج

الوسائط المطلوبة:

root@kitploit:~
-a JACCEPT, --jaccept JACCEPT
                    حمولة JoinAccept بتنسيق base64
-r JREQUEST, --jrequest JREQUEST
                    حمولة JoinRequest بتنسيق base64
-k KEY, --key KEY     أدخل مفتاح AppKey لجهاز (بتنسيق سداسي عشري، إجمالي 32
                    حرفًا / 16 بايت). على سبيل المثال
                    00112233445566778899AABBCCDDEEFF

مثال:

الحصول على AppSKey و NwkSKey باستخدام بيانات الانضمام التالية.

root@kitploit:~
python3 SessionKeysGenerator.py -r AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU= -a IB1scNmwJRA32RfMbvwe3oI= -k f5a3b185dfe452c8edca3499abcd0341
lorawan/utils/*

هذه هي الدوال المساعدة التي تستخدمها UdpSender.py و UdpProxy.py. في Fuzzer.py يمكنك رؤية أوضاع التشويش المنفذة.

/auditing

الغرض العام من هذا الدليل هو جمع حزم LoRaWAN وتحليل جوانب مختلفة من حركة المرور، بالإضافة إلى محاولة مجموعة من المفاتيح لمحاولة كسر القوة العمياء لـ AppKey.

/auditing/datacollectors

يحتوي هذا الدليل على مجموعة من النصوص البرمجية التي تستقبل حزم LoRaWAN من مصادر مختلفة (مثل gateway packet_forwarder، The Things Network، إلخ) وتحفظها في ملفات، بتنسيق قياسي. يجب أن يتم جلب هذه الملفات لاحقًا بواسطة النص /auditing/analyzers/LafProcessData.py لتنفيذ أدوات فرعية مختلفة.

datacollectors/GenericMqttCollector.py

يتصل هذا النص البرمجي بوسيط mqqt، ويسترجع جميع المواضيع ويحفظ الرسائل في ملف في الحقل المحدد. يتكون اسم الملف من التاريخ الذي تم فيه بدء هذا النص البرمجي.

الوسائط الاختيارية:-h, --help عرض رسالة المساعدة هذه والخروج --collector-id COLLECTOR_ID معرف مجمع البيانات. سيتم ربط هذا المعرف بالحزم المحفوظة في قاعدة البيانات. مثال: --id 1 --organization-id ORGANIZATION_ID معرف المجمع. سيتم ربط هذا المعرف بالحزم المحفوظة في قاعدة البيانات. مثال: --id 1 --topics TOPICS [TOPICS ...] قائمة بالموضوعات التي تريد الاشتراك فيها، مفصولة بمسافات. إذا لم يتم إعطاء أي شيء، فسيكون الافتراضي هو "#".

الوسائط المطلوبة:

root@kitploit:~
--ip IP               عنوان IP لوسيط MQTT، مثال: --ip 192.168.3.101.
--port PORT           منفذ وسيط MQTT، مثال: --port 623.

مثال:

الاتصال بوسيط MQTT بعنوان IP 200.200.200.200 على المنفذ الافتراضي (1883).

root@kitploit:~
python3 GenericMqttCollector.py --ip 200.200.200.200 --port 1883
datacollectors/LoraServerIOCollector.py

يتصل هذا السكربت بوسيط mqqt لخادم loraserver.io ويحفظ الرسائل في قاعدة البيانات. يجب عليك تحديد معرف مجمع فريد، ويمكنك تحديد الموضوعات التي تريد الاشتراك فيها.

الوسائط الاختيارية:

root@kitploit:~
-h, --help            عرض رسالة المساعدة هذه والخروج
--port PORT           منفذ وسيط MQTT، مثال: --port 623. الافتراضي 1883.
--collector-id COLLECTOR_ID
                        معرف مجمع البيانات. سيتم ربط هذا المعرف
                        بالحزم المحفوظة في قاعدة البيانات. مثال: --id 1
--organization-id ORGANIZATION_ID
                        معرف المجمع. سيتم ربط هذا المعرف
                        بالحزم المحفوظة في قاعدة البيانات. مثال: --id 1
--topics TOPICS [TOPICS ...]
                        قائمة بالموضوعات التي تريد الاشتراك فيها، مفصولة بمسافات.
                        إذا لم يتم إعطاء أي شيء، فسيكون الافتراضي هو "#".

الوسائط المطلوبة:

root@kitploit:~
--ip IP               عنوان IP لوسيط MQTT، مثال: --ip 192.168.3.101.
datacollectors/PacketForwarderCollector.py

يستقبل هذا السكربت حزم UDP من وكيل UDP في البوابة بصيغة packet_forwarder ويحفظها بشكل دائم.

الوسائط الاختيارية:

root@kitploit:~
-h, --help            عرض رسالة المساعدة هذه والخروج
--collector-id COLLECTOR_ID
                        معرف مجمع البيانات. سيتم ربط هذا المعرف
                        بالحزم المحفوظة في قاعدة البيانات. مثال: --id 1
--organization-id ORGANIZATION_ID
                        معرف المجمع. سيتم ربط هذا المعرف
                        بالحزم المحفوظة في قاعدة البيانات. مثال: --id 1

الوسائط المطلوبة:

root@kitploit:~
-n NAME, --name NAME  معرف نصي فريد لمجمع البيانات. مثال:
                    --name semtech_collector
-p PORT, --port PORT  المنفذ الذي سيستمع لحزم UDP. --port 1702.

مثال:

تسجيل البيانات بين بوابة ترسل إلى المنفذ المحلي 1700 وخادم شبكة يستمع على (localhost, 1701). حفظ البيانات في الدليل ./.

root@kitploit:~
    python3 PacketForwarderCollector.py --name semtech_collector --port 1700

analyzers/LafProcessData.py

يقرأ هذا السكربت من ملف أو ملفات أو الإدخال القياسي وينفذ أدوات فرعية مختلفة. اعتمادًا على الخيار المحدد، يمكنك تنفيذ تحليل لحركة مرور LoRaWAN، أو محاولة كسر AppKey بالقوة الغاشمة، أو تحليل جميع الحزم المستلمة. يمكن دمج هذه الخيارات.

الوسائط الاختيارية:

root@kitploit:~
يقرأ هذا السكربت الحزم من قاعدة البيانات وينفذ أدوات فرعية مختلفة.
بعد ذلك، ستحفظ كل أداة فرعية بيانات المخرجات في قاعدة البيانات. انظر كل خيار
لمزيد من المعلومات.

الوسائط الاختيارية:
  -h, --help            عرض رسالة المساعدة هذه والخروج
  -a, --analyze         جمع وتحليل جوانب مختلفة من حركة المرور. إذا تم
			تفعيل أداة كسر القوة الغاشمة (-b)، فسيتم ربط النتائج
  -b, --bforce          محاولة كسر AppKeys بالقوة الغاشمة باستخدام
			حمولات JoinRequests و JoinAccepts
  -k KEYS, --keys KEYS  [أداة كسر القوة الغاشمة] مسار ملف المفاتيح. إذا لم يتم توفيره،
			فسيتم استخدام "bruteForcer/keys.txt"
  --no-gen              [أداة كسر القوة الغاشمة] لا تقم بتوليد مفاتيح، فقط جرب
			المفاتيح من الملفات
  -p, --parse           تحليل PHYPayload إلى معلومات قابلة للقراءة
  --from-id FROM_ID     معرف الحزمة الذي يبدأ المعالجة منه.
  --to-id TO_ID         آخر معرف حزمة يجب معالجته.

مثال:

معالجة الحزم في قاعدة البيانات بدءًا من معرف الحزمة 1000، وتنفيذ تحليل حركة المرور، ومحاولة كسر AppKeys المعطاة في my-keys.txt، ولكن لا تقم بتوليد المزيد من المفاتيح ديناميكيًا.

root@kitploit:~
    python3 LafProcessData.py -a -b -k my-keys.txt --no-gen --from-id 1000

analyzers/bruteforcer, analyzers/dataanalysis, analyzers/parser and analyzers/utils

توفر هذه السكربتات الوظائف التي يديرها LafProcessData.py. فيما يلي التنبيهات التي ينفذها LafPacketAnalysis.py و LafBruteForcer.py:

/lorawanwrapper

يوفر هذا الدليل مجموعة من الأدوات المساعدة (wrappers) للمكتبة https://github.com/brocaar/lorawan/، وهي مكتوبة بلغة Golang. يتم تنفيذ هذه الدوال بواسطة الأدوات.

/scripts

هنا ستجد سلسلة من السكربتات المصممة لأتمتة مهام مختلفة. تأكد من منحها إذن التنفيذ إذا لزم الأمر (chmod +x your_script لأنظمة Linux/MacOS).

/scripts/lorawan_gateway_scripts

قم بإعداد بوابتك بسهولة وتبديل قنواتها لأغراض التنصت. لمزيد من المعلومات حول كيفية استخدامها، يمكنك الاطلاع على ملف readme في هذا الدليل.

gateway_channel_changer/LoRa-GW-Installer.sh

يستخدم هذا السكربت لتثبيت جميع حزم البرامج اللازمة على Raspberry PI لبناء بوابة LoRaWAN مع موحد LoRa متصل (iC980-SPI، RHF0M301-SPI، RAK831-SPI أو أي آخر عن طريق الإعداد اليدوي).

gateway_channel_changer/Continuous-Channel-Switch.sh و gateway_channel_changer/LoRa-GW-Channel-Setup.sh

نظرًا لأنه لا يمكن معرفة الترددات التي تعمل بها أجهزة LoRa، فقد أنشأنا سكربتًا يمكنه تبديل قنوات البوابات من نطاقي التردد US915 و EU868 لأغراض التنصت. على الرغم من وجود بوابات احترافية باهظة الثمن تدعم 32 أو 64 قناة، إلا أن معظم البوابات تدعم ما يصل إلى 8 قنوات. تم تصميم هذا السكربت للعمل في هذا النوع من البوابات.

على الأقل في نطاق التردد US915، فإن أول 8 قنوات هي الأكثر استخدامًا. ولكن هناك تطبيقات معروفة تستخدم مجموعة أخرى من القنوات، مثل "The Things Networks"، والتي تستخدم المجموعة الثانية (8-15) من القنوات للاتصال الصاعد.

حاليًا لا ندعم نطاقات تردد أخرى، ولكن مع بعض التغييرات الطفيفة على هذه السكربتات ستتمكن من القيام بذلك بنفسك :).

فيديو توضيحيقمنا برفع فيديو لهذا الإطار قيد التشغيل (نفس السيناريو المعروض في BlackHat 2019): https://youtu.be/Mm6A2RVNoCs. الخطوات التفصيلية للعرض موجودة في وصف فيديو يوتيوب.

المؤلفون

  • Matias Sequeira - matiassequeira
  • Esteban Martínez Fayó - emfayo

المساهمون

  • Sebastian Scheibe - ساهم بـ scripts/lorawan_gateway_scripts - sebascheibe

المساهمة

TODO

الإقرارات

  • عميل MQTT للغة Python: https://github.com/iwanbk/nyamuk/
  • مكتبة LoRaWAN بلغة Golang: https://github.com/brocaar/lorawan/
  • دوال للتعامل مع JSON بلغة Golang https://github.com/tidwall/sjson و https://github.com/tidwall/gjson
  • أساس الـ tcpProxy الخاص بنا: https://gist.github.com/voorloopnul/415cb75a3e4f766dc590
  • Loracrack: تم اشتقاق وتعديل المستودع الأصلي https://github.com/applied-risk/Loracrack

الترخيص

هذا المشروع مرخص تحت رخصة BSD-3-Clause.

تنزيل الأداة
  • تجميع مكتبة go:

    1. cd laf/lorawanwrapper/utils
    2. go build -o lorawanWrapper.so -buildmode=c-shared jsonUnmarshaler.go lorawanWrapper.go micGenerator.go sessionKeysGenerator.go hashGenerator.go
  • حسب قاعدة البيانات التي ترغب في استخدامها:

    a. PostgreSQL: اتبع التعليمات 'تثبيت LAF باستخدام Docker' حتى الخطوة الثالثة.

    b. SQLite:

    1. cd laf/auditing/db
    2. قم بتعديل __init__.py باستخدام محرر النصوص المفضل لديك وقم بتعليق الأسطر الخاصة باستخدام Postgres (اتصال قاعدة البيانات ومتغيرات البيئة) وقم بإلغاء تعليق السطر الخاص باستخدام sqlite.
  • IDالعنوانالمحللمستوى المخاطرةالوصفالإجراء الموصى به
    LAF-001تكرار DevNonceLafPacketAnalysis.pyمنخفضيجب أن تكون DevNonces لكل جهاز عشوائية بما يكفي لعدم التصادم. إذا تكرر نفس DevNonce في رسائل عديدة، فيمكن استنتاج أن الجهاز يتعرض لهجوم إعادة تشغيل. وهذا يعني أن المهاجم الذي التقط طلب انضمام (JoinRequest) ويحاول إرساله مرة أخرى إلى البوابة.تحقق من كيفية توليد DevNonces: يجب تنفيذ الوظيفة التي تولدها باستخدام مكتبة عشوائية. علاوة على ذلك، يجب التأكد من أن الخادم يتحقق من DevNonces التاريخية (يجب حفظها في قاعدة البيانات)، وذلك لعدم قبول طلب انضمام صالح قديم تم إرساله سابقًا من الجهاز وبالتالي توليد جلسة جديدة.
    LAF-002مشاركة DevEUI لنفس DevAddrLafPacketAnalysis.pyمعلوماتقد يكون تم تعيين نفس DevAddr لجهازين مختلفين. هذا ليس تهديدًا أمنيًا.إذا تم تفعيل الجهاز عبر الهواء (OTAA): تحقق من المنطق المستخدم لتعيين DevAddrs، وتأكد من أن الخادم لا يعين نفس DevAddr لأجهزة مختلفة. إذا تم تفعيل الجهاز بالتخصيص (ABP): تحقق من DevAddr المكون في برمجية الجهاز الثابتة ليكون فريدًا في شبكة LoRaWAN.
    LAF-003إعادة تشغيل الانضمام (Join replay)TODOمتوسطتم اكتشاف حزمة طلب انضمام مكررة، مما قد يعني أن خادم LoRaWAN يتعرض لهجوم إعادة تشغيل. وهذا يعني أن المهاجم الذي ربما التقط حزمة طلب انضمام سابقة ويعيد إرسالها إلى خادم LoRaWAN، لمحاولة توليد جلسة جديدة.تحقق من كيفية توليد DevNonces: يجب تنفيذ الوظيفة التي تولدها باستخدام مكتبة عشوائية. علاوة على ذلك، يجب التأكد من أن الخادم يتحقق من DevNonces التاريخية (يجب حفظها في قاعدة البيانات)، وذلك لعدم قبول طلب انضمام صالح قديم تم إرساله سابقًا من الجهاز وبالتالي توليد جلسة جديدة.
    LAF-004إعادة تشغيل حزم البيانات الصاعدة (Uplink)TODOمتوسطتم اكتشاف حزمة صاعدة مكررة، مما قد يعني أن خادم LoRaWAN يتعرض لهجوم إعادة تشغيل. وهذا يعني أن المهاجم الذي ربما التقط حزمة صاعدة (مرسلة من الجهاز) ويعيد إرسالها إلى خادم LoRaWAN.في الأجهزة المُفعّلة عبر الهواء (OTAA): تأكد من إعادة توليد مفاتيح الجلسة بعد كل إعادة تعيين للجهاز أو تجاوز العداد لتجنب أي تأثير من هذا الهجوم. في الأجهزة المُفعّلة بالتخصيص (ABP) من LoRaWAN v1.0.*، لا يمكن فعل أي شيء لمنع هجوم إعادة التشغيل إلا تحويل الجهاز إلى OTAA.
    LAF-005إعادة تشغيل حزم البيانات الهابطة (Downlink)TODOعاليتم اكتشاف حزمة هابطة مكررة. الخادم يستجيب لهجوم إعادة تشغيل أو يولد حركة مرور غير نمطية للأجهزةتحقق من سجلات الخادم وتأكد من تنفيذ الإجراءات الموصى بها السابقة
    LAF-006جهاز ABP محتمل (إعادة تعيين العداد وعدم الانضمام)LafPacketAnalysis.pyعاليإذا تم إعادة تعيين العداد (عاد إلى 0)، وبقي DevAddr كما هو، ولم يتم اكتشاف أي عملية انضمام سابقة، فقد يعني ذلك أن الجهاز مُفعّل بالتخصيص (ABP). يُنصح بعدم استخدام الأجهزة المُفعّلة بالتخصيص (ABP) لأنه لا يتم إجراء عملية انضمام، مما يعني أن مفاتيح الجلسة تبقى كما هي إلى الأبد. الجهاز الذي لا يغير مفاتيح جلساته يكون عرضة لهجمات مختلفة مثل التنصت أو إعادة التشغيل.يجب استبدال جميع الأجهزة المُفعّلة بالتخصيص (ABP) بأجهزة مُفعّلة عبر الهواء (OTAA) إذا أمكن. يُنصح بعدم تنفيذ الأجهزة المُفعّلة بالتخصيص (ABP).
    LAF-007استلام عداد أصغر من المتوقع (يختلف عن 0)LafPacketAnalysis.pyمتوسطإذا حصل المهاجم على زوج من مفاتيح الجلسة (بسبب سرقة AppKey في أجهزة OTAA أو AppSKey/NwkSKey في أجهزة ABP)، فسيكون قادرًا على إرسال بيانات مزيفة صالحة إلى الخادم. لقبول الخادم للرسائل المزيفة، يجب أن يكون FCnt (عداد الإطار) للرسالة أعلى من FCnt لآخر رسالة مرسلة. في سيناريو حيث يستمر الجهاز الأصلي المُزوَّر في إرسال الرسائل، سيبدأ الخادم في تجاهل الرسائل (الصحيحة) لأنها ستحتوي على FCnt أصغر. وبالتالي، عند استلام رسائل بقيمة FCnt أصغر من المتوقع من قبل خادم LoRaWAN، فمن الممكن استنتاج أنه تم إنشاء جلسة موازية.إذا كان الجهاز مُفعّلاً عبر الهواء (OTAA)، قم بتغيير AppKey الخاص به لأنه ربما تم اختراقه. إذا كان مُفعّلاً بالتخصيص، قم بتغيير AppSKey و NwkSKey الخاصين به. علاوة على ذلك، تأكد من تحديث خادم LoRaWAN وأنه لا يقبل الرسائل المكررة.
    LAF-008كلمة المرور تم كسرها باستخدام JoinRequestLafBruteforcer.pyعاليكان من الممكن فك تشفير رسالة JoinRequest باستخدام AppKey معروف.استخدم AppKeys مختلفة عن تلك المقدمة من البائعين أو استخدم مفاتيح أكثر عشوائية.
    LAF-009كلمة المرور تم كسرهاLafBruteforcer.pyعاليتم العثور على AppKey للجهاز باستخدام سلسلة معروفة أو غير عشوائية. تم فك التشفير باستخدام زوج من رسائل الانضمام (طلب وقبول).استخدم مولد مفاتيح عشوائي لـ AppKey بدلاً من استخدام تلك المقدمة من البائعين. علاوة على ذلك، لا تقم بتعيين نفس AppKey لأكثر من جهاز ولا تقم بتوليد AppKeys باستخدام منطق قابل للتنبؤ (مثل قيم متزايدة، قلب بعض البايتات، إلخ.)
    LAF-010تغير موقع البوابةLafPacketAnalysis.pyمتوسطإذا كان من المفترض ألا تغير البوابة موقعها. قد تكون قد سُرقت، أو نُقلت، أو قد تحاول بوابة مزيفة انتحال صفة البوابة الشرعية.تأكد من عدم العبث بالبوابة، ماديًا أو منطقيًا.