نتحقق من الثغرة الأمنية المغلقة ونحصل على أربعة CVEs جديدة

طُلب مني متابعة سلسلة المقالات حول إغلاق الثغرات الأمنية وكيفية إغلاقها (يمكن قراءة مقالتنا الأولى هنا ). في المرة الأخيرة اكتشفنا أنه حتى لو أبلغت الشركة المصنعة عن إغلاق الثغرة الأمنية ، فقد لا يكون كل شيء في الواقع كذلك.



معايير الاختيار:


معايير الاختيار لنقاط الضعف المعتبرة هذه المرة هي نفسها (باستثناء أنني هذه المرة أردت أن ألقي نظرة على أنواع أخرى من الثغرات الأمنية):

  • يجب أن يكون هناك استغلال - نريد أن نرى أنه قبل التحديث تم استغلال كل شيء بشكل جيد بشكل سيئ ، وبعد ذلك أصبح جيدًا ؛
  • يجب أن يكون الضعف حاسماً (من الناحية المثالية RCE) وعلى درجة عالية ؛
  • يجب أن يكون المنتج مفتوح المصدر ؛
  • يجب عدم التخلي عن المنتج واستخدامه بنشاط ؛
  • يجب أن يكون الضعف جديدًا نسبيًا ؛
  • كما هو الحال دائمًا ، الشيء الرئيسي هو أننا مهتمون بأنفسنا.

ماذا وكيف اخترت:


ذهبت إلى موقع vulners.com وطلبت عرض جميع برمجيات إكسبلويت مع موقع إكسبلويت - موقع db.com في آخر أسبوعين. هذه المرة في فئة الويب ، تم تأليف جميع برمجيات إكسبلويت تقريبًا من قبل إحسان سنكان ، ولكن نظرًا لكونها غالبًا ما تتعلق بحقن SQL في التطبيقات والمكونات الإضافية غير المدعومة ، قمت بإزالتها. من المنتجات المتبقية ، فقط أداة إدارة المشاريع ProjeQtOr 7.2.5 مع الضعف CVE-2018-18924 تندرج في فئة "لم يتم التخلي عنها وتطويرها بنشاط".
استوفت هذه الثغرة جميع معايير الاختيار:

  • هناك ثغرة ؛
  • ضعف RCE (على الرغم من أنها تتطلب أن يكون المستخدم مفوضًا) ؛
  • المنتج مفتوح المصدر تمامًا ؛
  • لم يتم التخلي عن المنتج ، في عام 2018 كان هناك 28 إصدارًا ، وكان هناك فقط مصدر forforfor.net.net 702 تنزيلات (ومعظم تنزيلات التحديث تحل مشكلة CVE ، والتي تشير على الأرجح إلى أن الأشخاص شاهدوا CVE وبدأوا في التحديث) ؛
  • CVE من 4 نوفمبر ، استغلال 25 أكتوبر ، وهذا يفي بمتطلبات الحداثة ؛
  • نظرت إلى المشكلة وحلها ، أصبحت مهتمًا (المزيد عن ذلك لاحقًا).

فهم أداة إدارة المشاريع ProjeQtOr


قرأنا وصف الاستغلال ووصف CVE على nist.gov ، ونحن نتفهم أن الإصدار 7.2.5 عرضة فقط لمستخدم مرخص. وأيضًا أنه يمكنك تحميل ملف .shtml كصورة ، على الرغم من أنه سيتم عرض رسالة الخطأ "هذا الملف ليس صورة صالحة" ، ولكن سيظل الملف محفوظًا في الصور الموجودة على الخادم ويمكن الوصول إليه عبر رابط مباشر في المضيف / الملفات / images / image_name .



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

  • المنطقة الزمنية على الخادم
  • إذا كانت الساعة على الخادم معطلة ؛
  • معرف المستخدم

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



بشكل عام ، لا يمثل الحصول على اسم الملف مشكلة. ننتقل. ونعتقد ، لماذا لا يتم تحميل نص PHP فقط؟ نحاول تنزيله ، تنبثق نفس النافذة ، لكن الملف لا يظهر في الدليل. حان الوقت للنظر في الرمز!

إن السكريبت uploadImage.php مسؤول عن تحميل الصورة إلى الخادم في الإصدار 7.2.5. نحن مهتمون بالسطور من 100 إلى 117.

