前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不要将 SYSTEM 令牌用于沙盒

不要将 SYSTEM 令牌用于沙盒

作者头像
Khan安全团队
发布2022-01-18 12:39:18
6130
发布2022-01-18 12:39:18
举报
文章被收录于专栏:Khan安全团队

了解为什么您不应该将 SYSTEM 令牌用于沙盒令牌。具体来说,我将描述当您混合使用 SYSTEM 用户和SeImpersonatePrivilege时的意外行为,或者更具体地说,如果您删除SeImpersonatePrivilege

正如我在上一篇文章中提到的,可以使用一组有限的权限来配置服务。例如,您可以拥有一项服务,其中您只被授予SeTimeZonePrivilege并删除所有其他默认权限。有趣的是,您可以对任何以 SYSTEM 身份运行的服务执行此操作。我们可以查看哪些服务没有配置SeImpersonatePrivilege附上以下 PS。

PS> Get-RunningService -IncludeNonActive |?{ $_.UserName -eq "LocalSystem" -and $_.RequiredPrivileges.Count -gt 0 -and "SeImpersonatePrivilege" -notin $_.RequiredPrivileges } 

在我的机器上列出了 22 个超级安全且没有SeImpersonatePrivilege的服务配置。当然 SYSTEM 用户是如此强大,以至于他们是否拥有SeImpersonatePrivilege肯定无关紧要。您是对的,但您可能会惊讶地发现,在大多数情况下,SYSTEM 不需要SeImpersonatePrivilege来模拟(几乎)计算机上的任何用户。

让我们看一下检查图表,以确定您是否被允许模拟令牌。

实际上,此图与我在更改其中一个框之前显示的并不完全相同。在 IL 检查和用户检查之间,我为“原始会话检查”添加了一个框。我以前从来没有费心把它放进去,因为它在宏伟的计划中似乎并不重要。在内核调用 SeTokenCanImpersonate中,检查基本上类似于:

代码语言:javascript
复制
if (proctoken->AuthenticationId == 
    imptoken->OriginatingLogonSession) {
 return STATUS_SUCCESS;
}

,检查是,如果当前进程令牌的身份验证 ID 与模拟令牌的 OriginatingLogonSession ID 匹配,则允许模拟。OriginatingLogonSession来自哪里 ?该值在诸如LogonUser之类的 API 时设置使用,并设置为调用 API 的 Token 的 Authentication ID。此检查允许用户取回令牌并模拟它,即使它是通常会被用户检查阻止的不同用户。现在什么 Token 对所有新用户进行身份验证?SYSTEM 确实如此,因此几乎系统上的每个 Token 都有一个 OriginatingLogonSession值设置为 SYSTEM 用户的身份验证 ID。

不服气?我们可以从管理员 PS shell 对其进行测试。首先使用管理员 PS shell 创建一个 SYSTEM PS shell:

代码语言:javascript
复制
PS> Start-Win32ChildProcess powershell

现在在 SYSTEM PS shell 检查当前令牌的身份验证 ID(是的,我知道Pseduo是一个错字;-))。

代码语言:javascript
复制
PS> $(Get-NtToken -Pseduo).AuthenticationId
LowPart HighPart
------- --------
    999 0

接下来从令牌中删除 SeImpersonatePrivilege 

代码语言:javascript
复制
PS> Remove-NtTokenPrivilege SeImpersonatePrivilege

现在选择一个普通用户令牌,比如从资源管理器中转储 Origin。

代码语言:javascript
复制
PS> $p = Get-NtProcess -Name explorer.exe
PS> $t = Get-NtToken -Process $p -Duplicate
PS> $t.OriginLowPart HighPart
------- --------    
999 0

正如我们所见,Origin 与 SYSTEM Authentication ID 匹配。现在尝试模拟令牌并检查所分配的模拟级别是:PS> Invoke-NtToken $t {$(Get-NtToken -Impersonation -Pseduo).ImpersonationLevel}模拟

我们可以看到最后一行将模拟级别显示为Impersonation。如果我们被阻止冒充令牌,它将被设置为识别级别。

如果您认为我犯了一个错误,我们可以通过尝试模拟 SYSTEM 令牌但在更高的 IL 上来强制失败。运行以下命令复制当前令牌的副本,将 IL 降低到高,然后测试模拟级别。

代码语言:javascript
复制
PS> $t = Get-NtToken -Duplicate
PS> Set-NtTokenIntegrityLevel High
PS> Invoke-NtToken $t {$(Get-NtToken -Impersonation -Pseduo).ImpersonationLevel}
Identification

可以看到,级别已经设置为Identification.如果SeImpersonatePrivilege由于权限检查在 IL 检查之前,因此我们已经能够模拟更高级别的 IL 令牌。

这有用吗?它可能派上用场的一个地方是,如果有人试图以某种方式对 SYSTEM 用户进行沙箱化。只要您满足 Origin Session Check 的所有要求,尤其是 IL,那么即使已被剥夺,您仍然可以冒充其他用户。这甚至应该在 AppContainers 或 Restricted 中工作,因为沙盒令牌的检查发生在会话检查之后。

这个博客的要点应该是:

  • 从 SYSTEM 服务中删除SeImpersonatePrivilege基本上是没有意义的。
  • 切勿尝试创建使用 SYSTEM 作为基本令牌的沙盒进程,因为您可能会绕过包括模拟在内的所有安全检查方式。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档