
كتابة عن صندوق Steel Mountain من TryHackMe.com واستغلال لـ CVE-2014-6287
شرح حول جهاز Steel Mountain من TryHackMe.com واستغلال لـ CVE-2014-6287
لا أحمل أي فضل للاكتشاف الأصلي واستغلال هذه الثغرة. شكراً للأشخاص التاليين!
الاكتشاف:
Daniele Linguaglossa
مؤلف وحدة Metasploit:
Muhamad Fadzil Ramli
غرفة TryHackMe والمؤلف:
https://tryhackme.com/room/steelmountain
https://tryhackme.com/p/tryhackme
المراجع:
https://nvd.nist.gov/vuln/detail/CVE-2014-6287
https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/windows/http/rejetto_hfs_exec.rb
https://subscription.packtpub.com/book/networking_and_servers/9781786463166/1/ch01lvl1sec20/vulnerability-analysis-of-hfs-2-3
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6287
https://www.tutorialspoint.com/pascal/pascal_functions.htm
أنا لست بأي حال من الأحوال محترفاً متمرساً في الأمن. هذا يعني أنني قد أقدم بعض المعلومات غير الصحيحة. إذا كنت محترفاً متمرساً/باحثاً ذا خبرة ورأيت شيئاً غير صحيح، فأرجو إبلاغي حتى أتمكن من العودة، ودراسة ما أخطأت فيه وتقديم المعلومات الصحيحة. هذا مفيد لي وللباحثين المبتدئين الآخرين الذين قد يصادفون هذا الشرح. إذا وجدت معلومات خاطئة كتبتها، يرجى الاتصال بي على [email protected] حتى أتمكن من إصلاحها. شكراً لك!
خادم ملفات Rejetto (المعروف أيضاً بـ HFS) هو برنامج لمشاركة الملفات يُستخدم لنشر ومشاركة الملفات عبر الشبكة. في الإصدار 2.3، كانت هناك ثغرة سمحت للمهاجم بتنفيذ أوامر النظام عن طريق إدخال بايت فارغ (null byte) في معلمة البحث كما هو موصوف في CVE-2014-6287. لا يقوم الكود بمعالجة البايت الفارغ بشكل صحيح مع إعدادات التعبير المنتظم (Regular Expression) وبالتالي يؤدي إلى ثغرة تنفيذ أوامر عن بعد.
يمكن العثور على الثغرة في دالة findMacroMarker التي تأتي من ملف parserLib.pas. .pas هو امتداد الملف للغة البرمجة Pascal. وقت كتابة هذا النص، لم أقم ببرمجة أي شيء بلغة Pascal. دعنا نلقي نظرة على مقتطف الكود ونحلل ما يفعله!
function findMacroMarker(s:string; ofs:integer=1):integer;
begin result:=reMatch(s, '{[.:]|[.:]}||', 'm!', ofs) end;
السطر الأول من الكود هو إعلان لدالة تسمى findMacroMarker تأخذ معاملين. في لغة Pascal، يجب الإعلان عن نوع بيانات المعاملات، وبالتالي s:string يعني أن المتغير s هو string، وكذلك الأمر بالنسبة للمتغير ofs بنوع بيانات integer. إلى يمين المعاملات، نرى علامة نقطتين متبوعة بـ integer. يُعرف هذا بنوع الدالة. تشير الفاصلة المنقوطة إلى نهاية هذا السطر من الكود. الكلمة الأولى في السطر التالي من الكود هي begin. يخبر هذا المترجم أين تبدأ الدالة. ننتقل لنرى متغيراً يسمى result متبوعاً بعامل الإسناد :=. يُسنَد المتغير result إلى دالة reMatch. لم أتمكن من العثور على أي شيء عن reMatch على الإنترنت، لذا أفترض أنها دالة مخصصة مكتوبة في مكان آخر داخل HFS. لحسن الحظ، الدالة واضحة بذاتها. هي بوضوح اختصار لـ "regular expression match" (مطابقة التعبير المنتظم) متبوعة بنمط التعبير المنتظم الذي تبحث عنه، والذي يتم توضيحه في معاملات دالة بالإضافة إلى معاملات المتغيرات الأولية المحددة في السطر الأول من الكود. في نهاية السطر الثاني، تُستخدم كلمة لتعريف نهاية الدالة للمترجم.
توجد الثغرة في نمط التعبير المنتظم كما هو موصوف أعلاه في دالة reMatch. يفشل التعبير المنتظم في التعامل بشكل صحيح مع البايت الفارغ %00. عندما نمرر أمر نظام مع بايت فارغ مسبق، ستواجه الدالة الخلل وتنفذ الأمر على الحاسوب المضيف. لاستغلال هذه الثغرة، كل ما علينا فعله هو تمرير البايت الفارغ في معلمة البحث لطلب GET متبوعاً بـ {.exec|code.} (حيث code هو الأمر الذي تريد تنفيذه) عبر الرابط بهذا الشكل:
http://(IP-Address/DomainName)/?search=%00{.exec|CommandGoesHere.}.
لنبدأ بمسح المنافذ باستخدام rustscan. أفضل استخدام rustscan للحصول على نظرة سريعة على سطح الهجوم.

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

