
ملف كائن Beacon الخاص بـ Cobalt Strike ينفذ CVE-2020-0796 SMBGhost لتصعيد الامتيازات المحلي مع مسارين للاستخدام الهجومي من أجل سرقة الرمز المميز ورفع مستوى الجلسة.
هذا هو تجربة رافاييل مع ثغرة SMBGhost LPE.
لقد بدأت مع الكود المصدري من إطار Metasploit:
cve-2020-0796: SMBv3 Compression Buffer Overflow (SMBGhost) (CVE 2020-0796) https://github.com/rapid7/metasploit-framework/tree/master/external/source/exploits/CVE-2020-0796 [BSD Licensed]
وإليك ما فعلته:
تطلب هذا الإعلان عن العديد من واجهات برمجة تطبيقات Win32 بتنسيق MODULE$Function الخاص بحل الوظائف الديناميكي. على الجانب الإيجابي، قلل هذا من بعض الكود لاستدعاء أشياء في NTDLL لأن DFR يتولى ذلك بالنسبة لنا. :)
أزلت مصفوفة ptr غير المستخدمة المكونة من 1000 عنصر من get_handle_addr. كان هذا يتسبب في إدراج cl.exe لدالة __chkstk بسبب تجاوز المتغيرات المحلية لحد 8KB. BOFs لا تملك هذه الدالة متاحة لها.
ثم أدخلت بعض واجهات برمجة التطبيقات الخاصة بـ Beacon (مثل BeaconPrintf، BeaconInjectProcess، إلخ) للقيام بالأشياء باستخدام الطريقة الأصلية لـ Beacon.
اضطررت لكتابة بعض الدوال لتعويض أشياء libc التي لا أملكها (بسبب... BOFs).
استخدم الاسم المستعار 'smbghost' في Beacon، بدون وسائط، لتشغيل هذه الثغرة والتأثير فقط على رمز عملية Beacon. إذا نجحت الثغرة، سيمتلك رمز العملية الحالي لديك قوى خارقة لم تكن لديك من قبل. على سبيل المثال، يمكنك الآن الحقن في عمليات أخرى (حتى في جلسات سطح مكتب أخرى) أو إنشاء عملية فرعية تحت winlogon.exe. قد تحتاج لتشغيل smbghost عدة مرات لأن الثغرة لا تنجح دائمًا في المرة الأولى.
اختياريًا، استخدم 'elevate smbghost' للحصول على جلسة Beacon جديدة باستخدام واجهة برمجة رفع الامتيازات المتاحة في Aggressor Script الخاص بـ Cobalt Strike. هذا مقبول لعرض سريع، يتناسب مع سير عمل المنتج، إلخ ولكن... يحقن في winlogon.exe. الحقن في winlogon.exe ليس ثابتًا لهذه الحالة الخاصة من الرفع. أظن أن جميع PoCs العامة تفعل ذلك لأن CreateRemoteThread لا يعمل عبر حدود العمليات ومن يريد كتابة الكود الإضافي لتزييف العملية الأم؟ winlogon.exe هو الهدف السهل الواضح لإظهار أن لدينا صلاحيات مرتفعة.
لتجميع هذا مع Visual Studio:
استخدم make.bat من x64 Cross Tools Command Prompt.
سيقوم هذا بإخراج expoit.x64.o إلى dist/
استخدمت Visual Studio 2013. لم يتم اختبار مترجمين/إصدارات أخرى. لم أحاول/أختبر x86.