如何获取 Windows SYSTEM 用户令牌

Posted

技术标签:

【中文标题】如何获取 Windows SYSTEM 用户令牌【英文标题】:How to get Windows SYSTEM user token 【发布时间】:2012-11-13 06:24:04 【问题描述】:

操作系统是启用了 UAC 的 Windows 7 或更高版本。调用进程具有管理员权限,已由 UAC 框确认。

我想在用户 SYSTEM 下生成一个新的控制台窗口 (cmd.exe)(不要问为什么)。我可以使用 Sysinternals 的 PsExec 工具或类似工具以交互方式执行此操作,但我没有源代码,我需要了解它是如何工作的。

我知道我必须调用 CreateProcessAsUser() 并且在第一个参数 (hToken) 设置为 NULL 时可以正常工作,但现在我需要知道如何获取 hToken。我知道我可以通过调用 LogonUser() 来获得这样的令牌 - 但不能用于 SYSTEM。我如何获得 SYSTEM 的令牌?

我曾想过使用 DuplicateTokenEx(),但这需要一个我没有的原始令牌。

我是否必须查询进程列表,找到任何 SYSTEM 进程并尝试复制该令牌或其他什么?我不想对 PsExec 工具或其他工具之一进行反向工程。

【问题讨论】:

如果您不想编程,请搜索“runassystem”。 【参考方案1】:

通常您会安装并启动一项服务,并配置为以 SYSTEM 身份登录。然后您可以使用OpenProcessTokenDuplicateTokenEx 制作令牌的副本。

您可能需要使用 SetTokenInformation 更改令牌的会话 ID 以匹配交互式用户的会话 ID。您需要充当操作系统的一部分权限才能执行此操作,因此您应该从服务本身内部执行此操作。准备好使用重复令牌后,您可以使用 DuplicateHandle 将句柄复制到管理进程中,或者(使用正确的选项)您也可以直接从服务启动命令 shell。

【讨论】:

【参考方案2】:

或者以最大允许访问权限打开 winlogon 进程,尝试打开进程令牌(也以最大允许权限),然后尝试使用模拟权限复制此 winlogon 句柄。在win8.1上这将成功。在其他情况下,您将需要临时更改令牌 dacl,使用 null 或您自己的管理进程令牌

【讨论】:

我仍然建议您安装自己的服务而不是使用系统进程,但如果由于某种原因无法做到这一点,这听起来像是一个可行的替代方案。请注意,启用备份和恢复权限会绕过大多数权限检查,因此它在这种情况下也可能有效,并且可以让您免于弄乱 DACL 的危险。如果您确实必须弄乱 DACL,绝对不要使用空 DACL - 这会引入安全漏洞。

以上是关于如何获取 Windows SYSTEM 用户令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何在启用 UAC 的 Windows 服务中调用 LogonUser() 以获取不受限制的完整令牌?

使用推送通知时如何获取用户设备令牌

如何处理 Cognito 上的令牌过期问题

如何在 Hadoop mapReduce 中获取 Kerberos 而不是委托令牌?

如何用vbscript获取当前windows登陆的用户名?

如何撤销持票人令牌(没有刷新)?