利用 SSPI 数据报上下文 bypassUAC
字数 1723 2025-08-18 11:35:59
利用SSPI数据报上下文bypassUAC技术分析
0x00 前言
本文详细分析了一种基于SSPI数据报上下文的UAC绕过技术,该漏洞最初由splinter_code在2023年9月公布并提交至UACME项目。该技术在Windows 11、Windows 10及Windows 7的各个版本中均验证有效。
0x01 前置知识
UAC机制概述
UAC(User Account Control)是Windows的用户账户控制机制,当系统更改需要管理员权限时,会通知用户进行审核。UAC使应用程序和任务始终在非管理员账户的安全上下文中运行,除非明确授权管理员权限。
UAC提示界面有两种颜色:
- 黄色:程序无数字签名
- 蓝色:程序有数字签名
带有黄蓝相间盾牌标志的程序表示需要较高权限,运行时需经过UAC确认。
注意:bypassUAC并非真正的提权,而是绕过权限保护机制,最终效果类似提权。
Windows令牌机制
Windows令牌分为两类:
- 主令牌(Primary Token):附加到进程,与交互式用户会话关联
- 模拟令牌(Impersonation Token):附加到线程,允许线程临时采用另一安全上下文
管理员登录时会创建两个令牌:
- 标准用户令牌:移除管理员特权和SID
- 管理员令牌:完整权限
explorer.exe使用标准令牌运行,所有用户启动的进程都继承此令牌。
0x02 本地与网络身份验证差异
研究发现两种身份验证方式生成的令牌存在关键差异:
| 特征 | 本地身份验证 | 网络身份验证 |
|---|---|---|
| 日志类型 | LogonType 2 | LogonType 3 |
| UAC限制 | 受限(IL=Medium) | 不受限(IL=High) |
| 管理员SID | 禁用 | 启用 |
关键发现:网络身份验证生成的令牌不受UAC限制。
0x03 伪造网络身份验证
数据报上下文验证
Windows使用LsaLogonUser API进行身份验证,默认通过MSV1_0验证包工作。通过设置NTLMSSP_NEGOTIATE_DATAGRAM标志(在InitializeSecurityContext中设置ISC_REQ_DATAGRAM),可以伪造数据报式网络验证。
验证流程:
- 客户端调用
AcquireCredentialsHandle获取凭据句柄 - 调用
InitializeSecurityContext设置ISC_REQ_DATAGRAM标志 - 服务端调用
AcceptSecurityContext处理验证
Lsass令牌保存问题
Lsass在创建新登录会话时会:
- 先生成一个不受限的高权限令牌
- 然后生成一个受限令牌
- 将两者关联
关键漏洞:Lsass会存储登录会话中生成的第一个令牌(高权限令牌),而后续操作可能使用此令牌而非预期的受限令牌。
0x04 利用技术实现
利用条件
- 需要TCB(Trusted Computing Base)特权
- 通过命名管道获取网络验证令牌
- 利用SMB服务的内核模式运行特性
具体步骤
- 获取Network Service权限的PowerShell环境:
# 安装并导入NtObjectManager
Save-Module -Name NtObjectManager -Path C:\
Import-Module C:\NtObjectManager
# 开启System权限PowerShell
$p = Start-Win32ChildProcess PowerShell
# 创建Network Service令牌并启动PowerShell
$sess = Get-NtToken -Session
$token = Get-NtToken -Service NetworkService -AdditionalGroups $sess.LogonSid.Sid
New-Win32Process PowerShell -Token $token -CreationFlags NewConsole
- 创建命名管道并模拟身份:
$pipe = New-NtNamedPipeFile \\.\pipe\AAA2 -Win32Path
$job = Start-Job {$pipe.Listen()}
$file = Get-NtFile \\127.0.0.1\pipe\AAA2 -Win32Path
Wait-Job $Job | Out-Null
# 模拟命名管道访问Rpcss服务
$p = Use-NtObject($pipe.Impersonate()){ Get-NtProcess -ProcessId <Rpcss_PID>}
$p.GrantedAccess
- 验证获取的令牌权限:
$token = Use-NtObject($pipe.Impersonate()){ Get-NtToken -Impersonation}
$token.Groups | ? Name -Match Rpcss
0x05 漏洞验证与利用
验证方法
使用模拟的受限令牌通过环回接口进行认证,观察实际使用的令牌权限级别。
实现命令执行
由于标准RPC函数(如RegConnectRegistryW)无法正确设置pvLogonID,需要:
- 使用
CreateFileW的自定义RPC客户端实现 - 通过SMB重定向驱动(mrxsmb20.sys)在内核模式进行身份验证
利用效果:
- 添加系统用户
- 以SYSTEM权限执行命令并写入系统目录
0x06 防御建议
- 限制Network Service账户权限
- 监控异常命名管道活动
- 更新Lsass相关安全补丁
- 审计高权限令牌使用情况