if (substr($ext,0,3)=='php' or substr($ext,0,4)=='phtm') { if(@!getimagesize($uploadedFile['tmp_name'])) { $error=i18n('errorNotAnImage'); } else { traceHack("Try to upload php file as image in CKEditor"); } } else { if ( ! move_uploaded_file($uploadedFile['tmp_name'], $uploadfile)) { $error = htmlGetErrorMessage(i18n('errorUploadFile','hacking ?')); errorLog(i18n('errorUploadFile','hacking ?')); } } } if (!$error) { if(@!getimagesize($uploadfile)) { $error=i18n('errorNotAnImage'); } } 

السطر 100 مسؤول عن التحقق من امتداد الملف: إذا كان php أو phtm ، يتم التخلص من الملف ولا يتم حفظه. لذلك لا تظهر ملفات php في دليل "files / images /". ينشئ السطر 115 الخطأ الذي نراه ، ولكنه لا يفعل شيئًا مع الملف.

حسنًا ، دعنا لا نترك الاستغلال ونحمل الملف بامتداد .shtml. هنا يجدر عمل استطلاعات صغيرة وإخبار ما .shtml وماذا يؤكل.

SHTML و SSI


تعريف ويكيبيديا:

SSI (يتضمن جانب الخادم - التضمين في جانب الخادم) - لغة بسيطة لـ "التجميع" الديناميكي لصفحات الويب على الخادم من المكونات الفردية وتسليم مستند HTML المستلم للعميل. نفذت في خادم الويب أباتشي باستخدام وحدة mod_include. تسمح لك الميزة المضمنة في الإعدادات الافتراضية لخادم الويب بتضمين ملفات HTML ، وبالتالي ، لاستخدام الإرشادات ، يجب أن ينتهي الملف بالامتداد .shtml أو .stm أو .shtm.

بكلماتك الخاصة:

SHTML هو HTML يمكنه تنفيذ مجموعات التعليمات من جانب الخادم. من المفيد وجود وظيفة exec تقوم بتنفيذ أوامر عشوائية على الخادم (نعم ، يمكننا تنزيل الملف باستخدام كود HTML وتشغيله).

فيما يلي عينة من التعليمات البرمجية لتشغيل التعليمات البرمجية التعسفية:

 <!--#exec cmd=”ls” --> 

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

 <html> <head> <title>thegeekstuff.com</title> </head> <body> <p> Today is <!--#echo var="DATE_LOCAL" --> <!--#exec cmd="ls" --> </p> </body> </html>  : Today is Wednesday, 14-Nov-2018 17:29:14 MSK [an error occurred while processing this directive] 

إذا أخبرك أحدهم بما تكتبه في التهيئة بحيث يعمل بشكل صحيح ، فأنا أحب قراءته.

استغلال الثغرة الأمنية


إذا تلاقت النجوم ، يمكنك تنزيل ملف shtml وتنفيذ أوامر عشوائية (أو مثلي ، انظر الوقت على الخادم).

مشاهدة التصحيح


الإصدار التالي هو 7.2.6 ، ولكن لا توجد تغييرات فيما يتعلق بالضعف الذي نحن مهتمون به (تم خداع nist.gov مرة أخرى).

ننظر إلى الإصدار 7.2.7 ويبدو أن كل شيء تم إصلاحه (يقول المطورون أنفسهم أن كل شيء تم إصلاحه فقط في هذا الإصدار). هناك تغييران رئيسيان:

