FreeBuf|任意文件移动导致的Windows提权攻击分析( 五 )


我们控制源头而不控制目标的移动/重命名目的地 , 给了我们一个任意删除文件的机会
覆盖目的地的能力取决于执行操作的进程所使用的选项 。
如果目标文件已经存在 , 我们也可以使用硬链接而不是伪链接
A common way to abuse arbitrary file read is to get the SAM, SECURITY and SYSTEM hives to dump the SAM database and cached credentials
滥用任意文件读取的一个常见方法是让SAMSECURITY以及SYSTEM hive去获得SAM数据库以及其中缓存的凭证 。
从任意删除文件到权限提升我们谈到了任意文件读写 , 那么删除呢?除了明显的DoS隐患外 , 我们有时会滥用任意文件删除bug进行EoP:
C:\\ProgramData举个例子 , 如果我们知道如何触发从C:\\ProgramData\Product\fooC:\\ProgramData\Product\bar的移动/重命名 , 但这些文件已经存在 , 而且我们没有对它们的写访问权限 , 我们可以使用一个任意的文件删除错误来删除foo和bar , 然后自己重新创建它们(同样假设Product子目录的默认权限) 。 我们可以利用前面的技术滥用写操作(如果Product目录现在是空的 , 则伪造symlink , 否则硬链接) , 完成文件链接 。 利用杀毒软件杀毒软件是这一类bug的主要产生的地方 , 因为它是一个高权限的软件 。 根据设计 , 它必须对文件进行操作 , 包括用户拥有的文件 。 执行扫描、删除、还原操作的特权进程 , 会被我们用来执行有趣的文件操作 , 把杀毒软件的防御组件变成潜在的漏洞利用方式 。
AV quarantine & restore杀毒软件的隔离和恢复功能特别有趣 , 尤其是当它们可以被无权用户触发时(有时不是在用户界面上 , 而是通过COM劫持) 。 触发隔离(或移除)的最简单方法当然是将一个已知的检测到的文件(如EICAR)放到文件系统中 。
有趣的是 , 一些AVs会在删除之前对检测到的文件进行特权操作 , 比如 。
在同一目录下创建/删除临时文件 。
将受感染的文件复制或移动到用户可写的位置 。
将受感染的文件复制或移动到一个用户可读的隔离区位置(如果你利用了这一点 , 你的SAM文件就能够被读取) 。 临时文件和隔离文件有时会被编码填充 , 如果你想看看算法(读取结果文件) , 在启动IDA/Ghidra之前 , 最好先去Hexacorn的DeXRAY看看 。
而还原过程中 , 如果能被非特权用户触发 , 则是另一个特权文件写入bug(例子https://bogner.sh/2017/11/avgater-getting-local-admin-by-abusing-the-anti-virus-quarantine/) 。 要控制内容 , 要么在删除或还原过程中寻找潜在的TOCTOU , 要么让你的payload足够 “恶意” , 一开始就被直接隔离 。
转移文件删除/移动的位置如果AV在检测和删除/隔离(TOCTOU)之间没有锁定(或以其他方式阻止访问) 。 我们可以使用一个有趣的技巧 , 就是用一个结点来替换它的父目录(在检测之后但在删除之前) 。 如果我们想删除一些我们没有访问权限的文件(比如C:\Windows\System32\license.rtf) , 我们可以这样进行 。
将EICAR(或任何可检测的文件)放入我们创建的目录中 , 与目标文件同名 , 例如C:\Temp\Test\licence.rtf
等待AV检测到它
C:\Windows/System32/licence.rtf’ 。 正确的方法是使用 oplocks , 然而在实践中并不总是那么容易 , 因为文件在被删除之前可能会被访问(可变)多次 , 而且缺乏精细的控制会使这变得很棘手 。 一个快速的方法是简单地在目录旁边创建结点 , 然后做一个循环 , 不断交换两者 。 根据AV检索要删除的路径和删除文件的方式 , 我们可能有合理的机会删除击中结点 , 我们可以根据需要重试 。 剧透:在几个AV产品上确实有效 , 在其他产品上完全无效) 。


推荐阅读