CVE-2021-34527是发生在windows打印服务中的漏洞,攻击者可以利用该漏洞使用低权限用户加载恶意DLL,实现远程代码执行。该漏洞于6月29日以0day的形式被披露[1],被称为PrintNightmare,直到7月6号,微软才推出相应的紧急补丁[2]。此外,该漏洞和微软六月份修复的CVE-2021-1675漏洞十分类似,都是通过加载DLL的方式实现代码执行。
一、背景
CVE-2021-34527是发生在windows打印服务中的漏洞,攻击者可以利用该漏洞使用低权限用户加载恶意DLL,实现远程代码执行。该漏洞于6月29日以0day的形式被披露[1],被称为PrintNightmare,直到7月6号,微软才推出相应的紧急补丁[2]。此外,该漏洞和微软六月份修复的CVE-2021-1675漏洞十分类似,都是通过加载DLL的方式实现代码执行。
二、CVE-2021-1675分析
该漏洞发生在 AddPrinterDriverEx函数,它一共有三个参数,其中第三个参数是flag,该flag有一个特殊的值并未在官方文档中出现:APD_INSTALL_WARNED_DRIVER = 0x00008000。根据图 1中的代码逻辑,在调用InternalAddPrinterDriverEx之前,会通过bittest对flag的第0xf位进行校验。如果该值为1的话,则v12的值仍然为0,可以绕过24行中对Access的检查,成功调用InternalAddPrinterDriverEx。
图1. APD_INSTALL_WARNED_DRIVER通过权限校验
微软在6月8日修复了该漏洞,具体是在AddPrinterDriverEx中加入了对权限的校验,重点在于YIsElevated、YIsElevationRequered和RunningAsLUA三个函数,当v12==0、v13==1并且v9==1时,flag中的0x8000会通过&操作被去掉,导致后续调用到SplAddPrinterDriverEx时权限验证失败,阻止了漏洞发生。
图 2. CVE-2021-1675漏洞补丁
三、CVE-2021-34527(PrintNightmare)分析
PrintNightMare漏洞可以理解成对CVE-2021-1675补丁的绕过,本文以mimikatz[3]中提供的exp为例进行漏洞分析。
Mimikatz中利用的PrintNightmare漏洞使用到了另一个打印服务的API:RpcAsyncAddPrinterDriver,用于绕过上述补丁中的权限检查。如图 2代码所示,该API同样可以设置flag,增加APD_INSTALL_WARNED_DRIVER,由于该函数没有增加校验过程,因此可以完美绕过后续的bittest检查,实现恶意DLL加载和代码执行。
图3. Mimikatz中printnightmare利用部分代码
具体看,exp首先调用spoolsv!TRemoteWinspool::RpcAsyncAddPrinterDriver函数,如图 4所示,该函数会调用TFunction4设置回调。
图4. RpcAsyncAddPrinterDriver函数
TFunction4设置了对YAddPrinterDriverEx的调用,如图 5所示,v7偏移128处即为YAddPrinterDriverEx;在图 6中,异步回调用到了a1偏移128处的函数指针进行调用,即调用了YAddPrinterDriverEx。
图5. TFunction4设置回调函数
图6. 异步调用YAddPrinterDriverEx回调
调用到YAddPrinterDriverEx时,flag中的APD_INSTALL_WARNED_DRIVER项仍然存在,因此可以绕过添加DLL前的权限检查,实现DLL加载。
图 7. 恶意DLL加载
四、PrintNightmare补丁分析
微软的补丁主要修改了RpcAddPrinterDriverEx和RpcAsyncAddPrinterDriver两个函数。
- RpcAddPrinterDriverEx补丁
如图 9所示,在RpcAddPrinterDriverEx中,补丁增加了YIsInAdministratorGroup函数来判断当前用户是否在Administrator组中,如果不在的话,v9,v12和v13的值为false;
图9. RpcAddPrinterDriverEx补丁
如图 10所示,YIsElevationRequired函数会通过获取注册表项NoWarningNoElevationOnInstall的值来判断是否需要提升权限以安装驱动,该函数返回值如果为true则表示需要。如果 v12的值为false,则会导致第58行的if判断成功,并进一步在59行中清除flag的APD_INSTALL_WARNED_DRIVER项。
图10. YIsElevationRequired函数实现
YRestrictDriverInstallationToAdministrators函数同样也是通过注册表项来判断,是否可以向Administrator组中安装驱动,如果返回true的话,则会对图 9中61行的判断产生影响,导致无法添加驱动(在v13为false时)。
图 11. YRestrictDriverInstallationToAdministrators函数实现
- RpcAsyncAddPrinterDriver补丁
在针对RpcAsyncAddPrinterDriver的补丁中,同样增加了对于权限的校验,当YIsElevationReuqred函数返回True时,同样会清除flag中的APD_INSTALL_WARNED_DRIVER项。
图 12. RpcAsyncAddPrinterDriver补丁
五、参考资料
[1]. hhlxf (Jun 29, 2021). PrintNightmare. https://github.com/afwu/PrintNightmare
[2]. MSRC (Jul 06, 2021). Windows Print Spooler Remote Code Execution Vulnerability (CVE-2021-34527). https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-34527
[3]. Benjamin DELPY (Jul 01, 2021). mimikatz misc::printnightmare little POC. https://github.com/gentilkiwi/mimikatz
推荐阅读
[从 CVE-2020-1048 到 CVE-2020-17001:Windows打印机模块中多个提权漏洞分析](http://https://mp.weixin.qq.com/s?__biz=MzI2NTg4OTc5Nw==&mid=2247497271&idx=1&sn=2e2d557249a47ca2efc27fbbe4fc38e1&chksm=ea94c75ddde34e4b1cb5cb8a5d601959a1d861578b9a4ce383eae9bb56d3e0e41b4acc0b73d7&scene=21#wechat_redirect "从 CVE-2020-1048 到 CVE-2020-17001:Windows打印机模块中多个提权漏洞分析")
[微软“照片”应用Raw 格式图像编码器漏洞 (CVE-2021-24091)的技术分析](http://https://mp.weixin.qq.com/s?__biz=MzI2NTg4OTc5Nw==&mid=2247502693&idx=1&sn=0daf4033d561438e292f3eb4f09e5a9d&chksm=ea94fa0fdde37319e7b1a6767bf76396b3b91e1326ef9e397b38fe69443f651d7f52581ff9ec&scene=21#wechat_redirect "微软“照片”应用Raw 格式图像编码器漏洞 (CVE-2021-24091)的技术分析")
[开源OS FreeBSD 中 ftpd chroot 本地提权漏洞 (CVE-2020-7468) 的技术分析](http://https://mp.weixin.qq.com/s?__biz=MzI2NTg4OTc5Nw==&mid=2247499356&idx=1&sn=f95ec3f9ca222c3ccef3d1162af259b8&chksm=ea94cf36dde34620d380b15d760f31aa5b3729cc379fa68a784ddcefde453df7db3a28a99f29&scene=21#wechat_redirect "开源OS FreeBSD 中 ftpd chroot 本地提权漏洞 (CVE-2020-7468) 的技术分析")
[详细分析 Sonlogger 任意文件上传漏洞 (CVE-2021-27964)](http://https://mp.weixin.qq.com/s?__biz=MzI2NTg4OTc5Nw==&mid=2247504045&idx=1&sn=71126e3dac71d3736468e96b9cedf9fe&chksm=ea94e1c7dde368d1ff301fee22cb5a1f5a65c0a967c889a2929ff95928154be87755e720d40d&scene=21#wechat_redirect "详细分析 Sonlogger 任意文件上传漏洞 (CVE-2021-27964)")
[手把手教你详细分析 Chrome 1day 漏洞 (CVE-2021-21224)](http://https://mp.weixin.qq.com/s?__biz=MzI2NTg4OTc5Nw==&mid=2247503816&idx=1&sn=b0ae08a18c52c073c5b068dbd28c3a74&chksm=ea94fea2dde377b43503c1fdb4325ac1559fa8c2b0c6d650e3374d8865a7365aa823a0b16c12&scene=21#wechat_redirect "手把手教你详细分析 Chrome 1day 漏洞 (CVE-2021-21224)")
[Codecov后门事件验证分析](https://mp.weixin.qq.com/s?__biz=MzI2NTg4OTc5Nw==&mid=2247503674&idx=2&sn=b35c0a3d3d1ca1423065739374b05aeb&chksm=ea94fe50dde377465a54d11a561b7f0c5914dc609e0f86bb14ee256c818ac1e1f1c84ae0e905&scene=21#wechat_redirect "Codecov后门事件验证分析")
- 本文作者: 奇安信代码卫士
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/249
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!