结点是NTFS的一个特性,它允许将目录设置为文件系统的挂载点,就像Unix中的挂载点一样,但也可以设置为解析到另一个目录(在同一个或另一个文件系统上)。就我们的目的而言,我们可以把它们看作是一种仅有目录的符号链接。
有趣的是,在大多数情况下,路径解析会透明地跟随结点(除非明确地设置了一个参数来阻止这一点),所以在上面的设置中,一个试图打开C:/\Dir/\file.txt的程序事实上会打开C:/\Otherfile.txt,因为IO管理器会跟随结点。
结点可以由无权限的用户创建。它们可以跨卷工作,所以你可以将C:\Dir重定向到D:\OtherDir。如果你有写权限,一个现有的目录可以变成一个连接点,但它必须是空的。
NTFS结点是用reparse来实现的,虽然内置的工具不会让你这么做,但可以通过设置自定义reparse点的实现让它们解析到任意路径。CreateMountPoint工具(来自symboliclink-testing-tools)可以让你做到这一点。对于常规的结点,你也可以使用mklink和PowerShell的New-Item加上Type Junction参数做到。
硬链接无权用户也可以创建硬链接,就像他们的Unix系统一样,硬链接将作为一个现有文件的额外路径。它不适用于目录或跨卷(对于硬链接来说没有意义)。
内置的工具不会让你创建一个硬链接到一个你没有写权限的文件,但实际的系统调用可以让你在打开一个文件进行读取的情况下进行创建。使用symboliclink-testing-tools中的CreateHardLink工具(或Ruben Boonen的这个PowerShell脚本)来创建你没有写访问权限的文件的硬链接。要注意的是,如果你没有对文件的写访问权限,你将无法删除所创建的链接(就像你无法使用原始路径删除文件一样)。
更新:这一技术正在在即将推出的Windows 10版本中得到缓解。
对象符号链接管理器虽然NTFS确实提供了文件系统的符号链接,但在Windows上,无权限的用户不能在文件系统上创建符号链接:它需要SeCreateSymbolicLinkPrivilege,默认情况下,只有管理员才能获得该权限。
不过,无权限的用户可以在Windows的 “对象管理器 “中创建符号链接,顾名思义,它可以管理进程、部分和文件等对象。对象管理器使用符号链接,例如驱动器字母和命名管道与相应设备相关联。用户可以在可写对象目录中创建对象符号链接,如\RPC CONTROL\,这些符号链接可以指向任意路径—包括文件系统中的路径—无论该路径当前是否存在。
当与NTFS连接点结合时,对象符号链接会做一些有趣的事情。事实上,一个无权限的用户可以将一个挂载点与该目录中的对象管理器符号连接起来,解析到\RPC CONTROL\目录。
这给我们提供了一个有点像文件系统符号链接的东西:在上图中,C:\Dir\file.txt解析为C:\Other\stuff.any。当然,这并不是完全等同的,但在很多情况下,这种条件足以让我们进行攻击。
你可以使用CreateMountPoint和CreateDosDeviceSymlink分别完成这些步骤,但CreateSymlink工具通过一个方便的命令中实现了这种技术。
Opportunistic locksoplock是一种可以放置在文件上的锁,当其他进程想要访问该文件时,它可以被告知—同时延迟这些进程的访问,以便锁定进程可以在解除锁之前让文件处于适当的状态。oplocks最初是为通过SMB缓存客户端-服务器文件访问而设计的,可以通过调用文件句柄上的特定控制代码设置oplock。