Windows登录会话共享漏洞:突破服务加固隔离的技术分析

本文详细分析了Windows系统中网络服务账户登录会话共享机制的安全缺陷,通过SMB命名管道实现本地环回认证,演示如何绕过服务加固隔离获取RPCSS进程的完全访问权限。

Windows登录会话的过度共享

Windows的登录会话通常与单个经过身份验证的用户及其令牌绑定。然而对于服务账户而言情况并非如此——在服务加固机制下,同一个登录会话中可能存在多个带有不同服务组的令牌。本文将展示这种共享机制如何破坏服务加固的隔离性(至少对NETWORK SERVICE账户有效),并再次强调S-1-1-0并非安全边界。

技术核心:LSASS令牌缓存机制

当LSASS为新登录会话创建令牌时,会存储该令牌以供后续检索。虽然大多数场景下这个机制无显著作用,但在网络认证时会被重新启用。观察AcquireCredentialsHandleAPI的原型时会发现pvLogonID参数,其说明指出:

“指向标识用户的本地唯一标识符(LUID)。此参数为文件系统进程(如网络重定向器)提供。该参数可为NULL。”

拥有TCB权限时,此参数可指定用于网络认证的登录会话ID(从令牌视角看即认证ID)。虽然常规网络认证中令牌无法跨机器跟随,但在本地环回认证场景下,服务端协商获得的令牌将是会话令牌而非调用方令牌。

利用SMB实现权限提升

关键线索在于说明中的"网络重定向器"。最易访问且支持本地环回认证的重定向器是什么?SMB协议。它是否提供获取网络认证令牌的原语?命名管道。SMB是否以内核模式进行网络认证从而具备TCB特权?确实如此。

漏洞复现(Windows 10 1909环境)

  1. 首先需要NETWORK SERVICE权限的PowerShell进程(可通过作者前文方法实现)
  2. 创建命名管道并监听连接:
    1
    2
    
    $pipe = New-NtNamedPipeFile \\.\pipe\ABC -Win32Path
    $job = Start-Job { $pipe.Listen() }
    
  3. 通过本地主机访问管道:
    1
    2
    
    $file = Get-NtFile \\localhost\pipe\ABC -Win32Path
    Wait-Job $job | Out-Null
    
  4. 在模拟命名管道时打开RPCSS进程:
    1
    2
    3
    
    $p = Use-NtObject($pipe.Impersonate()) { 
        Get-NtProcess -ProcessId 1152 
    }
    
    此时获得的访问权限为AllAccess,因为LSASS存储的是该登录会话中首个令牌(即RPCSS进程的令牌)。

技术验证

检查模拟令牌的组列表可确认该令牌属于RPCSS服务:

1
2
3
4
$token = Use-NtObject($pipe.Impersonate()) { 
    Get-NtToken -Impersonation 
}
$token.Groups | ? Name -Match Rpcss

输出显示NT SERVICE\RpcSs组的存在,证实了令牌来源。

影响范围

此特性存在于所有登录会话,但普通用户会话的利用价值较低。需注意的是:当以NETWORK SERVICE身份访问管理共享时,实际会以RPCSS服务身份认证,可能访问该服务SID创建的文件。本文仅抛砖引玉,相信读者能发掘更多创造性利用方式。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计