Windows登录会话的过度共享
Windows的登录会话通常与单个经过身份验证的用户及其令牌绑定。然而对于服务账户而言情况并非如此——在服务加固机制下,同一个登录会话中可能存在多个带有不同服务组的令牌。本文将展示这种共享机制如何破坏服务加固的隔离性(至少对NETWORK SERVICE账户有效),并再次强调S-1-1-0并非安全边界。
技术核心:LSASS令牌缓存机制
当LSASS为新登录会话创建令牌时,会存储该令牌以供后续检索。虽然大多数场景下这个机制无显著作用,但在网络认证时会被重新启用。观察AcquireCredentialsHandle
API的原型时会发现pvLogonID
参数,其说明指出:
“指向标识用户的本地唯一标识符(LUID)。此参数为文件系统进程(如网络重定向器)提供。该参数可为NULL。”
拥有TCB权限时,此参数可指定用于网络认证的登录会话ID(从令牌视角看即认证ID)。虽然常规网络认证中令牌无法跨机器跟随,但在本地环回认证场景下,服务端协商获得的令牌将是会话令牌而非调用方令牌。
利用SMB实现权限提升
关键线索在于说明中的"网络重定向器"。最易访问且支持本地环回认证的重定向器是什么?SMB协议。它是否提供获取网络认证令牌的原语?命名管道。SMB是否以内核模式进行网络认证从而具备TCB特权?确实如此。
漏洞复现(Windows 10 1909环境)
- 首先需要NETWORK SERVICE权限的PowerShell进程(可通过作者前文方法实现)
- 创建命名管道并监听连接:
1 2
$pipe = New-NtNamedPipeFile \\.\pipe\ABC -Win32Path $job = Start-Job { $pipe.Listen() }
- 通过本地主机访问管道:
1 2
$file = Get-NtFile \\localhost\pipe\ABC -Win32Path Wait-Job $job | Out-Null
- 在模拟命名管道时打开RPCSS进程:
此时获得的访问权限为
1 2 3
$p = Use-NtObject($pipe.Impersonate()) { Get-NtProcess -ProcessId 1152 }
AllAccess
,因为LSASS存储的是该登录会话中首个令牌(即RPCSS进程的令牌)。
技术验证
检查模拟令牌的组列表可确认该令牌属于RPCSS服务:
|
|
输出显示NT SERVICE\RpcSs
组的存在,证实了令牌来源。
影响范围
此特性存在于所有登录会话,但普通用户会话的利用价值较低。需注意的是:当以NETWORK SERVICE身份访问管理共享时,实际会以RPCSS服务身份认证,可能访问该服务SID创建的文件。本文仅抛砖引玉,相信读者能发掘更多创造性利用方式。