windows符号链接利用技术详解
字数 2274 2025-08-20 18:18:17
Windows符号链接利用技术详解
1. 符号链接技术概述
符号链接技术在近几年的提权漏洞中尤为常见,包括最新的CVE-2024-21111也使用了这种手法。2015年Google Project Zero安全研究员James Forshaw提供了这一方面研究成果的一系列文章。
2. 工具包介绍
p0tools目录中包含以下工具:
- BaitAndSwitch.exe // 设置机会锁与对象符号链接
- CreateDosDeviceSymlink.exe // 创建对象管理器符号链接
- CreateHardlink.exe // 创建硬链接
- CreateMountPoint.exe // 创建连接点
- CreateNativeSymlink.exe // 创建原生符号链接
- CreateNtfsSymlink.exe // 创建文件系统符号链接
- CreateObjectDirectory.exe
- CreateRegSymlink.exe // 创建注册表符号链接
- CreateSymlink.exe // 创建:连接点 + 对象管理器符号链接
- DeleteMountPoint.exe // 删除连接点
- DumpReparsePoint.exe
- SetOpLock.exe // 设置机会锁
3. 文件系统符号链接(NTFS Symlinks)
3.1 权限要求
创建符号链接需要管理员权限,非管理员权限运行会报错。
查看权限方法:
- Ctrl+R输入secpol.msc
- 导航到Local Policies -> User Rights Assignment
- 找到并双击Create symbolic links
3.2 创建目录符号链接
管理员权限下运行:
.\CreateNtfsSymlink.exe -d C:\Users\root\Desktop\test01\Dir C:\Users\root\Desktop\test01\Other
注意:
- Dir目录要提前建立好,并且要是空目录
- 如果Other目录下有111.txt文件,可以直接从Dir中读取内容
3.3 创建文件符号链接
.\CreateNtfsSymlink.exe -r C:\Users\root\Desktop\test01\File_SymbolLink\demo_file_link.txt C:\Users\root\Desktop\test01\demo_file.txt
4. 注册表项符号链接(Registry Key Symbolic Links)
4.1 注册表符号链接示例
- HKEY_LOCAL_MACHINE\System\CurrentControlSet 是 HKEY_LOCAL_MACHINE\System\ControlSet001 的符号链接
- HKEY_CURRENT_CONFIG 是指向 HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\Current 的符号链接
4.2 创建注册表符号链接
- 创建密钥并将其指定为链接:
HKEY hKey;
RegCreateKeyEx(HKEY_CURRENT_USER, L"DesktopColors", 0, nullptr,
REG_OPTION_CREATE_LINK, KEY_WRITE, nullptr, &hKey, nullptr);
关键点:
- 使用REG_OPTION_CREATE_LINK标志
- 需要KEY_WRITE访问权限
- 设置链接目标:
WCHAR path[] = L"\\REGISTRY\\USER\\S-1-5-21-4099861355-3358530361-1466466590-1000\\Control Panel\\Desktop\\Colors";
RegSetValueEx(hKey, L"SymbolicLinkValue", 0, REG_LINK,
(const BYTE*)path, wcslen(path) * sizeof(WCHAR));
注意:
- 必须使用本机注册表绝对路径
- 路径格式为\REGISTRY\USER\SID\...
4.3 删除注册表符号链接
标准API无法删除链接,必须使用NtDeleteKey:
extern "C" int NTAPI NtDeleteKey(HKEY);
#pragma comment(lib, "ntdll")
HKEY hKey;
RegOpenKeyEx(HKEY_CURRENT_USER, L"DesktopColors",
REG_OPTION_OPEN_LINK, DELETE, &hKey);
NtDeleteKey(hKey);
5. 连接点(Junctions)
5.1 创建连接点
非管理员权限也可以创建连接点:
mklink /J C:\Users\root\Desktop\test01\SecDir C:\Users\root\Desktop\test01\Other
条件:
- SecDir目录不应存在,执行后会自动创建
- 对Other目录需要有写入权限
5.2 API创建连接点
if (!ReparsePoint::CreateMountPoint(argv[1], argv[2], argc > 3 ? argv[3] : L"")) {
printf("Error creating mount point - %ls\n", GetErrorMessage().c_str());
}
特点:
- 被转换的目录可以存在
- 但目录必须为空
- 需要写入权限
5.3 文件系统符号链接与连接点区别
| 特性 | 文件系统符号链接 | 连接点 |
|---|---|---|
| 链接对象 | 文件和目录 | 仅目录 |
| 跨卷支持 | 支持 | 主要同一卷内 |
| 权限要求 | 需要管理员权限 | 普通用户权限 |
6. 硬链接(Hard Links)
6.1 创建硬链接
非特权用户可以创建硬链接:
if (CreateNativeHardlink(argv[1], argv[2])) {
printf("Done\n");
}
特点:
- 仅适用于文件,不适用于目录或跨卷
- 如果无文件写入权限则需要管理员权限
- Windows 10高版本已缓解此技术
7. 对象管理器符号链接(Object Manager symbolic links)
7.1 对象管理器概述
Windows使用逻辑对象跟踪所有资源,每个资源都驻留在命名空间中:
- C:\目录通过GLOBAL??命名空间中的符号链接跳转
- 普通用户可以在\RPC Control命名空间创建符号链接
7.2 创建对象管理器符号链接
HANDLE CreateSymlink(HANDLE root, LPCWSTR linkname, LPCWSTR targetname) {
// 使用NtCreateSymbolicLinkObject API
NTSTATUS status = fNtCreateSymbolicLinkObject(&hLink,
SYMBOLIC_LINK_ALL_ACCESS, &objAttr, &target);
}
执行:
CreateSymlink.exe C:\path\to\link C:\path\to\target
8. 任意文件删除技术
8.1 技术原理
结合连接点与对象管理器符号链接:
- 创建dont_delete.txt到\RPC Control对象的符号链接
- 将\RPC Control挂载到\test\目录
- 删除test\config.txt实际会删除dont_delete.txt
8.2 实现步骤
- 创建符号链接:
HANDLE hret = CreateSymlink(nullptr, L"\\RPC Control\\config.txt",
L"\\??\\C:\\path\\dont_delete.txt");
- 创建挂载点:
ReparsePoint::CreateMountPoint(L"C:\\path\\test", L"\\RPC Control", L"");
- 使用PowerShell删除:
Remove-Item "C:\path\test\config.txt" -Force
9. 机会锁(Opportunistic locks)
9.1 机会锁概述
oplock可以放置在文件上,当其他进程访问时会被通知,用于TOCTOU攻击。
9.2 设置机会锁
SetOpLock.exe C:\path\to\file [rwdx]
参数:
- r: FILE_SHARE_READ
- w: FILE_SHARE_WRITE
- d: FILE_SHARE_DELETE
- x: Exclusive lock
9.3 BaitAndSwitch技术
BaitAndSwitch c:\path\to\link target_1 target_2 [sharemode]
原理:
- 第一次访问指向target_1
- 触发oplock后改为指向target_2
10. 实际应用
这些技术常见于杀毒软件漏洞利用,如:
- 赛门铁克
- 迈克菲
- Windows Defender
通过符号链接技术可以实现本地提权漏洞利用。