描述
RUXIM(可重用UX集成管理器)是Windows 10上Windows Update使用的组件。PLUGScheduler是RUXIM的一部分,是一个计划任务,位于 MicrosoftWindowsWindowsUpdateRUXIM
目录中,并且以SYSTEM权限运行。
问题
PLUGScheduler.exe二进制文件执行文件操作,如删除和重命名,以SYSTEM权限,在标准用户具有部分控制权的目录中。这导致以SYSTEM权限进行任意文件写入。
时间线
-
2024.01.22 发送咨询至MSRC -
2024.02.01 MSRC确认漏洞 -
2024.05.14 分配CVE-2024-26238并在KB5037768中修复漏洞 -
2024.05.24 公开发布
技术细节
触发时,PLUGScheduler计划任务以SYSTEM权限运行 C:Program FilesRUXIMPLUGScheduler.exe
可执行文件。后者如果不存在则创建 C:ProgramDataPLUGLogs
文件夹。之后,它删除 RUXIMLog.050.etl
文件,然后继续重命名所有 RUXIMLog.XXX.etl
格式的文件。更具体地说,RUXIMLog.049.etl
文件首先被重命名为 RUXIMLog.050.etl
,接着是 RUXIMLog.048.etl
被重命名为 RUXIMLog.049.etl
,以此类推,直到 RUXIMLog.001.etl
被重命名为 RUXIMLog.002.etl
。最终,它在 RUXIMLog.001.etl
文件中启动事件跟踪会话。
C:ProgramDataPLUGLogs
文件夹为标准用户配置了宽松的ACL。特别是,内置用户可以:
-
在 Logs
中创建文件。 -
在 Logs
中创建文件夹。 -
写入 Logs
文件夹的属性。
写入 Logs
文件夹属性的能力允许标准用户添加一个联接点,使得 Logs
重定向到 RPC Control
对象目录。之后,可以创建两个对象管理器符号链接:
-
RPC ControlRUXIMLog.049.etl
->C:pathtoattackercontrolledfile
-
RPC ControlRUXIMLog.050.etl
->C:eop.txt
下一次执行 PLUGScheduler.exe
时,RUXIMLog.049.etl
文件将被重命名为 RUXIMLog.050.etl
。由于之前设置的链接,攻击者控制的文件将被移动到 C:eop.txt
,实现了以SYSTEM权限进行任意文件写入。
然而,要在 Logs
目录中添加联接点,后者必须是空的。问题是 Logs
内的文件不能被标准用户删除(只有SYSTEM和管理员拥有必要的权限)。在重命名文件之前,PLUGScheduler.exe
使用 GetFileAttributesW
函数检查路径是否对应文件。如果不是,它将不做任何操作,继续处理下一个文件。因此,如果 RUXIMLog.001.etl
是一个目录,它将不会被重命名为 RUXIMLog.002.etl
。让我们考虑 Logs
目录的以下内容:
Logs
|__ RUXIMLog.001.etl (directory)
|__ RUXIMLog.002.etl (file)
|__ RUXIMLog.003.etl (file)
执行一次PLUGScheduler后,目录将看起来像:
Logs
|__ RUXIMLog.001.etl (directory)
|__ RUXIMLog.003.etl (file)
|__ RUXIMLog.004.etl (file)
执行任务47次后,目录将看起来像:
Logs
|__ RUXIMLog.001.etl (directory)
|__ RUXIMLog.049.etl (file)
|__ RUXIMLog.050.etl (file)
在下一次执行任务时,RUXIMLog.050.etl
文件将被删除,RUXIMLog.049.etl
文件将被重命名为 RUXIMLog.050.etl
。因此,通过这种行为,可以通过足够多次运行任务,以清除 C:ProgramDataPLUGLogs
目录中包含的所有文件。
最后一个剩余的问题是创建 RUXIMLog.001.etl
目录,因为标准用户无法删除 RUXIMLog.001.etl
文件。在 RUXIMLog.001.etl
文件被删除和作为事件跟踪文件重新创建之间的短暂时间窗口中,有可能在这两个动作之间创建目录。通过在每次登录时触发的计划任务,可以轻松赢得竞态条件,该任务尝试无限循环创建 RUXIMLog.001.etl
目录,直到成功。发现为了可靠地赢得竞态,程序需要编译为图形Windows应用程序而不是控制台应用程序(可能是因为控制台应用程序会显示 cmd
窗口)。
PLUGScheduler计划任务在每次登录时触发,并且每天在固定时间触发一次。因此,标准用户可以通过重新登录来触发它。利用策略如下:
-
作为当前用户设置一个计划任务,在每次登录时触发。此任务将尝试在 C:ProgramDataPLUGLogs
中创建RUXIMLog.001.etl
目录。重新登录,直到竞态条件成功并且目录被创建(通常需要几次尝试)。 -
创建目录后,重新登录,直到 C:ProgramDataPLUGLogs
中只剩下一个条目:RUXIMLog.001.etl
目录。 -
移除 RUXIMLog.001.etl
目录。 -
设置 C:ProgramDataPLUGLogs
->RPC Control
联接点。 -
设置对象管理器符号链接 RPC ControlRUXIMLog.049.etl
->C:pathtoattackercontrolledfile
。 -
设置对象管理器符号链接 RPC ControlRUXIMLog.050.etl
->C:eop.txt
。 -
重新登录:攻击者控制的文件被移动到 C:eop.txt
。
这个漏洞是任意文件写入。它可以用来通过在 C:WindowsSystem32SprintCSP.dll
写入DLL文件并触发 StorSvc
服务的 SvcRebootToFlashingMode
方法(如https://github.com/blackarrowsec/redteam-research/tree/master/LPE%20via…)来执行代码作为SYSTEM。请注意,这只是如何利用文件写入漏洞来实现权限提升的一个示例,还有许多其他方法可以做到这一点。
为 C:ProgramDataPLUG
目录及其子对象定义更严格的ACL。只有特权用户才能在其中写入。
原文始发于微信公众号(3072):CVE-2024-26238 Windows PLUGScheduler 提权漏洞分析