نواصل تحليل نقاط الضعف في المحولات الصناعية: نقوم بتنفيذ التعليمات البرمجية التعسفية بدون كلمة مرور



في البحث الإيجابي لعام 2019 ، راجعنا بروتوكول إدارة التبديل الصناعي Moxa. هذه المرة سنستمر في هذا الموضوع ونحلل بالتفصيل الثغرة CVE-2018-10731 في مفاتيح الاتصال Phoenix من FL SWITCH 3xxx و FL SWITCH 4xxx و FL SWITCH 48xx من النماذج التي حددها خبراؤنا. تسمح هذه الثغرة المكتشفة في واجهة الويب للجهاز بتنفيذ تعليمات برمجية عشوائية دون معرفة بيانات اعتماد الجهاز ويتم تصنيفها على أنها 9 من أصل 10 في مقياس CVSS الإصدار 3.

النظرة الأولى


الأجهزة المذكورة أعلاه تعمل بنظام Linux ، ويمكنك استخدام واجهة الويب لتكوينها. كما هو الحال مع العديد من أجهزة إنترنت الأشياء الأخرى ، المنزلية والصناعية ، تتكون واجهة الويب من العديد من تطبيقات CGI التي تعالج طلبات HTTP للمستخدم. في حالتنا ، تستخدم تطبيقات CGI بنشاط مكتبة cgic ، والتي تسهل العمل مع طلبات HTTP ، ويتم دمج وظائف هذه المكتبة في المكتبة المشتركة libipinfusionweb.soالموجودة في نظام ملفات الجهاز.

عند معالجة طلب HTTP ، يقوم خادم الويب بتمرير بيانات طلب المستخدم إلى تطبيق CGI كمجموعة من متغيرات البيئة. تتم معالجتها الأولية بواسطة وظيفة mainالمكتبة libipinfusionweb. بعد ذلك ، mainتستدعي الوظيفة وظيفة cgiMainتطبيق CGI ، حيث تتم معالجة الطلب الإضافية.



الشكل 1. معالجة طلب HTTP

في سياق عملها ، libipinfusionwebتستدعي الوظيفة الرئيسية للمكتبة وظيفة get_login_userتحدد ما إذا كان المستخدم قد اجتاز المصادقة على النظام باستخدام قيم ملفات تعريف الارتباط التي تم تمريرها.



الشكل 2: جزء من شفرة زائفة

للوظيفة الرئيسيةget_login_user تتلقى الوظيفة قيمة معلمة ملف تعريف الارتباط c_sessionباستخدام الوظيفة cookies_get_valueوتخزينها في متغير local_e0. المتغير نفسه local_e0عبارة عن صفيف من الأحرف أحادية البايت بطول 0x80 ويقع على مسافة 0xE0 من بداية المكدس.



الشكل 3. جزء من الكود الزائف للدالة get_login_user

ومع ذلك ، في كود الوظيفة cookies_get_valueيمكن ملاحظة أن cgiCookieStringقيمة معلمة ملف تعريف الارتباط التي تلقتها الدالة لها أقصى طول يبلغ 0x400 بايت.



الشكل 4. جزء من الرمز الزائف للدالة cookies_get_value

وهكذا ، عند تمرير معلمة ملف تعريف ارتباط أطول من 0xE0 (224) حرفًا ، ستحفظ الوظيفةget_login_user قيمة هذه المعلمة في مجموعتها ، ونتيجة لذلك local_e0سيتم استبدال جميع المعلومات الموجودة على المكدس خلف المتغير ، بما في ذلك العنوان دالة الإرجاع.

ملاحظة: عندما تستدعي إحدى الوظائف وظيفة أخرى ، يتم تخزين عنوان الإرجاع على المكدس. يتم نقل عنصر التحكم إلى هذا العنوان عندما تنتهي الوظيفة المطلوبة من عملها. وفقًا لذلك ، إذا قمت بإعادة كتابة هذا العنوان ، يمكنك التحكم في عملية تنفيذ البرنامج. على سبيل المثال ، يمكن للمهاجم استبدال هذا العنوان بعنوان كود قشرة ضارة موجود في مساحة عنوان البرنامج.

لاحظ أن إعادة كتابة عنوان الإرجاع تحدث قبل التحقق من المصادقة ، مما يجعل من الممكن استغلال هذه الثغرة الأمنية لمهاجم لا يعرف أوراق اعتماد الجهاز.

استغلال


لقد درسنا عدة خيارات لإثبات إمكانية استغلال هذه الثغرة الأمنية. إن أبسط شيء هو كتابة رمز الحمولة على المكدس (0x400 - 0xE0 = 800 بايت المتبقية له ، وهو ما يكفي للرمز) وإعادة كتابة عنوان المرسل بعنوان الرمز. من الناحية النظرية ، كان هذا الخيار ممكنًا ، لأن معالج المحول الضعيف لا يدعم وظيفة NX-bit (أي أنه يسمح بتنفيذ التعليمات البرمجية الموجودة في أي مكان ، بما في ذلك على المكدس) ، ولكن في الممارسة العملية كان له قيود خطيرة.

معالج التبديل المعرض للخطر له بنية MIPS. يتم ترميز العديد من تعليمات المعالج في هذه البنية في تسلسل بايت يحتوي على صفر بايت. تتم كتابة محتويات المخزن المؤقت وصولاً إلى أول صفر بايت (بسبب استخدام الوظيفةstrcpy) ، لذلك ، من الضروري فقط استخدام المعاملات التي لا تحتوي على بايت فارغ ، وهو أمر مستحيل ، لأن أي حمولة ستستخدم على الأقل العديد من هذه البايتات.

