Print Nightmare 漏洞分析
1. 漏洞原理
Print Nightmare 的核心原理是权限升级和任意文件写入。它利用了 RpcAddPrinterDriver
这个 RPC(远程过程调用)函数中存在的逻辑缺陷
RpcAddPrinterDriverEx
函数:这是一个用于在服务器上安装打印机驱动的函数。通常情况下,只有拥有管理员权限的用户才能调用这个函数- 非特权用户的利用:漏洞的根源在于,攻击者发现可以通过一个普通用户的身份,调用这个函数,并让其加载一个恶意的 DLL 文件
- 权限升级:当打印后台处理程序(
spoolsv.exe
)以 SYSTEM 权限运行,并加载这个恶意 DLL 文件时,恶意代码也会以 SYSTEM 权限执行,从而实现权限提升
简单来说,攻击者利用这个漏洞欺骗了 SYSTEM 权限的打印服务,让它去加载一个恶意的 DLL 文件,从而以最高权限运行恶意代码
2. 漏洞利用过程
一个典型的 Print Nightmare 漏洞利用过程可以分为以下几步:
- 准备恶意 DLL:攻击者首先需要编写一个恶意的 DLL 文件。这个 DLL 文件的核心功能是建立反向 Shell、创建新的管理员账户或者执行任意系统命令
- 准备 SMB 共享:攻击者将这个恶意 DLL 文件放置在自己的机器上,并通过 SMB(Server Message Block)协议共享出来
- 发起 RPC 请求:攻击者以一个普通用户的身份,向目标机器的打印服务发起一个
RpcAddPrinterDriverEx
RPC 请求 - 恶意 DLL 加载:在 RPC 请求中,攻击者指定要加载的驱动文件路径为自己的 SMB 共享路径。当打印服务收到这个请求后,它会以 SYSTEM 权限去连接攻击者的 SMB 共享,并加载恶意 DLL 文件
- 远程代码执行:一旦 DLL 文件被加载到
spoolsv.exe
进程中,其中的恶意代码就会被执行,从而在目标机器上获得 SYSTEM 权限