لدينا خدمة تسمى Microsoft windows RPC تعمل على المنافذ العليا. RPC تعني "استدعاء إجراء عن بعد" (Remote Procedure Call). وهذا يسمح لعمليات ويندوز بالتواصل عبر الشبكة أو داخلياً داخل الحاسوب نفسه. بالمضي قدماً، لدينا عدة خوادم ويب مختلفة تعمل على المنفذين 80 و 8080. على المنفذين 5985 و 47001، يوجد Microsoft Httpapi Httpd الذي يسمح للتطبيقات بالتواصل عبر HTTP دون الحاجة إلى Microsoft IIS (خادم معلومات الإنترنت). يكتشف nmap وجود خادم ويب ربما على المنفذ 3389، لكنني لم أتمكن من الاتصال عبر HTTP أو SSL. لنتصل بخادم الويب على المنفذ 80 لأنه المنفذ القياسي لبروتوكول HTTP.

على المنفذ 80، نرى صفحة ويب تعرض شعار شركة Steel Mountain وصورة معنونة "موظف الشهر". إذا فتحنا أدوات مطور الويب، يمكننا رؤية أن الصورة مسماة BillHarper.png مما يعطينا إجابة السؤال الأول. لنتصل بالخدمات الأخرى المستمعة ونرى ما يمكننا إيجاده.

عند الاتصال بالخدمة على المنفذ 5985، نحصل على رمز خطأ HTTP 404. رمز الخطأ 404 يعني أن الخادم لا يمكنه العثور على المورد المطلوب. لا يوجد شيء مثير للاهتمام هنا. لننتقل إلى التالي.

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

إذا نقرنا على الرابط المسمى HttpFileServer 2.3، ننتقل إلى صفحة ويب لاسم البرنامج الذي يعمل على المنفذ 8080. في هذه الحالة، لدينا Rejetto HFS HTTP File Server. لنتحقق من المنفذ الآخر على 47001 لنغطي جميع القواعد. إذا لم نجد شيئاً مفيداً، يمكننا العودة إلى Rejetto والبدء في البحث عن ثغرات معروفة (CVE).

يبدو أن لدينا خطأ 404 آخر على المنفذ 47001. لنبدأ البحث عن ثغرات معروفة لـ Rejetto HFS 2.3.

يكشف بحث سريع عن وجود إدراج CVE معروف لـ HFS 2.3. سننحرف عن دليل THM ونبتعد عن Metasploit الجاهز. لقد كتبت استغلالاً سيمنحنا شل (shell). لاستخدامه، يجب عليك الذهاب إلى revshells.com، وإدخال معلومات الشبكة الصحيحة واختيار PowerShell #3 (Base 64). عندما تحصل على الحمولة، انسخها والصقها في متغير payload في السطر 13 وقم بتشغيل الاستغلال. سيتم فتح مستمع تلقائياً ويجب أن تحصل على الوصول إلى النظام. ملاحظة: قد تحتاج إلى تشغيل الاستغلال عدة مرات لاصطياد الشل.

