
أداة استطلاع لالتقاط وعرض معرفات الشبكات اللاسلكية (SSIDs) من قائمة الشبكات المفضلة للجهاز.

ماسح قائمة الشبكات المفضلة (PNLS) هو أداة تدقيق لشبكات Wi-Fi تابعة للفريق الأحمر بواجهة ويب بسيطة قادرة على اعتراض معرفات SSID1 من قائمة الشبكات المفضلة (PNL)2 بالجهاز. يتم تحقيق ذلك عن طريق التقاط طلبات الاستقصاء في المنطقة المجاورة، ثم تحليلها لاستخراج معرف SSID ومعلومات أخرى، وأخيراً نشرها إلى واجهة الويب. الدافع الأساسي لهذا المشروع هو دراسة طلبات استقصاء 802.11 والمخاطر المتعلقة بالخصوصية المرتبطة بالبيانات التي تنقلها.
شكل 1: نظرة عامة على نظام PNLS
[!WARNING] جميع المحتويات في هذا المشروع مخصصة لأغراض البحث الأمني فقط.
[!NOTE]
هذا المشروع جزء من بحثي المستمر حول حماية الخصوصية في شبكات Wi-Fi.
لمراقبة العمل الجاري على PNLS، راجع لوحة المشروع.
إليك ما ستحتاجه لنسخ ونشر هذا المشروع، بما في ذلك مكونات الأجهزة والبرامج. بمجرد تجهيز بيئة العمل الخاصة بك، انتقل إلى أقسام الإعداد.
sudo airmon-ng start wlan0 [2].[!NOTE]
صورة Kali تستخدم نواة Re4son، والتي تتضمن برامج تشغيل لبطاقات Wi-Fi الخارجية وبرنامج Nexmon الثابت للبطاقة اللاسلكية المدمجة في RPi 3 و 4 [3].
شكل 2: PNLS يعمل على RPi 4 مع هوائي خارجي وبطارية
شكل 3: PNLS يعمل على RPi 4 مع علبة وهوائي AWUS036ACS
شكل 4: PNLS يعمل على RPi 4 مع هوائي AWUS036ACM
إذا كنت لا تريد استخدام Docker، فانتقل إلى الإعداد بدون Docker.
قم بإعداد نسخة تطويرية بسرعة:
# First clone this repo.
git clone https://github.com/AleksaMCode/Preferred-Network-List-Sniffer.git
# Move to the project root folder.
cd Preferred-Network-List-Sniffer
# Build backend and frontend image.
docker compose build
# Bring up both the backend and the frontend server.
docker compose up
# Move into the sniffer folder.
cd sniffer
# Run the Sniffer service.
sudo python3 sniffer.py
حالياً، الصور متعددة المنصات غير متوفرة، والمشروع يدعم فقط معمارية ARM64v8. قم بتنزيل أحدث الصور الجاهزة من سجل حاويات GitHub وقم بتشغيلها محلياً.
# First clone this repo.
git clone https://github.com/AleksaMCode/Preferred-Network-List-Sniffer.git
# Move to the project root folder.
cd Preferred-Network-List-Sniffer
# Download the prebuild images.
docker pull ghcr.io/aleksamcode/pnls-backend-ghcr:latest
docker pull ghcr.io/aleksamcode/pnls-frontend-ghcr:latest
# Bring up both the backend and the frontend server.
docker compose up
# Move into the sniffer folder.
cd sniffer
# Run the Sniffer service.
sudo python3 sniffer.py
الخلفية: لبدء تشغيل خادمي ASGI و Redis وتشغيل الخدمات المطلوبة، راجع هذه التعليمات.
الواجهة الأمامية: لتشغيل خادم React، راجع هذه التعليمات.
هذه لقطة شاشة عندما تم تشغيل كل شيء "يدوياً":
شكل 5: لقطة شاشة PNLS
طلبات الاستقصاء هي إطارات إدارة من نوع 802.11 تُستخدم لتوصيل الأجهزة بنقاط الوصول اللاسلكية (AP) التي تم الارتباط بها سابقاً. عندما يكون الجهاز قد مكّن Wi-Fi ولكنه غير متصل بشبكة، فإنه يرسل بشكل دوري دفعة من طلبات الاستقصاء التي تحتوي على معرفات SSID من قائمته المفضلة (PNL). تُرسل هذه الإطارات غير مشفرة، ويمكن لأي شخص يراقب الترددات الراديوية (RF) التقاطها وقراءتها. تُرسل طلبات الاستقصاء إلى عنوان البث DA (ff:ff:ff:ff:ff:ff). بمجرد إرسالها، يبدأ الجهاز مؤقت الاستقصاء. في نهاية المؤقت، يقوم الجهاز بمعالجة الإجابة المستلمة. إذا لم يتلق الجهاز إجابة، فإنه ينتقل إلى القناة التالية ويكرر العملية. هناك نوعان من طلبات الاستقصاء:
طلبات الاستقصاء الموجهة: باستخدام معرف SSID محدد من قائمة PNL الخاصة بالجهاز
طلبات الاستقصاء الفارغة: باستخدام معرف SSID شامل (معرف SSID فارغ)
تُرسل الطلبات الفارغة للحصول على رد من جميع نقاط الوصول المتاحة في النطاق.
بالإضافة إلى تصفية إطارات طلبات الاستقصاء 802.11 من جميع الحزم الملتقطة، سيقوم Sniffer أيضاً بتصفية معرفات SSID الشاملة.
عند التقاط طلبات الاستقصاء في الأماكن التي توجد بها شبكة محلية كبيرة مع عدد كبير من عملاء Wi-Fi، سيلتقط PNLS حتماً العديد من طلبات الاستقصاء التي تحتوي على معرف SSID لتلك الشبكة. قد يكون تصفية معرفات SSID هذه مفيداً، حيث إنها لا قيمة لنا ويمكن أن تؤدي إلى زيادة حمل المقابس. إن تصفية معرفات SSID هذه لن تقلل فقط من الحمل على اتصالات المقابس، بل ستمنع أيضاً إغراق واجهة الويب بمعرفات SSID المذكورة.
عند استخدام هذه الميزة، ستحتاج إلى إجراء تعديلات طفيفة على الكود المصدري. بالتحديد، ستحتاج إلى تحديث قائمة SSID_FILTER في ملف settings.py بالقيمة التي تريد أن يتجاهلها Sniffer. بمجرد التحديث، أعد بناء المشروع وابدأ تشغيل PNLS.
يستخدم هذا المشروع هندسة تعتمد على الأحداث (EDA)، والتي تم تصميمها فوق الهندسات المعتمدة على الرسائل. بينما يستخدم هذا المشروع حلاً مركزياً (كل شيء يعمل من RPi)، ونظراً للمكونات غير المترابطة بشكل كبير نتيجة استخدام EDA، فمن الممكن إنشاء حل لا مركزي إذا لزم الأمر. يتكون PNLS من ناشر حدث (sniffer)، ومستهلك حدث (تطبيق ويب)، وقناة حدث. هنا، يتم تنفيذ قناة الحدث كوسيط موجه للرسائل (MOM).
شكل 6: مخطط نشر نظام PNLS
يوفر Async Server Gateway Interface (ASGI) واجهة موحدة بين خوادم الويب Python القادرة على العمل غير المتزامن والخدمات [4]. تم اختيار ASGI بسبب حاجة المشروع لاتصال WebSocket طويل الأمد لتسهيل الاتصالات غير المتزامنة بين العملاء المختلفين. بالإضافة إلى ذلك، يسمح أيضاً باستخدام الروتينات الخلفية أثناء استدعاءات API. يستخدم PNLS تطبيق uvicorn لـ Python لاستخدام خادم ويب ASGI.
من خلال استخدام بروتوكول اتصال WebSocket، نتمكن من تسهيل الاتصال ثنائي الاتجاه الكامل. بينما لا يحتاج هذا المشروع إلى اتصال ثنائي الاتجاه، إلا أنه يحتاج إلى تفاعل فوري بين مكونات النظام. بهذه الطريقة، ستكون البيانات الملتقطة متاحة للمستخدم النهائي بمجرد التقاطها.
يتم تحقيق MOM للمشروع من خلال وسيط الرسائل باستخدام Redis. في نموذج النشر-الاشتراك (pub-sub)، يكون Sniffer مسؤولاً عن إنتاج الرسائل، بينما يسجل تطبيق الويب (المشترك) في الموضوع المحدد (قناة Redis). عندما يرسل Sniffer رسالة إلى موضوع، يتم توزيعها على جميع المستهلكين المشتركين، مما يسمح بالاتصال غير المتزامن والقابل للتوسع. يستخدم PNLS بروتوكول الرسائل الخفيف Redis Pub/Sub لبث الرسائل لنشر الرسائل قصيرة العمر بزمن انتقال منخفض وإنتاجية كبيرة [5][6]. بهذه الطريقة، تم تجنب الأعباء المرتبطة بتشفير هياكل البيانات بشكل يمكن كتابته على القرص. وبذلك، سيكون لهذا الحل أداء أفضل محتمل [7]. يوضح الشكل أدناه نشاط النظام المبسط من خلال سير العمل المعتمد على الأحداث.
شكل 7: مخطط تسلسل نموذج النشر-الاشتراك PNLS
[!NOTE] لا يوفر MOM المنفذ تخزيناً دائماً أو قائمة انتظار رسائل لتراكم البيانات، مما يعني فقدان الرسائل إذا تم نشرها في موضوع بدون مشتركين.
أدناه مثال على واجهة ويب تعرض معرفات SSID اختبارية منشورة.
شكل 8: واجهة ويب PNLS - مثال مع معرفات SSID اختبارية
معرف مجموعة الخدمات (SSID) هو معرف 802.11 يُستخدم لتسمية شبكة Wi-Fi يتكون من 32 حرفًا كحد أقصى يمكن أن يحتوي على أحرف حساسة لحالة الأحرف وأرقام ورموز خاصة لا يزيد طولها عن 32 حرفًا. ↩
قائمة الشبكات المفضلة هي مجموعة من معرفات SSID المحفوظة مع إعدادات إضافية قمت بإنشائها في المرة الأولى التي قمت فيها بتوصيل جهازك بتلك الشبكات. ↩
لم تدعم Broadcom رسمياً وضع المراقبة، مما حد من فائدة البطاقات اللاسلكية في أجهزة Raspberry Pi [8]. مشروع Nexmon هو تعديل برنامج ثابت لرقاقات Broadcom المستخدمة في أجهزة RPi [1]. سيتيح لك هذا التعديل استخدام وضع المراقبة على جهاز RPi الخاص بك. ↩
إطار عمل تعديل البرنامج الثابت القائم على C لرقاقات Wi-Fi من Broadcom/Cypress والذي يتيح وضع المراقبة، وحقن الإطارات، وأكثر من ذلك بكثير. ↩
| PNL | قائمة الشبكات المفضلة |
| PNLS | ماسح قائمة الشبكات المفضلة |
| SSID | معرف مجموعة الخدمات |
| UI | واجهة المستخدم |
| RPi | Raspberry Pi |
| OS | نظام التشغيل |
| AP | نقاط الوصول |
| RF | الترددات الراديوية |
| EDA | الهندسة المعتمدة على الأحداث |
| MOM | الوسيط الموجه للرسائل |
| ASGI | واجهة بوابة الخادم غير المتزامنة |
| pub-sub | نشر-اشتراك |