幕后解析:理解CVE-2022-24547 | STAR Labs
TL;dr 漏洞常常出现在我们意想不到的地方,CastSrv.exe中的CVE-2022-24547就是其中之一。这是一个权限提升漏洞,允许攻击者绕过安全限制获取提升权限。我们将剖析该漏洞的工作原理、利用方式及防护方法。
摘要
| 厂商 | 安全影响 | CVE ID |
|---|---|---|
| Microsoft | 权限提升 | CVE-2022-24547 |
CVSS3.1评分系统
基础分数: 7.8 向量字符串: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
| 攻击向量(AV) | 本地 | | 攻击复杂度(AC) | 低 | | 所需权限(PR) | 低 | | 用户交互(UI) | 无 | | 范围(S) | 未改变 | | 机密性(C) | 高 | | 完整性(I) | 高 | | 可用性(A) | 高 |
受影响软件
产品: Microsoft Windows 10.0.18363.592 64位 (2020-01-14) ISO下载: https://uupdump.net/selectlang.php?id=99c9fe2f-8e78-451f-ab95-410106ee59bf 版本: Windows 10 10.0.18363.592 64位 (2020-01-14)
漏洞描述
该漏洞存在于CastSrv.exe程序的IcastServerControl::GetEnableControl函数中,允许攻击者在系统上另一个用户账户内创建任意文件夹。
导致此漏洞的关键因素:
- 会话劫持: 攻击者可以使用其他登录用户的会话初始化程序,在该用户上下文下运行CastSrv.exe
- 未检查的文件夹创建: IcastServerControl::GetEnableControl函数创建\AppData\Local__Shared\PlayToReceiver目录时未验证是否为符号链接
- 不当权限: 创建的目录具有完整的DACL权限,允许任何用户访问和修改
因此,该漏洞允许攻击者在其他用户会话下运行CastSrv.exe,并使用IcastServerControl::GetEnableControl函数在该用户目录中创建任意文件夹。
该接口注册于:
- clsid: f8842f8e-dafe-4b37-9d38-4e0714a61149
- uuid: 7733f245-f909-4be2-918f-bddecbcd07cc
- clsid名称: CastServerInteractiveUser
- 接口名称: ICastServerControl
- 漏洞方法名称: ICastServerControl::GetEnableControl
注册接口(ICastServerControl)可以通过"会话moniker"在机器上的任何交互式用户会话中激活。这种能力为跨会话权限提升提供了潜在向量,因为接口及其关联方法可能被利用。
漏洞利用
步骤1: 我们需要使用目标用户的会话ID初始化CastSrv.exe
字符串session:2!new:f8842f8e-dafe-4b37-9d38-4e0714a61149中的数字2代表目标用户的会话ID,而f8842f8e-dafe-4b37-9d38-4e0714a61149是CastSrv.exe服务的GUID。你需要将2替换为目标用户的会话ID。
步骤2: 我们需要触发ICastServerControl接口中的CCastServerControl::GetEnableControl函数
ICastServerControl接口的虚函数表包含:
- CCastServerControl::StartCastServer(void)
- CCastServerControl::StopCastServer(void)
- CCastServerControl::Advise(ICastAppLaunchCallback *)
- CCastServerControl::Unadvise(ICastAppLaunchCallback *)
- CCastServerControl::GetEnableControl(int *)
- CCastServerControl::SetEnableControl(int)
- CCastServerControl::PutSettings(IUnknown *)
当调用ICastServerControl接口的CCastServerControl::GetEnableControl方法时,将在\AppData\Local__SHARED\PlayToReceiver下创建一个文件夹。
当调用时,CCastServerControl::GetEnableControl会启动对CServerHolder::GetDMRServer的调用,随后调用IPlayToReceiverAppRegistrar+72,这通过DMRServer.dll中的虚函数表对应于CPlayToReceiverAppRegistrar::GetEnableControl。
在DMRServer.dll内,这些调用触发了CSharedDMR和CPlayToReceiverInternal类的初始化。CSharedDMR类的初始化导致创建了几个图像文件,而CPlayToReceiverInternal::RuntimeClassInitialize方法在%AppData%目录中创建PlayToReceiver文件夹。值得注意的是,此过程不包括对符号链接的检查。
由于我们知道ICastServerControl的UUID是7733f245-f909-4be2-918f-bddecbcd07cc,我们可以按如下方式重新创建它:
|
|
由于我们已经从步骤1开始为用户02会话2运行CastSrv.exe,现在我们将调用BindToObject来获取指向ICastServerControl接口的指针,然后从那里触发ICastServerControl->GetEnableControl方法。
步骤3: 我们通过调用NtCreateSymbolicLinkObject创建从\user02\AppData\Local__SHARED\PlayToReceiver到另一个路径C:\Users\user02\arbitrary_folder的符号链接
步骤4: 然后我们需要再次调用ICastServerControl->GetEnableControl,它将遵循符号链接并在指定位置创建任意文件夹
在继续之前,我们需要删除在调用ICastServerControl->GetEnableControl时创建的\user02\AppData\Local__SHARED\中的一些图像文件。这些图像文件是CastSrv.exe从C:\Windows\SystemResources\DDORes.dll.mun提取的图标文件。由于这些文件位于SystemResources文件夹中,修改它们需要管理员权限,而我们没有这些权限。
这些图像文件的创建是在CSharedDMR类初始化期间启动的。具体来说,当调用CSharedDMR::RuntimeClassInitialize时,它会从DDORes.dll.mun提取图标,随后将它们写入上述图像文件。
漏洞复现(可选)
- 创建具有两个用户的Windows 10环境:user01和user02
- 以user02身份登录,然后以user01身份登录,使两个会话同时运行
- 在user01上运行概念验证(PoC)
- 检查user02中C:\Users\user02\test处的任意文件夹
利用条件
攻击者必须与目标用户在同一系统上,并且目标用户在攻击者执行利用时必须具有活动会话。
检测指导
该利用是通过利用与文件夹\AppData\Local__Shared\PlayToReceiver关联的符号链接来促进的。因此,用户应实施措施禁止创建此文件夹或验证它是否为符号链接。
建议缓解措施
实施限制以防止创建文件夹\AppData\Local__Shared\PlayToReceiver。
致谢
我还要感谢我的同事Chen Le Qi在整个研究过程中提供的宝贵指导——我真的学到了很多!
结论
在整个研究过程中,我学到了很多关于权限提升漏洞如何以微妙方式被利用的知识,尽管我从未成功利用CVE-2022-24547。剖析漏洞、理解流程并试验不同方法的过程使我对安全研究和漏洞开发有了宝贵的见解。虽然利用没有成功,但这次经历肯定扩展了我的技术知识,我希望这篇文章能为其他从事类似挑战的人提供有用的信息。