1. من بين الإضافات الممنوعة ، تمت إضافة "shtm" (إذا كانت الأحرف الأربعة الأولى كذلك ، فإن shtml يقع هنا أيضًا):

 if (substr($ext,0,3)=='php' or substr($ext,0,4)=='phtm' or substr($ext,0,4)=='shtm') { 


2. يتم حذف الملفات التي ليست صورًا الآن:

  if(@!getimagesize($uploadfile)) { $error=i18n('errorNotAnImage'); kill($uploadfile); } 

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

في برامج الويب وأمنها ، تعد القوائم السوداء شريرة أيضًا.

تجاوز القائمة السوداء من ProjeQtOr


حسنًا ، كل شيء بسيط. أولاً ، دعنا نرى الملفات التي يمكن لـ Apache2 + PHP تفسيرها في الإعدادات الافتراضية (تم تثبيت كل شيء على ubuntu 16.04 مع مستودع محدث). توجيه "FilesMatch" مسؤول عن القدرة على تفسير الملفات. نقوم بالبحث عنها باستخدام الأمر "grep -r" <FilesMatch "/ etc / apache2" وهذه هي النتيجة:

 /etc/apache2/mods-available/php7.0.conf:<FilesMatch ".+\.ph(p[3457]?|t|tml)$"> /etc/apache2/mods-available/php7.0.conf:<FilesMatch ".+\.phps$"> /etc/apache2/mods-available/php7.0.conf:<FilesMatch "^\.ph(p[3457]?|t|tml|ps)$"> /etc/apache2/sites-available/default-ssl.conf: <FilesMatch "\.(cgi|shtml|phtml|php)$"> /etc/apache2/apache2.conf:<FilesMatch "^\.ht"> 

في التهيئة default-ssl.conf ، يتم سرد كل الامتدادات بكل مجملها ، وهي: cgi و shtml و phtml و php. للأسف ، يتم تصفية كل شيء باستثناء cgi في ProjeQtOr.

يعد تكوين php7.0.conf أكثر إثارة للاهتمام ، حيث يتم تعيين الامتدادات بواسطة التعبير العادي. نحصل على:
التمديدما تمت تصفيته
فبsubstr ($ ext، 0.3) == 'php'
php3substr ($ ext، 0.3) == 'php'
فب 4substr ($ ext، 0.3) == 'php'
فب 5substr ($ ext، 0.3) == 'php'
فب 7substr ($ ext، 0.3) == 'php'
فاتلا شيء
phtml3substr ($ ext، 0.4) == 'phtm'

عظيم ، تم العثور على امتداد الملف الذي لم يتم تصفيته. نتحقق من أنه تم تفسيره حقًا.

قم بإنشاء ملف test.pht بالمحتويات التالية:

 <?php phpinfo(); 

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

نقوم بتحميل ملف الاختبار الخاص بنا في أداة إدارة المشاريع ProjeQtOr. بالطبع ، حصلنا على خطأ ، لأن هذه ليست صورة (في الإصدار قبل 7.2.7 ، لدينا بالفعل تنفيذ التعليمات البرمجية على الخادم ، لأن تغيير phpinfo إلى أوامر التنفيذ ليس صعبًا). في الإصدار 7.2.7 ، يتم حذف الملف ، ولا يتم تنفيذ الرمز.

لكننا لسنا مستاء وتجاوز الشيك على الصورة.

صورة PHP


يتم التحقق من ما إذا كان الملف الذي تم تنزيله صورة في أداة إدارة المشاريع ProjeQtOr بواسطة وظيفة getimagesize ، والتي تنظر ببساطة إلى رأس الملف المنقول.

الاستفادة من حقيقة أنه يمكن أن يكون هناك أي القمامة في ملف php ، ويبدأ تفسير كود php فقط بالأحرف "<؟ Php" ، نكتب رمزًا صغيرًا يكتب الصورة أولاً ، ثم رمز php الذي نحتاجه. كصورة ، سوف نرسل لقطة شاشة لنافذة الخطأ. 3 أسطر من كود بايثون وتنتهي:

 data = open ('test.png','rb').read() data += open ('test.pht','rb').read() open ('new_pht_png.pht','wb').write(data) 

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

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



ننتقل إلى الملف الذي تم تنزيله localhost / files / images / 20181114171730_1_new_pht_png.pht ونرى الصورة التي تم تنزيلها كنص ، وإخراج phpinfo أدناه. من الواضح أن استبدال phpinfo بقشرة ويب بسيطة ليس بالأمر الصعب. على سبيل المثال ، هذا: <؟ Php system ($ _ GET ['cmd'])؛



بمجرد البدء في اختيار تنزيلات الملفات ، تحتاج إلى إنهاء المهمة ومعرفة مكان آخر لتنزيل الملفات مع القوائم السوداء أو بدونها.

تحميل ملف آخر


سنشاهد في أحدث إصدار متاح. بافتراض أنك تستخدم نفس الوظيفة لتحميل الملفات كما كان من قبل ، أي move_uploaded_file ، نبحث عنه في دليل المشروع "grep -r" move_uploaded_file "./". نحصل على الملفات الخمسة التالية:

./tool/uploadImage.php
./tool/saveDocumentVersion.php
./tool/uploadPlugin.php
./tool/import.php
./tool/saveAttachment.php

تحميل ملف ImageImph.php - بدا بالفعل.
ملف saveDocumentVersion.php - يقوم بتنزيل إصدارات الوثائق (كما يوحي الاسم). نحن نحاول تنزيل مستند وإلقاء نظرة عليه (كبداية سنقوم دائمًا بتحميل صورة). بعد التنزيل ، نرى أن الامتداد .1 يضاف إلى الملف. نبحث في الكود عن كيفية الحصول على الاسم (يتم ذلك في السطر 229):

 $uploadfile = $dv->getUploadFileName(); 

تم التصريح عن دالة getUploadFileName في ملف DocumentVersionMain.php. هناك ، في السطر 227 ، نرى أن "." تمت إضافته إلى الاسم الذي تم إرجاعه. ومعرف الوثيقة. لا يمكننا الالتفاف حتى النقطة المضافة:

 return $uploaddir . $paramPathSeparator . $fileName . '.' . $this->id; 

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

يتوفر ملف import.php أيضًا للمسؤولين فقط. عند تنزيل ملف ، يقال لنا أنه يجب أن يكون ملف csv أو ملف xlsx. بالطبع نحاول تحميل ملف php ونرى خطأ:

خطأ - نوع الملف المقدم وتنسيق الملف المحدد غير متطابقين


تم إحباط الاستيراد

تكمن المشكلة في أنه ، كما هو الحال في الخطأ الأصلي من CVE ، لا يتم حذف الملف ، ولكنه يبقى متاحًا على localhost / files / attach / import / test.php .

يتم استخدام ملف saveAttachment عند تحميل أي مرفقات (على سبيل المثال ، عند تحميل صورتك الخاصة). لا يزحف البرنامج النصي PHP هناك ، حيث توجد حماية للنموذج:

 if (substr($ext,0,3)=='php' or substr($ext,0,4)=='phtm' or substr($ext,0,4)=='shtm') { $attachment→fileName.=".projeqtor"; 

اتضح إلى ملفات التمديد php * ، phtm * ، shtm * تم إضافة الامتداد ".projeqtor" ، أي من الواضح أن ملف pht الخاص بنا سيزحف إلى هناك (حتى بدون الزحف إلى الصور). نحاول ، ونحصل على كل شيء في العنوان localhost / files / attach / attachment_1 / test.pht .

المجموع النهائي لخمسة مواقع تنزيل الملفات التي تم العثور عليها بسرعة:

  • تمكنت من تحميل البرنامج النصي php أو pht 4 مرات ؛
  • التحقق من القائمة السوداء في قسمين ؛
  • التحقق من القائمة البيضاء ليس في أي مكان ؛
  • مرة واحدة فشلت في تحميل الملف (فشل في التحميل ، ولكن فشل في التنفيذ) ، لأن التوسع كان يتغير

استنتاجات حول أداة إدارة المشاريع ProjeQtOr و CVE 2018-201924



  • تم القضاء على الضعف المبلغ عنها عمليا.
  • هناك ثغرات أخرى في الشفرة (تم إبلاغ المطورين بها ، بل ووعدوا بقوائم بيضاء من الإضافات) ؛
  • يمكن أن ينقذنا التكوين الصحيح لخادم Apache2 من كل شيء (قصر التنسيقات القابلة للتنفيذ على الضرورة فقط ، وحظر تنفيذ البرامج النصية في مجلدات المستخدم) ؛
  • لا يحتوي nist.gov على أحدث إصدار عرضة للخطر.

مذكرة عشيقة


  • رفض القوائم السوداء حيثما أمكن ذلك (لا أعرف أين يكون ذلك مستحيلاً) ؛
  • كن حذرا ويقظا عند معالجة الملفات التي تم تنزيلها (من الأفضل أن تكون في مكان واحد ، ولا تنتشر في 5) ؛
  • يحفظ خادم الويب الذي تم تكوينه بشكل صحيح من العديد من المشاكل في رمز المشروع (من المهم كتابة التعليمات البرمجية وتكوين الخادم جيدًا).

إجابة مفصلة من المطورين


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

ثم تلقى إجابة تفصيلية: "نعم هناك مشاكل ، وسيتم حلها في الإصدار 7.3.0. ستتم إضافة قوائم بيضاء للصور لكل من xlslx و csv. " كما كتبوا أن لديهم توصية لإضافة أدلة "المرفقات" و "المستندات" خارج الوصول إلى الويب في تعليمات التثبيت.

سمح لي المطورون بتسجيل CVE وكتابة مقال بعد التحديث (الذي صدر ومتاح للتنزيل ).

الخلاصة


كما كتبت في البداية ، قام عدد قليل من الأشخاص بتنزيل التحديث لاتخاذ قرار بشأن CVE (أكثر من 500 عملية تنزيل) ، ومن الرائع أن يقوم الأشخاص بتحديث برامجهم الضعيفة ، ولكن من المحزن أن يظل البرنامج ضعيفًا.

ونتيجة لذلك ، تم تعيين أربعة CVEs لي ولشركتنا: CVE-2018-19307 ، CVE-2018-19308 ، CVE-2018-19309 ، CVE-2018-19310.

Source: https://habr.com/ru/post/ar430408/


All Articles