عند إنشاء سلسلة ROP ، مرة أخرى ، سيتعين علينا مواجهة قيود البايت الفارغ: يجب ألا يحتوي عنوان أدوات ROP على أصفار ، مما يعقد البحث بشكل كبير. بشكل عام ، يمكننا فقط استخدام صفر واحد ، تم نسخه بواسطة الدالة strcpy. هذا يفرض قيودًا على إنشاء سلسلة ROP كاملة ، بالإضافة إلى ذلك ، كانت الأدوات التي نحتاجها قليلة للغاية. ومع ذلك ، أثناء البحث في مكتبة libipinfusionweb ، تم العثور على جزء التعليمات البرمجية التالي:



الشكل 5. جزء من التعليمات البرمجية القابلة للتنفيذ في مكتبة libipinfusionweb

بشرط أن يتم التحكم في محتويات السجل $ s0 ، يسمح لك جزء التعليمات البرمجية هذا بتنفيذ أمر نظام تشغيل باستخدام دالة mysystem(لم يكن لهذه الوظيفة اسمًا في البداية ، ولكننا قمنا بإعادة تسميته ، نظرًا لأنه مشابه جدًا لوظيفة النظام في Linux).

نظرًا لأننا نعيد كتابة عنوان المرسل من دالة get_login_user ، سيتم تنفيذ هذه الوظيفة حتى النهاية. في خاتمة دالة get_login_user ، يمكنك أن ترى أن قيمة التسجيل $ s0 يتم استعادتها من القيمة المحفوظة مسبقًا على المكدس (عند الإزاحة 0xD8 من أعلى المكدس). ومع ذلك ، في هذه المرحلة ، هذه المنطقة من المكدس هي بالفعل تحت سيطرتنا ، أي في الواقع ، يمكننا تحقيق السيطرة على محتويات السجل $ s0 وبالتالي تنفيذ أوامر نظام تشغيل تعسفية باستخدام الوظيفة mysystem.



الشكل 6. مقتطف من التعليمات البرمجية القابلة للتنفيذ لوظيفة get_login_user

وبالتالي ، من أجل إثبات استغلال هذه الثغرة بنجاح ، نحتاج إلى إرسال Cookie c_sessionسطر طويل كمعلمة يحتوي على:

  • أمر سلسلة OS ، الذي سيتم تمريره لاحقًا إلى وظيفة mysystem ؛
  • عنوان هذا الأمر على المكدس ؛
  • عنوان إرجاع جديد (عنوان جزء الرمز الموضح في الشكل 5).

يجب أن تبدو الحمولة النهائية كما يلي:



الشكل 7. الحمولة

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

  • تم تعطيل ASLR على الجهاز قيد الدراسة - لذلك ، ستكون عناوين الأداة المستخدمة وأوامر نظام التشغيل هي نفسها دائمًا.



الشكل 8. حالة ASLR على الجهاز قيد التحقيق

  • نطاق عناوين الذاكرة التي يمكن أن تقع فيها المكدس. لحساب العنوان الدقيق ، راجعنا جميع العناوين في هذا النطاق.

كحمولة ، قمنا بتنفيذ تحميل غلاف ويب ، تطبيق CGI بالمحتويات التالية:

#!/bin/sh
eval $HTTP_CMD 2>&1

نظرًا لأنه ، وفقًا لبروتوكول CGI ، يتم نقل محتويات رؤوس HTTP إلى تطبيق CGI في شكل متغيرات البيئة بأسماء HTTP_ <اسم الرأس> ، evalستستخدم هذه الصدفة الأمر لتنفيذ محتويات رأس HTTP CMD. يوضح الشكل أدناه نتيجة العملية الناجحة وتنفيذ الأمر ls باستخدام shell المحمل.



الشكل 9. نتيجة العملية الناجحة وتنفيذ الأمر ls

استنتاج


لقد أظهرنا القدرة على استغلال هذه الثغرة الأمنية. كما ذكرنا من قبل ، لا يتطلب تشغيله معرفة كلمة المرور ، وبالتالي يمكن تنفيذه حتى من قبل مهاجم غير مصادق.

يمكن أن يؤثر اختراق مفتاح الشبكة الصناعية على الإنتاج بأكمله. يمكن أن يؤثر انتهاك تفاعل الشبكة سلبًا على العملية حتى تتوقف تمامًا.

تم نقل معلومات حول الثغرة الأمنية و PoC إلى البائع الذي قام بإصدار إصدار البرامج الثابتة المصحح 1.34 ، وتم تعيين المعرف CVE-2018-10731 إلى الثغرة الأمنية نفسها.

تبحث عن شخص


إذا كانت لديك رغبة في القيام بمثل هذه الأشياء ، فنحن نبحث فقط عن متخصص في فريقنا. نحن منخرطون في التحليل الأمني ​​لأنظمة التحكم في العمليات (المنشآت الصناعية / الطاقة / النقل الكبيرة ، وما إلى ذلك). في كل مشروع ، نبحث عن طرق لإيقاف أو تعطيل تشغيل هذه الكائنات. في كل مرة نجد طرقًا عديدة للتأثير على عملية التصنيع ، واستكشاف الأجهزة والبرامج الصناعية ، وتحليل بروتوكولات الشبكات الخاصة. نجد الكثير من zirodey ونبلغ عنها ، ونكتب التقارير (ليس وفقًا لـ GOST) ونفعل المزيد. عندما يكون هناك وقت ، نتحدث في البكالوريا الدولية وليس في المؤتمرات فقط. رابط إلى الوظيفة الشاغرة: hh.ru/vacancy/36371389

أرسلت بواسطة فياتشيسلاف Moskvin، تقنيات إيجابي

All Articles