Token Privileges Abusing - Windows Token
字数 2541 2025-08-06 12:21:08
Windows Token 权限滥用技术详解
1. Windows Token 基础概念
Windows Token(令牌)是 Windows 安全模型的核心组件,它包含了进程或线程的安全上下文信息。每个进程都有一个主令牌,而线程可以从主令牌继承或使用模拟令牌。
1.1 Token 的组成
- 用户 SID:标识令牌关联的用户
- 组 SID:用户所属的组
- 特权列表:分配给令牌的特权
- 所有者 SID:令牌的所有者
- 主组 SID:令牌的主组
- 默认 DACL:默认的自主访问控制列表
- 源:令牌的来源
- 类型:主令牌或模拟令牌
- 模拟级别:模拟的安全级别
- 统计信息:令牌的统计信息
- 会话 ID:关联的终端服务会话
- 限制 SID:限制性 SID 列表
1.2 特权 (Privilege) 类型
Windows 定义了许多特权,常见的有:
- SeDebugPrivilege:调试程序
- SeImpersonatePrivilege:模拟客户端
- SeAssignPrimaryTokenPrivilege:分配主令牌
- SeTcbPrivilege:作为操作系统的一部分
- SeBackupPrivilege:备份文件和目录
- SeRestorePrivilege:还原文件和目录
- SeCreateTokenPrivilege:创建令牌对象
- SeLoadDriverPrivilege:加载和卸载设备驱动程序
2. 令牌权限滥用技术
2.1 特权提升技术
2.1.1 SeDebugPrivilege 滥用
拥有 SeDebugPrivilege 可以读取和写入其他进程的内存,常用于:
- 注入代码到高权限进程
- 从高权限进程如 lsass.exe 中提取凭据
利用步骤:
- 检查当前进程是否具有 SeDebugPrivilege
- 如果没有但可以启用,则启用该特权
- 打开目标进程 (如 lsass.exe)
- 使用 MiniDumpWriteDump 或类似技术转储进程内存
2.1.2 SeImpersonatePrivilege/SeAssignPrimaryTokenPrivilege 滥用
这些特权允许进程模拟其他用户或分配主令牌,常用于:
- 通过命名管道模拟客户端
- 创建具有更高权限的新进程
利用方法:
- 创建命名管道
- 等待高权限客户端连接
- 使用 ImpersonateNamedPipeClient 模拟客户端
- 创建新进程或执行其他操作
2.1.3 SeLoadDriverPrivilege 滥用
允许加载内核驱动程序,可用于:
- 加载恶意驱动程序
- 利用漏洞驱动程序进行内核级操作
利用步骤:
- 准备恶意驱动程序
- 使用 NtLoadDriver 或相关 API 加载驱动
- 通过驱动程序执行特权操作
2.2 令牌窃取与复制
2.2.1 从高权限进程窃取令牌
- 使用 OpenProcess 打开目标进程 (如 winlogon.exe)
- 使用 OpenProcessToken 获取进程令牌
- 使用 DuplicateTokenEx 复制令牌
- 使用 CreateProcessWithTokenW 或类似 API 创建新进程
2.2.2 令牌复制攻击
HANDLE hToken;
HANDLE hDupToken;
OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);
DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &hDupToken);
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
CreateProcessWithTokenW(hDupToken, LOGON_WITH_PROFILE, L"cmd.exe", NULL, 0, NULL, NULL, &si, &pi);
2.3 受限令牌绕过
Windows 支持创建受限令牌,限制某些操作。绕过技术包括:
- 使用 SeCreateTokenPrivilege 创建新令牌
- 查找并利用令牌中的漏洞
- 通过其他特权移除限制
3. 实际攻击场景
3.1 服务账户滥用
当攻击者获取服务账户权限时,可能利用:
- 服务账户通常具有 SeImpersonatePrivilege
- 服务账户可能运行在 SYSTEM 上下文
- 服务账户可能有其他非标准权限
攻击流程:
- 识别服务账户的权限
- 寻找可利用的特权
- 执行令牌操作提升权限
3.2 横向移动中的令牌使用
在横向移动中,攻击者可以:
- 使用 Pass-the-Hash 技术
- 使用 Overpass-the-Hash 技术
- 窃取远程服务的令牌
- 滥用 Kerberos 委派
4. 防御与检测
4.1 防御措施
- 最小特权原则:只分配必要的特权
- 特权分离:不同服务使用不同账户
- 令牌过滤:使用受限令牌
- 审计配置:监控特权使用
4.2 检测方法
- 监控可疑的令牌操作:
- DuplicateTokenEx
- CreateProcessWithTokenW
- ImpersonateNamedPipeClient
- 检查特权启用事件
- 监控异常的进程创建
4.3 加固建议
- 定期审查服务账户权限
- 禁用不必要的特权
- 实施特权访问管理 (PAM)
- 启用详细的安全审计
- 使用 Windows Defender ATP 或类似解决方案
5. 工具与技术实现
5.1 常用工具
- Mimikatz:令牌操作、凭据提取
- RottenPotato:特权提升利用
- JuicyPotato:SeImpersonatePrivilege 利用
- PrintSpoofer:滥用打印机后台处理程序服务
5.2 API 函数
关键 Windows API 函数:
OpenProcessTokenDuplicateTokenExCreateProcessWithTokenWImpersonateLoggedOnUserRevertToSelfSetThreadTokenAdjustTokenPrivileges
5.3 示例代码
启用特权示例:
BOOL EnablePrivilege(LPCTSTR lpszPrivilege) {
HANDLE hToken;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
return FALSE;
LUID luid;
if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid)) {
CloseHandle(hToken);
return FALSE;
}
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) {
CloseHandle(hToken);
return FALSE;
}
CloseHandle(hToken);
return TRUE;
}
6. 高级技术
6.1 令牌沙箱逃逸
在沙箱环境中,攻击者可能尝试:
- 利用父进程的令牌
- 查找沙箱未过滤的特权
- 使用跨会话令牌
6.2 内核级令牌操作
通过内核漏洞或驱动程序:
- 直接修改令牌结构
- 绕过令牌检查
- 创建具有任意特权的令牌
6.3 跨会话令牌窃取
在终端服务环境中:
- 使用 WTSQueryUserToken 获取其他会话令牌
- 使用 LogonUser 创建跨会话令牌
- 滥用会话隔离机制
7. 总结
Windows 令牌权限滥用是攻击者常用的特权提升和横向移动技术。理解这些技术对于防御和检测此类攻击至关重要。防御者应关注最小特权原则、实施严格的令牌管理,并监控可疑的令牌操作活动。