我读过的很多博客文章都讨论了有趣的漏洞和漏洞利用,但作者们通常不会分享发现背后的过程。我想向大家展示一下,有时只要手动寻找一下就可以快速发现其他漏洞发现方法可能遗漏的漏洞。
在我之前的博客中,我重点介绍了一个名为IO Ninja的工具,并讲解了为什么它在处理进程间通信(IPC)时很有帮助。在这篇博客中,我想向您展示这个工具如何帮助我在windows上的Bitdefender防病毒软件中发现这两个漏洞:CVE-2021-4198和CVE-2021-4199。我编写的漏洞利用针对Vulnerability.scan.exe进程使用的命名管道。第一个漏洞会导致AV中几乎所有进程的拒绝服务,第二个漏洞通过利用漏洞导致本地特权升级。
现在您可能在想,这个允许您与命名管道通信的工具是如何让您找到漏洞后的链接?这就是我们接下来要深入探讨的内容。
Sysinternals的管道列表工具显示Bitdefender使用多个管道进行进程间通信。
图1–Sysinternals工具套件中pipelist实用程序的输出
bdservicehost.exe是安装Bitdefender后作为系统运行的可执行文件之一。它使用这些管道与系统上的其他进程进行通信,并且它可能是一个有趣的目标。
图2–bdservicehost.exe使用的命名管道列表
使用IO Ninja,我们可以生成一个管道服务器作为我们的标准用户,以查看我们是否可以触发来自客户端的连接。无需阅读任何代码,我们就可以浏览代理GUI以查看正在创建的IPC连接以及通信量。
图3-Bitdefender Total Security GUI
下面的屏幕截图显示,每次打开代理GUI时,我们都会收到来自管道客户端的连接,该连接将数据发送到我们的命名管道服务器。这可以通过双击系统托盘中的Bitdefender图标或从开始菜单打开它来完成。
图 4 - 从客户端到我们的命名管道服务器的连接
有趣的是,这是连接会保持打开状态,这允许我们将数据发送回客户端。我获取了发送到服务器的前16个字节的数据,并将其多次回显给客户端,以查看是否会发生任何有趣的事情。我还想看看管道连接在发送数据后是否会保持打开状态。
图 5 - 管道客户端在向其发送数据后断开连接
发送多条消息后,客户端断开连接,我们从Bitdefender收到一个弹出框,通知用户AV内部出现问题。请注意右上角用户关闭对话框的“x”,它在后面可能会用到。
图6-Bitdefender告诉我们我们破坏了某些东西
看到此消息后,我知道必须保存或记录某种形式的调试信息。我从Sysinternals启动了Process Monitor,以查看是否创建了可以在调试器中进一步分析的崩溃转储文件。
事实证明,名为“BDReinit.exe”的可执行文件是Bitdefender自己的crash处理程序,它会在系统上为我们生成一个崩溃转储件。
图7–进程监视器显示正在由BDReinit.exe创建的崩溃转储文件
另一个有趣的发现是.dmp文件写入到的文件夹对于标准用户是可读写的。
图8-存储转储文件的目录的权限
不幸的是,在查看转储文件后我发现crash进程以我们当前用户的身份运行。在这一点上,我知道我在AV上有一个潜在的本地DoS,但这里还有更多需要考虑的东西。
图9-NULL指针解引用:CVE-2021-4198
在第一个进程“seccenter.exe”(Bitdefender的主要GUI界面)崩溃后,我意识到我仍然可以与我的命名管道服务器相连接。只要客户端一连接,我就可以通过简单地用这16个字节向传入的管道连接发送垃圾邮件,从而使几乎所有与AV相关的进程崩溃。我坐在电脑前,看着进程浏览器中的AV进程像多米诺骨牌一样一个接一个地崩溃。
我知道在GUI中启动“漏洞扫描”会产生vulnerability.scan.exe作为系统运行。我立即尝试了一下看看我是否也可以使这个特权进程崩溃。
图10-进程监视器显示由BDReinit.exe创建的崩溃转储文件,这次作为系统运行
同样的“BDReinit.exe”进程再次运行,但这次它以系统身份运行。根据转储的文件名,我们知道我们也可以使“Vulnerability.scan.exe”进程崩溃,并将转储作为系统写入磁盘。
在查找链接跟踪漏洞时,有一些目录是直接相关的
C:\ProgramData
C:\windows\temp
C:\Users\[standard user]\AppData
我经常在这些目录中寻找特权文件写入和删除操作。
在这种情况下,当作为AV一部分的高特权进程崩溃时,.dmp文件将作为系统写入此目录。这与之前的崩溃完全相同,并且我们无法控制正在写入的转储的内容。
我进一步分析了进程监视器日志,发现“BDReinit.exe”正在做两件非常危险的事情。首先,它正在将一个DACL写入另一个目录中具有可预测名称的文件。此目录还允许标准用户读写访问,并且每次发生崩溃时都会进行DACL写入操作。
图11-每个人都具有读写访问权限
如果在Bitdefender中有一个以系统身份运行的进程崩溃,那么被允许的DACL将作为系统写入此文件。在这种情况下,我将选择再次使“Vulnerability.scan.exe”崩溃。我所要做的就是在GUI中启动漏洞扫描,然后我就可以从这个过程中连接到我的命名管道服务器。
图 12 - 启动漏洞扫描
图13-Vulnerability.scan.exe崩溃后BDReinit.exe ACL写入
在此类逻辑错误中我最喜欢的点是它们通常非常快速和容易被利用。要升级到系统,所需要做的全部就是将许可的DACL写入重定向到系统使用的DLL,修改该DLL的内容,然后加载它。要执行此重定向,我们只需要一个符号链接和一个目标DLL。
此时一个很好的选择是:
C:\Windows\System32\spool\Drivers\x64\3\PrintConfig.dll
这是因为标准用户可以轻松触发打印作业,从而强制svchost.exe将修改后的DLL作为系统加载。
图 14 - 创建符号链接
图15-重定向BDReinit.exe DACL写入
图16-Svchost.exe加载修改后的DLL
下方的屏幕截图演示了如何使用所描述的技术在系统中执行代码。
图17-将它们全部放在一起
我发现的第二个漏洞与故障转储本身有关。如果您单击我之前展示的弹出框右上角的“x”,“BDReinit.exe”或作为提交向导的“BdSubWiz.exe”将删除故障转储。如果用户等待或忽略了一段时间,当崩溃进程是以系统身份运行时对话框将超时并以系统身份删除转储文件!
图18-BDReinit.exe任意文件删除PoC日志
在上面的屏幕截图中,您可以看到我们如何将这种高特权文件的删除重定向到系统上的任何文件。您还可以使用本博客中描述的技术来实现权限提升并在系统中执行代码。再次强调,这是因为崩溃转储正在从我们的标准用户具有读写访问权限的位置写入和删除,这与运行崩溃进程的用户无关。此外,该文件夹中的文件根本没有受到保护,因此在超时之前删除它们并用我们的链接替换它们是很容易的。
图19-无限制的文件权限
有时漏洞发现的过程并不是那么有条理,这没关系!我并没有为了确定要通过管道发送哪些数据而在反转应用程序中负责IPC的函数的事情上花费时间。然而,我发现了一个攻击面,并从这里出发四处搜寻。这让我找到了一个完全不同的攻击面,并且其中存在一些关键漏洞。
我希望这篇博客能激发你的灵感,让你也能对你的目标做出同样的努力。此外,我希望它提醒您查看自定义崩溃处理程序及其对话框,以查找bug,并确保您不会无意中泄露您的研究成果。
参考及来源:https://www.zerodayinitiative.com/blog/2022/6/1/is-exploiting-a-null-pointer-deref-for-lpe-just-a-pipe-dream