
هونيبوت IoT والتكنولوجيا التشغيلية
| 📢 انتباه!!! |
|---|
| تم نقل هذا المستودع إلى مشروع Honeynet :) |
RIoTPot هو وعاء تفاعل هجين، يركز بشكل أساسي على محاكاة بروتوكولات إنترنت الأشياء (IoT) والبروتوكولات التشغيلية (OT)، على الرغم من أنه قادر أيضًا على محاكاة خدمات أخرى. في جوهره، يعمل RIoTPot كخدمة وكيل (Proxy) للأوعية الأخرى المضمنة في النظام. لذلك، يمكنك تشغيل أي وعاء وخدمات أخرى جنبًا إلى جنب مع RIoTPot. بالإضافة إلى ذلك، يوجد تطبيق ويب للواجهة الرسومية يمكنك استخدامه لإدارة التوجيه الخاص بك.
يأتي الوعاء مزودًا بالعديد من الخدمات منخفضة التفاعل الجاهزة للاستخدام. نظرًا لأن هذه الخدمات مكتوبة كـ ملحقات (plugins)، فهي مدعومة فقط على نظام لينكس؛ ومع ذلك، يمكنك بدء تشغيل RIoTPot بدونها. يحتوي الجدول التالي على قائمة الخدمات المضمنة افتراضيًا في RIoTPot ومنفذها الداخلي ومنفذ الوكيل.
جدول المحتويات
تعتمد بنية RIoTPot على اتصالات وكيلة (Proxy) للخدمات الداخلية والخدمات المحيطة (أو الخارجية) (مثل الأوعية، الخدمات الكاملة، الحاويات، المضيفين البعيدين، إلخ). لهذا، يدير الوعاء عددًا من الوكلاء (proxies) المعرفة من قبل المستخدم والتي تقوم بتوصيل الاتصالات بين الخدمات و RIoTPot 1. بهذه الطريقة، يمكن لـ RIoTPot أن يقرر كيفية وأين يقوم بتوجيه الهجمات الواردة. يتم تنفيذ المنطق المستخدم لتحديد كيفية معالجة الهجوم الوارد في شكل وسائط (middlewares) 2. لإدارة الخدمات والوسائط والوكلاء، يأتي RIoTPot مزودًا بواجهة برمجة تطبيقات REST (API) 3 وتطبيق ويب للواجهة الرسومية (UI) 4 بشكل افتراضي. يمكن الوصول إلى الواجهة الرسومية عبر المتصفح على العنوان localhost:2022 ويمكنك التفاعل مع نقاط نهاية واجهة API على العنوان localhost:2022/api/swagger الذي يعرض واجهة Swagger.
الشكل 1 يوضح بنية RIoTPot، بما في ذلك التطبيقين الرئيسيين اللذين يشكلان RIoTPot (RIoTPot نفسه، وواجهة RIoTPot الرسومية) ومكوناتهما، وقسم يضم الخدمات الخارجية (أو المجاورة).
RIoTPot مكتوب بلغة Golang5. كل مثيل من RIoTPot يعرض الوكلاء المسجلين (بناءً على منفذهم) عند الطلب. لخدمة وكيل، يجب أن يكون لديه خدمة مربوطة وأن يكون منفذ الوكيل متاحًا (حاليًا، لا يقبل RIoTPot تشغيل خدمات متعددة على نفس المنفذ). عند ربط وكيل وخدمته، سيتمكن المهاجمون من إرسال رسائل إلى RIoTPot على ذلك المنفذ، وسيتم تمرير الرسائل إلى الخدمة المربوطة ثم العودة إلى المهاجم6.
لسهولة الوصول، يمكن إدارة مثيلات متعددة من RIoTPot من تطبيق الويب الخاص بالواجهة الرسومية.
بالإضافة إلى إدارة الوكلاء المسجلين في كل مثيل، تسمح لك الواجهة الرسومية بإنشاء واستخدام وتحرير الملفات التعريفية (profiles).
يحتوي كل ملف تعريفي على عدد من الوكلاء المسماة حسب البروتوكولات أو الخدمات الأخرى مما يجعل مثيل RIoTPot يشبه أجهزة الحياة الواقعية (مثل مساعد منزلي).
باختصار، تعمل الملفات التعريفية على تسريع عملية إعداد وتجهيز مثيل RIoTPot بإعدادات محددة.
تمت كتابة الواجهة الرسومية باستخدام مكتبة React الأمامية (نستخدم TypeScript لهذا المشروع) ومكتبة إدارة الحالة Recoil.
نظرًا لأن RIoTPot صغير نسبيًا، في الوقت الحالي، لا يستخدم قاعدة بيانات.
تشغيل RIoTPot بسيط نسبيًا. بشكل عام، لديك ثلاثة خيارات. الأول هو تنزيل إصدار من RIoTPot؛ يمكنك إما اختيار تنزيل أحدث إصدار، أو إصدار سابق. الخيار الثاني هو بناء المشروع بنفسك. الخيار الأخير هو استخدام الكود المصدري لإنشاء حاوية Docker مع RIoTPot وبعض التطبيقات الإضافية لتعزيز الوعاء.
معلومة: هذا الدليل مخصص للمستخدمين ذوي الاحتياجات الخاصة، الذين يريدون تجربة جاهزة وبسيطة.
يأتي كل إصدار في مجلد باسم riotpot مع ملف تنفيذي ثنائي (أيضًا) باسم riotpot ومجلد plugins مملوء بالعديد من الخدمات (أو الأوعية منخفضة التفاعل).
من المهم الحفاظ على بنية المجلد الداخلية لكي يعمل RIoTPot كما هو مقصود.
📁 riotpot
┕ riotpot
┕ 📁 plugins
riotpot.riotpot. سيؤدي ذلك إلى بدء تشغيل RIoTPot مع تمكين واجهة API، وجميع الملحقات جاهزة للاستخدام، وخادم الواجهة الرسومية.
localhost:2022معلومة: هذا الدليل مخصص للمستخدمين المتقدمين والمريحين في بيئات التطوير.
المتطلبات
- Golang - مطلوب لبناء المشروع
- Node - مطلوب لبناء الواجهة الرسومية
اختياري:
- Git - يستخدم لتنزيل الكود المصدري
- Make - لتشغيل الأوامر المُعدة مسبقًا
قم بتنزيل الكود المصدري لـ RIoTPot من GitHub. افتح وحدة تحكم وأدخل السطر التالي.
git clone [email protected]:aau-network-security/riotpot.git
انتقل إلى المجلد الذي قمت بتنزيل الكود المصدري لـ RIoTPot فيه وقم بتثبيت حزم Node المطلوبة.
npm install
إذا كان لديك Make مثبتًا، فقد قمنا بتضمين العديد من مساعدات الأوامر لمساعدتك في بناء المشروع. ببساطة، يمكنك تشغيل أمرين بسيطين سيبنيان الملف الثنائي لـ RIoTPot والملحقات (ويضعانها في المجلد الصحيح).
# بناء الخادم
make build-ui
# بناء RIoTPot والملحقات
make riotpot-build
ملاحظة: تستخدم الواجهة الرسومية Vite لبناء المشروع. إذا كنت تفضل استخدام أداة بناء أخرى، فقد تحتاج إلى إجراء بعض التغييرات أولاً بنفسك.
معلومة: هذا الدليل مخصص للمستخدمين المتقدمين الذين يفضلون استخدام RIoTPot في بيئة افتراضية.
المتطلبات
- Docker - يستخدم لبناء صورة لمثيل RIoTPot وخادم الواجهة الرسومية.
- Docker-compose - يستخدم لإنشاء حاوية واحدة تحتوي على مثيل RIoTPot والواجهة الرسومية والتطبيقات والخدمات الأخرى.
المزايا الرئيسية لاستخدام هذا الإعداد هي ميزات الأمان الإضافية مع الحد الأدنى من التغييرات في تكوين الحاوية والحاويات نفسها. على سبيل المثال، يمكننا تعريف شبكات خاصة افتراضية منفصلة وشبكات تراكب لإخفاء وعزل وحصر RIoTPot والخدمات المجاورة الأخرى. بالإضافة إلى ذلك، تسمح لنا الحاويات بربط الخدمات باستخدام اسم عنوان Docker الخاص بها بدلاً من عنوان IP، وهو أمر مريح للغاية. أخيرًا، يمكننا تشغيل وإيقاف الحاويات المنفصلة حسب الحاجة دون التأثير على الخدمات الأخرى.
من ناحية أخرى، الافتراضية هي بلا شك أكثر تطلبًا من استخدام التطبيقات على المعدن العاري. بينما مثيل واحد من RIoTPot خفيف نسبيًا، من المهم مراعاة القصور الذي تقدمه الافتراضية ومحاكاة الأجهزة (مثل تأخيرات الاستجابة).
تحذير: من الناحية الفنية، قد يدرك المهاجم المخصص أن RIoTPot هو في الواقع وعاء من خلال تحليل ومقارنة تأخيرات وقت الاستجابة التي تقدمها الافتراضية مع الخوادم الحقيقية (!!). بينما تمت دراسة هذا النوع من بصمات الأوعية من قبل، فإن النتائج لخدمات الإنترنت الشائعة لا تزال غير حاسمة (مثل HTTP وTelnet وSSH)، بسبب تسليع خدمات الاستضافة السحابية باستخدام الآلات الافتراضية والتكوينات التفصيلية للخوادم.
يتضمن ملف docker-compose خدمات إضافية لتعزيز تجربة RIoTPot.
يلخص الجدول التالي قائمة الخدمات والتطبيقات المجمعة في هذه الحاوية.
الخدمات
يأتي RIoTPot مع أوامر علامات (flag commands) تؤثر على كيفية تشغيله وما يتم تشغيله. مثال:
# تشغيل RIoTPot بدون الواجهة الرسومية
./riotpot --ui false
لا يمكن الوصول إلى الخدمات الداخلية والمحيطة عبر الإنترنت. الخدمات الداخلية مدمجة ولا يمكن الوصول إليها إلا بواسطة RIoTPot. يتم تحميل هذه الخدمات عند بدء التشغيل ولا يمكن حذفها، ولكن يمكن إيقافها. يجب أن تكون الخدمات المحيطة في نفس الشبكة مثل RIoTPot. يجب أن تقوم الخدمات الخارجية بإدراج RIoTPot في القائمة البيضاء فقط. ↩
الوسائط قيد التطوير حاليًا. ↩
يجب عدم تعريض واجهة API الخاصة بـ RIoTPot للإنترنت. بغض النظر، تقبل واجهة API حاليًا الاتصالات فقط من المضيف المحلي (localhost). قد يتغير هذا في المستقبل، مع توفير قائمة بيضاء بالمضيفين ومصادقة قياسية. ↩
على الرغم من إمكانية استخدام الواجهة الرسومية كمكون منفصل، إلا أنها مدمجة مع ملف RIoTPot الثنائي. ↩
بينما التطبيق الأساسي قابل للتشغيل البيني، يمكن استخدام الخدمات الداخلية (الملحقات) فقط في بيئات لينكس وFreeBSD وmacOS. نخطط لتجاوز هذا القيد عن طريق استبدال الملحقات بخدمات مصغرة تتواصل عبر gRPC. ↩
لأسباب أخلاقية وأمنية، لا يسمح RIoTPot بالطلبات غير المرغوب فيها إلى الخارج، أي الصدف العكسية (reversed shells) وما شابه ذلك غير مسموح بها. ↩
| الخدمة | المنفذ الداخلي | منفذ الوكيل |
|---|
| Echo | 20007 | 7 |
| SSH | 20022 | 22 |
| Telnet | 20023 | 23 |
| HTTP | 28080 | 80 |
| Modbus | 20502 | 502 |
| MQTT | 21883 | 1883 |
| CoAP | 25683 | 5683 |
| الخدمة | الصورة | المنفذ | التفاصيل |
|---|
| MQTT | eclipse-mosquitto | 1883 | خادم MQTT الخاص بـ Mosquito |
| HTTP | httpd | 80 | خادم HTTP عادي |
| Modbus | oitc/modbus-server | 502 | خادم Modbus |
| OCPP | ocpp1.6-central-system | 443 | OCPP v1.6 (يستخدم في محطات شحن السيارات) |
| التطبيق | الصورة | التفاصيل |
|---|---|---|
| TCPDump | kaazing/tcpdump | مسجل الحزم. يقوم بتخزين حركة مرور الشبكة في ملفات .pcap |
يمكن إعداد الحاوية في ثلاث خطوات بسيطة:
قم بتنزيل الكود المصدري لـ RIoTPot من GitHub. افتح وحدة تحكم وأدخل السطر التالي.
git clone [email protected]:aau-network-security/riotpot.git
انتقل إلى المجلد الذي قمت بتنزيل الكود المصدري لـ RIoTPot فيه.
مع تشغيل Docker: إذا كان لديك Make مثبتًا، قم بتشغيل الأمر التالي. وإلا، قم بتشغيل أمر docker-compose باستخدام ملف docker-compose المضمن في مجلد build/docker.
# مع make
make up
# مع docker-compose
docker-compose -p riotpot -f build/docker/docker-compose.yaml up -d --build
| العلامة | النوع | الافتراضي | الوصف |
|---|
| debug | Boolean | false | تعيين مستوى السجل إلى debug |
| api | Boolean | true | بدء تشغيل واجهة API أم لا |
| plugins | Boolean | true | تحميل ملحقات الوعاء منخفض التفاعل أم لا |
| whitelist | String | http://localhost,http://localhost:3000 | قائمة بالمضيفين المسموح لهم بالاتصال بواجهة API، مفصولة بفاصلة |
| ui | Boolean | true | بدء تشغيل الواجهة الرسومية أم لا |