利用 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令牌分为两类:

  1. 主令牌(Primary Token):附加到进程,与交互式用户会话关联
  2. 模拟令牌(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),可以伪造数据报式网络验证。

验证流程:

  1. 客户端调用AcquireCredentialsHandle获取凭据句柄
  2. 调用InitializeSecurityContext设置ISC_REQ_DATAGRAM标志
  3. 服务端调用AcceptSecurityContext处理验证

Lsass令牌保存问题

Lsass在创建新登录会话时会:

  1. 先生成一个不受限的高权限令牌
  2. 然后生成一个受限令牌
  3. 将两者关联

关键漏洞:Lsass会存储登录会话中生成的第一个令牌(高权限令牌),而后续操作可能使用此令牌而非预期的受限令牌。

0x04 利用技术实现

利用条件

  1. 需要TCB(Trusted Computing Base)特权
  2. 通过命名管道获取网络验证令牌
  3. 利用SMB服务的内核模式运行特性

具体步骤

  1. 获取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
  1. 创建命名管道并模拟身份:
$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
  1. 验证获取的令牌权限:
$token = Use-NtObject($pipe.Impersonate()){ Get-NtToken -Impersonation}
$token.Groups | ? Name -Match Rpcss

0x05 漏洞验证与利用

验证方法

使用模拟的受限令牌通过环回接口进行认证,观察实际使用的令牌权限级别。

实现命令执行

由于标准RPC函数(如RegConnectRegistryW)无法正确设置pvLogonID,需要:

  1. 使用CreateFileW的自定义RPC客户端实现
  2. 通过SMB重定向驱动(mrxsmb20.sys)在内核模式进行身份验证

利用效果

  • 添加系统用户
  • 以SYSTEM权限执行命令并写入系统目录

0x06 防御建议

  1. 限制Network Service账户权限
  2. 监控异常命名管道活动
  3. 更新Lsass相关安全补丁
  4. 审计高权限令牌使用情况

0x07 参考链接

  1. splinter_code的原始分析
  2. Windows登录会话共享分析
  3. 获取交互式服务账户
利用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环境: 创建命名管道并模拟身份: 验证获取的令牌权限: 0x05 漏洞验证与利用 验证方法 使用模拟的受限令牌通过环回接口进行认证,观察实际使用的令牌权限级别。 实现命令执行 由于标准RPC函数(如 RegConnectRegistryW )无法正确设置 pvLogonID ,需要: 使用 CreateFileW 的自定义RPC客户端实现 通过SMB重定向驱动(mrxsmb20.sys)在内核模式进行身份验证 利用效果 : 添加系统用户 以SYSTEM权限执行命令并写入系统目录 0x06 防御建议 限制Network Service账户权限 监控异常命名管道活动 更新Lsass相关安全补丁 审计高权限令牌使用情况 0x07 参考链接 splinter_ code的原始分析 Windows登录会话共享分析 获取交互式服务账户