当特权进程试图将abc.log移动或重命名为abc.old.log时,它实际上会将用户拥有的文件sh.dll移动/重命名为target.dll,将我们的有效载荷放在我们想要他在的位置。
可以控制的特权文件移动/重命名/复制的情况如下:
一个受控的移动或重命名给我们提供了任意的文件写的能力
如果能够控制复制的源地址和目的地址也是一样的
复制操作,我们控制源头,而不是目的地,给了我们一个任意的文件读取(如果目的地的位置是用户可读的)
我们控制源头而不控制目标的移动/重命名目的地,给了我们一个任意删除文件的机会
Side notes:
附注:
覆盖目的地的能力取决于执行操作的进程所使用的选项。
如果目标文件已经存在,我们也可以使用硬链接而不是伪链接
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
滥用任意文件读取的一个常见方法是让SAM、SECURITY以及SYSTEM hive去获得SAM数据库以及其中缓存的凭证。
从任意删除文件到权限提升我们谈到了任意文件读写,那么删除呢?除了明显的DoS隐患外,我们有时会滥用任意文件删除bug进行EoP:
在一个我们可以写入的位置,即使我们不能覆盖其中已有的文件,如C:\\ProgramData这个目录。
这个将在之后被一个有特权的进程用于读或写操作(无论它是我们滥用删除的同一进程还是不同的进程)
举个例子,如果我们知道如何触发从C:\\ProgramData\Product\foo到C:\\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:\Temp\Test。
将其改为 “C:/Windows/System32 “的连接点。
AV删去C:\TempTest/licence.rtf',改为C:\Windows/System32/licence.rtf’。