幕后解析:理解CVE-2022-24547 | STAR Labs
TL;dr
漏洞常常出现在我们意想不到的地方,CastSrv.exe中的CVE-2022-24547就是一个例子。CVE-2022-24547是CastSrv.exe中的一个权限提升漏洞,允许攻击者绕过安全机制并获得提升的权限。我们将分解这个漏洞的工作原理、利用方法以及如何防护。
摘要
厂商: Microsoft
安全影响: 权限提升
CVE ID: 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权限,允许任何用户访问和修改它(参见DACL访问控制)。
因此,该漏洞允许攻击者在另一个用户的会话下运行CastSrv.exe,并使用IcastServerControl::GetEnableControl函数在该用户的目录中创建任意文件夹。
此接口注册于:
clsid: f8842f8e-dafe-4b37-9d38-4e0714a61149
uuid: 7733f245-f909-4be2-918f-bddecbcd07cc
clsid名称: CastServerInteractiveUser
接口名称: ICastServerControl
漏洞方法名称: ICastServerControl::GetEnableControl
注册的接口(ICastServerControl)可以通过使用“会话moniker”在机器上的任何交互式用户会话中激活。这种能力为跨会话权限提升提供了潜在向量,因为接口及其相关方法可能被利用。更多详情,请参考以下链接:COM跨会话激活。
IcastServerControl::GetEnableControl中创建具有完整DACL权限的\PlayToReceiver并丢弃图像文件的底层函数调用在下面的控制流程图中进行了简化。我将在“利用”部分详细描述。
利用
步骤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方法。
注意,这是我们第一次调用ICastServerControl->GetEnableControl方法。然而,由于CastSrv.exe现在在另一个用户上下文中运行,我们已经在\user02\AppData\Local__SHARED\PlayToReceiver目录中创建了PlayToReceiver文件夹。
步骤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提取图标,随后将它们写入上述图像文件。
漏洞复现(可选)
- 创建一个具有两个用户user01和user02的Windows 10环境。
- 以user02登录,然后以user01登录,使两个会话同时运行。
- 在user01上运行概念验证(PoC)。
- 在user02的C:\Users\user02\test中检查任意文件夹。
利用条件
攻击者必须与目标用户在同一系统上,并且目标用户必须具有活动会话,而攻击者执行利用。
检测指导
利用是通过利用与文件夹\AppData\Local__Shared\PlayToReceiver相关的符号链接来促进的。因此,用户应实施措施禁止创建此文件夹或验证它是否为符号链接。
建议缓解措施
实施限制以防止创建文件夹\AppData\Local__Shared\PlayToReceiver。
致谢
我还要感谢我的同事Chen Le Qi在整个研究过程中提供的宝贵指导——我真的学到了很多!
结论
在整个研究过程中,我学到了很多关于权限提升漏洞如何以微妙方式被利用的知识,尽管我从未成功利用CVE-2022-24547。剖析漏洞、理解流程和尝试不同方法的过程给了我关于安全研究和漏洞开发的宝贵见解。虽然利用没有成功,但这次经历肯定扩展了我的技术知识,我希望这篇文章为其他从事类似挑战的人提供有用的信息。