بوم! نحن داخل النظام، وكإضافة، لدينا شل PowerShell. وهذا يعني أنه سيكون لدينا إمكانية الوصول إلى أدوات .NET cmdlets. يمكننا أن نكون أكثر خطورة بهذا من شل موجه الأوامر القياسي. لننتقل إلى رفع الامتيازات. يقدم لنا دليل THM أداة مفيدة تسمى PowerSploot والتي تحتوي على أداة لاستكشاف الجهاز بحثاً عن ناقلات رفع الامتيازات المحتملة. سنقوم بتنزيل PowerUp.ps1 على الجهاز واستخدامه لمساعدتنا في السيطرة على الجهاز.

أولاً، نبدأ خادم HTTP بسيط في الدليل الذي يحتوي على ملف PowerUp.ps1 على نظامنا. بعد ذلك، على نظامنا الهدف، نستخدم cmdlet Invoke-Webrequest لسحب الملف من خادمنا إلى الجهاز الهدف. سنقوم الآن بتثبيت وتشغيل أحد cmdlets التي تأتي مع PowerUp.

لتثبيت PowerUp.ps1، قم بتشغيل هذا الأمر: . .\PowerUp.ps1. بعد ذلك، سنحتاج إلى استخدام cmdlet الجديد Invoke-AllChecks. بعد تشغيله، نرى الكثير من المخرجات. لقد قمت بتقليصها إلى الجزء المهم الذي نريده. يمكننا أن نرى أن PowerUp أخبرنا أن لدينا أذونات لتعديل الملف. لنتحقق من الخدمات قيد التشغيل حتى نتمكن من إيقافها إذا كانت تعمل. نحتاج إلى فعل هذا لأننا لا نستطيع فعل أي شيء مع الملف إذا كان يُستخدم بواسطة خدمة.

باستخدام cmdlet Get-Service، نرى قائمة بالخدمات الموجودة على الجهاز. نظراً لأن الخدمة المستهدفة قيد التشغيل، سنحتاج إلى إيقافها حتى نتمكن من تعديل واستبدال الملف الثنائي.

لإيقاف الخدمة، نستخدم cmdlet Stop-Service متبوعاً باسم الخدمة. الآن نحتاج إلى التحقق مرة أخرى من أن الخدمة متوقفة باستخدام cmdlet Get-Service. كما هو موضح أعلاه، يمكننا التأكد من أن الخدمة قد توقفت بالفعل. لننتقل إلى الدليل الذي يحتوي على الملف الثنائي المستهدف. الدليل هو C:\Program Files (x86)\IObit\Advanced SystemCare.

لاحظ حجم الملف الثنائي الموجود على يسار اسم الملف الثنائي في العمود الأيمن الأقصى.

أنشئ حمولة meterpreter واستضفها باستخدام وحدة خادم الويب Python كما فعلنا من قبل.

شغّل مستمع meterpreter باستخدام نفس معلومات الشبكة التي استخدمتها لإنشاء الحمولة.

استخدم cmdlet Invoke-Webrequest لسحب حمولة meterpreter الخاصة بنا إلى النظام الهدف من جهازنا. تأكد من تسميتها ASCService.exe حتى نتمكن من استغلال أذونات الملف الضعيفة واستبدال الملف الثنائي العادي بملفنا الخبيث.

تأكد من استبدال الملف الثنائي عن طريق سرد الدليل والتحقق مما إذا كان حجم الملف قد تغير. في هذه الحالة، تغير من رقم مكون من 6 أرقام إلى رقم مكون من 5 أرقام مما يؤكد أننا نجحنا في رفع ملفنا الخبيث!

عندما يحل الملف الخبيث محل الملف العادي، كل ما علينا فعله هو إعادة تشغيل الخدمة باستخدام cmdlet Start-Service. عندما نفعل ذلك، سيقوم الجهاز بتنفيذ حمولتنا ويمنحنا شل meterpreter! يمكننا تشغيل getuid في meterpreter للتحقق مما إذا كان لدينا NT AUTHORITY/SYSTEM. عندما نشغل getuid، يمكننا بالفعل أن نرى أننا تملكنا هذا الجهاز! أتمنى لك يوماً رائعاً!
reMatchreMatchend