PrintNightmare 漏洞复现及分析
漏洞简介
前段时间,微软公布了名为Windows PrintNightmare的安全漏洞,获得编号CVE-2021-34527。其与漏洞CVE-2021-1675极其相似,都是通过加载DLL的方式实现代码执行。未经身份验证的远程攻击者可利用该漏洞以SYSTEM权限在域控制器上执行任意代码,从而获得整个域的控制权。微软对于该漏洞的修补工作并没有一步到位,在第一次漏洞爆出并发布修补程序后,仍可以通过其他方式绕过补丁继续利用该漏洞,微软不得不二次进行修补才成功杜绝该漏洞所带来的安全问题。
影响范围:Windows Server 2008-Windows Server 2019
漏洞分析
漏洞点分析
CVE-2021-1675的漏洞点位于RpcAddPrinterDriverEx中,CVE-2021-34527的漏洞点位于RpcAsyncAddPrinterDriver中。系统在对上述两个函数进行相关处理后,都调用了YAddPrinterDriverEx函数,但是这个过程并没有对参数dwFileCopyFlags进行条件判断,所以可以添加一个标志APD_INSTALL_WARNED_DRIVER,使得添加打印机驱动时,以system权限加载恶意DLL。

Mimikatz中针对PrintNightmare攻击的实现代码



两个漏洞分别的漏洞点
漏洞具体分析
越过权限校验
通过YAddPrinterDriverEx添加打印机驱动时,Windows原本会在SplAddPrinterDriverEx中通过ValidateObjectAccess对当前用户权限进行校验,如果权限校验失败将无法加载驱动。但是由于添加了标志APD_INSTALL_WARNED_DRIVER(0x8000),所以成功越过了对于权限的检查。

YAddPrinterDriverEx本地的内部实现位于localspl.dll中的InternalAddPrinterDriverEx函数,添加驱动的过程如下:
检查驱动签名 建立驱动文件列表 检查驱动兼容性 拷贝驱动文件
如果能够绕过其中的限制,将恶意DLL复制到驱动目录并加载,就可以完成本地提权。
检查驱动签名
localspl!ValidateDriverInfo在如下