漏洞描述:
Windows错误报告服务是一项用于收集和分析系统和应用程序错误的服务。
经过身份认证的本地攻击者可以构造恶意程序触发该漏洞,成功利用此漏洞可以提升权限至SYSTEM或造成系统崩溃。
影响范围:
- Windows 10
- Windows Server 2012 R2 (Server Core Installation)
- Windows Server 2012 R2
- Windows Server 2012 (Server Core Installation)
- Windows Server 2012
- Windows Server 2008 R2 For X64-based Systems Service Pack 1 (Server Core Installation)
- Windows Server 2008
- Windows Server 2008 For X64-based Systems Service Pack 2 (Server Core Installation)
- Windows 11
- Windows Server 2022 (Server Core Installation)
- Windows Server 2022
- Windows Server 2019 (Server Core Installation)
- Windows Server 2008 For 32-bit Systems Service Pack 2 (Server Core Installation)
- Windows Server 2016 (Server Core Installation)
- Windows Server 2016
环境搭建:
复现环境使用windows10操作系统,iso镜像来源为:
虚拟机的安装可以参考我的另一篇博客 ,这里给出密钥
KH2J9-PC326-T44D4-39H6V-TVPBY
TFP9Y-VCY3P-VVH3T-8XXCC-MF4YK
MS08-067漏洞复现2024,包含环境搭建,流量分析-CSDN博客
漏洞复现:
这里感谢一下auturora师傅对我的一些指导
1.windows10 需注册一个低权限的账户,权限不为admin
(后面使用会报错)
2.下载github上的poc
地址:GitHub - Wh04m1001/CVE-2023-36874
3.Poc使用
需要下载visual sutdio 并在安装时选择C++的相关支持程序,安装成功后可以在搜索栏搜索到”x64 Native Tools Command“
我们切换到下载好的POC目录
切换硬盘需要输入“盘符:” DIR 命令查看当前目录,只有切换盘符后才能用cd命令切换到poc目录
输入以下命令编译C++文件(记得关闭终端杀毒,火绒,windows自带病毒防护等)
## 打包. res文件
rc.exe Resource.rc
## 编译主文件
cl main.cpp /EHsc /DUNICODE /link ole32.lib oleaut32.lib Resource.res
## CD到wermgr目录wermgr.exe打包
cl main.cpp /EHsc /DUNICODE /Fewermgr.exe
编译后的wermgr. exe,在C:\下新建test\System32文件夹。
复制到c:\test\system32\wermgr.exe
切换到虚拟机低权限用户执行main.exe
提权成功!
注意事项:复现流程必须使用低权限账户否则执行报错
须在本机安装C++编译环境
技术细节:
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 以启动可执行文件。
该漏洞的核心问题在于,在模拟下运行的 CreateProcess API 将遵循威胁参与者设置的任何文件系统重定向,但将使用调用进程安全令牌而不是模拟令牌来设置进程的安全上下文。对于 WER 服务,在进程创建时确实存在模拟。这意味着,如果先前的文件系统重定向指向攻击者控制的可执行文件,则将执行该可执行文件而不是合法的可执行文件。这允许攻击者控制的可执行文件以 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
漏洞修复防御
可以根据useradd的行为做查杀
Windows 10 21H2 6月补丁分析
diff wercplsupport.dll,主要改了CWerComReport::SubmitReport,wercplsupport.dll是Windows error reporting 服务的主dll文件。对比发现补丁直接阻断了后续CAutoImpersonate::ImpersonateUserHighestPrivs
和CWerComReport::_SubmitReport
的调用
__int64 __fastcall CWerComReport::SubmitReport( CWerComReport *this, unsigned __int16 *a2, unsigned int a3, struct IWerReportSubmitCallback *a4, unsigned __int16 **a5, unsigned int *a6){ int v10; // ebx int v12; // [rsp+30h] [rbp-18h] BYREF __int64 v13; // [rsp+38h] [rbp-10h]
v13 = -2i64; v12 = 2; if ( !CAutoImpersonate::g_bEnableImpersonate || (v10 = CAutoImpersonate::ImpersonateUserHighestPrivs((CAutoImpersonate *)&v12), v10 >= 0) ) { v10 = CWerComReport::_SubmitReport((CWerComReport *)((char *)this - 24), a2, a3, a4, a5, a6); } CAutoImpersonate::~CAutoImpersonate((CAutoImpersonate *)&v12); return (unsigned int)v10;}
// 修复代码__int64 __fastcall CWerComReport::SubmitReport( CWerComReport *this, unsigned __int16 *a2, unsigned int a3, struct IWerReportSubmitCallback *a4, unsigned __int16 **a5, unsigned int *a6){ int v11; // ebx int v12; // [rsp+30h] [rbp-18h] BYREF __int64 v13; // [rsp+38h] [rbp-10h]
v13 = -2i64; if ( (unsigned __int8)wil::details::FeatureImpl<__WilFeatureTraits_Feature_MSRC80633_DisableWerCplSupport>::__private_IsEnabled(&`wil::Feature<__WilFeatureTraits_Feature_MSRC80633_DisableWerCplSupport>::GetImpl'::`2'::impl) ) return 0x80004001i64; v12 = 2;
if ( !CAutoImpersonate::g_bEnableImpersonate || (v11 = CAutoImpersonate::ImpersonateUserHighestPrivs((CAutoImpersonate *)&v12), v11 >= 0) ) { v11 = CWerComReport::_SubmitReport((CWerComReport *)((char *)this - 24), a2, a3, a4, a5, a6); } CAutoImpersonate::~CAutoImpersonate((CAutoImpersonate *)&v12); return (unsigned int)v11;}
参考文章
CVE-2023-36874 Windows 错误报告服务权限提升漏洞