
تم تنفيذ ثغرة رفع الامتيازات في خدمة الطباعة بنظام ويندوز (CVE-2019-1040/CVE-2019-1019) كمكتبة DLL عاكسة (Reflective DLL) لأغراض اختبار الاختراق.
PrintSpoofer هي أداة تقوم بترقية الصلاحيات محلياً عن طريق استغلال ثغرة أمنية في خدمة Windows Print Spooler (CVE-2019-1040 / CVE-2019-1019). ينفذ هذا المشروع استغلال PrintSpoofer بصيغة Reflective DLL، مما يجعله مناسباً للاستخدام مع أطر اختبار الاختراق مثل Cobalt Strike.
يستغل PrintSpoofer ثغرة أمنية في خدمة Windows Print Spooler تسمح لمستخدم منخفض الصلاحية بالحصول على صلاحيات مستوى SYSTEM. يسيء الاستغلال استخدام الطريقة التي تتعامل بها خدمة Print Spooler مع الأنابيب المسماة (named pipes).
يعمل PrintSpoofer من خلال تنفيذ الخطوات التالية:
يتحقق الاستغلال أولاً مما إذا كان الرمز المميز الحالي لديه صلاحية SE_IMPERSONATE_NAME. هذه الصلاحية مطلوبة لانتحال رمز مميز لمستخدم آخر.
يتم إنشاء أنبوب مسمى باستخدام UUID عشوائي. مسار الأنبوب هو:
\\.\pipe\<UUID>\pipe\spoolss
يتم انتظار اتصال غير متزامن على الأنبوب المُنشأ. يتم إنشاء حدث (event)، ويتم تجهيز الأنبوب لقبول الاتصالات الواردة.
في سلسلة (thread) منفصلة، يتم إجراء استدعاء RPC لخدمة Print Spooler.
من خلال استدعاء RpcRemoteFindFirstPrinterChangeNotificationEx، تحاول الخدمة الاتصال بالأنبوب الذي أنشأناه.
عندما تتصل خدمة Print Spooler (التى تعمل كـ SYSTEM) بالأنبوب المسمى، يستخدم الاستغلال ImpersonateNamedPipeClient لانتحال الرمز المميز للخدمة.
يؤدي هذا إلى الحصول على صلاحيات SYSTEM.
مع رمز مميز لـ SYSTEM، يمكن الآن تنفيذ إجراءات عالية الصلاحية.
تقوم خدمة Windows Print Spooler بمعالجة إشعارات الطابعة من خلال الأنابيب المسماة. نظرًا لأن الخدمة لا تتحقق بشكل صحيح من اتصالات الأنابيب، يمكن للمهاجم إجبارها على الاتصال بأنبوب خبيث ثم انتحال رمز SYSTEM المميز.
يتواصل المشروع مع خدمة Print Spooler باستخدام MS-RPRN (Print System Remote Protocol). يتم تعريف هذا البروتوكول من خلال ملف IDL (Interface Definition Language) ويُمكّن من استدعاءات RPC.
يتصرف الـ Reflective DLL بشكل مختلف عن الـ DLLs القياسية:
LoadLibraryافتح ملف PrintSpoofer.sln في Visual Studio.
حدد منصة الحل (Solution Platform) والتكوين (Configuration):
x64 أو Win32 (حسب بنية الهدف)Release (إنتاج) أو Debug (تطوير)قم ببناء الحل من خلال Build Solution (Ctrl+Shift+B).
سيكون ملف DLL المُجمّع موجودًا في:
PrintSpoofer\x64\Release\PrintSpoofer.dll (لـ x64)
PrintSpoofer\Win32\Release\PrintSpoofer.dll (لـ x86)
يستخدم المشروع تعريفات المعالجة المسبقة التالية:
REFLECTIVE_DLL_EXPORTS: تمكين تصديرات Reflective DLLREFLECTIVEDLLINJECTION_CUSTOM_DLLMAIN: استخدام DllMain مخصصةREFLECTIVEDLLINJECTION_VIA_LOADREMOTELIBRARYR: تمكين LoadRemoteLibraryR (في وضع Release)يمكن استخدام PrintSpoofer مع أمر elevate الخاص بـ Cobalt Strike:
elevate PrintSpoofer LISTENER_NAME
حيث:
PrintSpoofer: اسم وحدة الارتقاء (elevator module)LISTENER_NAME: المستمع الذي سيستقبل الصدفة المرتفعة الصلاحيةيمكن تحميل ملف DLL يدويًا باستخدام تقنيات حقن Reflective DLL.
سينتج عن تنفيذ استغلال ناجح ما يلي:
[+] Found privilege: SeImpersonatePrivilege
[+] Named pipe listening...
[+] ImpersonateNamedPipeClient OK
[+] Exploit successfully, enjoy your shell
dllmain.cppDllMain)PrintSpoofer.cppms-rprn.idlReflectiveLoader.cppهذه الأداة مخصصة لأغراض تعليمية فقط ولـ اختبار الاختراق المصرح به.
هذا المشروع مرخص بموجب رخصة MIT. لمزيد من المعلومات، انظر ملف LICENSE.