这个漏洞是因为对config.msi 没有任何防护所致。攻击者可以自己创建config.msi,并目录连接到其他文件夹。然后windows installer 会修改config.msi 的权限,并往里写入 rbs 脚本。由于目录连接,该文件实际被写入到了一个攻击者可控的文件夹。虽然 rbs 脚本仍然是高权限的,攻击者无法删除,但攻击者可以移动其所在的文件夹,并在原位置重新创建一个同名文件夹,这样就可以在里面创建伪造 rbs 脚本了,然后 windows installer 就会以 local system 权限运行 rbs 脚本。
1. 补丁比较
从流程图上看,差异比较多,有些混乱。
从 Ida F5 的结果来看,该 CMsiOpExecute::GetBackupFolder 函数里几乎全是虚函数调用,不太好观察,但仍可看出一些踪迹。
上面这一段是更新后多出来的代码,可以看到:
打开文件后,获取文件属性,判断是否是 目录连接文件夹。如果是目录连接文件夹:则关闭、删除文件夹。然后调用 CMsiOpExecute::CreateFolder() 重新创建文件夹。
这个补丁相当于插入一段检测代码,一旦检测到Config.msi 已经存在,且是一个补丁文件,就删除它。然后重新创建。
2. 创建目录连接
创建目录连接有两种方式,使用 cmd 的mklink 或者 James Forshaw 写的 CreateMountPoint() 函数。
1. 使用 mklink 创建符号连接
system("mklink /j "C:\config.msi" "C:\Junction"");
使用 mklink 创建目录连接时,目录连接中的 Source 文件夹不能事先存在,但是 Target 可以事先存在,并且 Target 可以是另一个 符号链接。如果需要,我们可以先 c->d ,然后 b->c, 然后 a->b,最总形成 a->b->c->d 这样的一串 目录连接。
2. 使用 CreateMountPoint() 创建目录连接
CreateMountPoint() 函数的优点是 允许对已经存在的 Source 文件夹 创建目录连接。
3. Process Monitor 观察
先通过mklink 创建 C:Config.msi 到 C:Junction 的目录连接,然后运行一个 msi 安装包,通过自动或手动的取消安装,可以观察到 C:Junction 里被写入了 rbs 脚本,并被执行。
我使用 Advanced Installer 创建了一个会自动出错并回滚的 msi 安装包。并使用了 SandboxEscaper 在 CVE-2019-1415 里提供的 rbs 脚本。
exp 大致步骤如下:
1. 创建 C:/Config.msi 到 C:/Junction 的目录连接。并准备好一个存放有 test.rbs 和 test.rbf 的目录。
2. 执行会自动回滚的安装。
3. FindFirstFile() 循环搜索 C:/Junction/*.rbs 文件,如果Windows Installer 创建了回滚脚本,该文件会被写入到 C:/Junction 文件夹里。
4. 开始循环调用 MoveFile 去移动 C:/Junction/ 文件夹。一旦移动成功,我们就将存放有 test.rbs 的目录重命名为 Junction 文件夹,并将 test.rbs 重命名为 回滚中所使用的 回滚脚本的名称。
这样我们的 rbs 脚本就会被以 system 权限运行。
这是一个正经的公众号;drop database;在这里,你可以看到最新的漏洞复现,最全的修复方案以及最特殊的利用技巧。
点击上方蓝字关注我们!
原文始发于微信公众号(肚子好饿啊早知道不做安全了):windows install CVE-2018-0868 漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论