无密码的 CreateProcessAsUser 和 LogonUser

Posted

技术标签:

【中文标题】无密码的 CreateProcessAsUser 和 LogonUser【英文标题】:CreateProcessAsUser and LogonUser Without Password 【发布时间】:2010-12-09 23:32:22 【问题描述】:

使用 WTSGetActiveConsoleSessionId 和 WTSQueryUserToken,我知道作为 SYSTEM 运行的服务可以在不使用密码的情况下以launch an application onto the current desktop 运行。如果启动进程的程序有足够的权限,是否启动 CreateProcessAsUser 而不需要 LogonUser 的密码?

编辑 1:情况与this instance 模糊相似,但我需要能够以用户身份启动进程,无论他们是否登录到系统时间。

【问题讨论】:

【参考方案1】:

有可能使用未记录的 NtCreateToken 函数;我认为this example project 使用它。否则,这是不可能的。

【讨论】:

【参考方案2】:

根据您尝试伪造的令牌,您将需要某些特权,尤其是想到的 TCB。服务有。 Nebett 的“Windows NT/2000 Native API Reference”有一个例子。

但是,在当前桌面上创建 SYSTEM 进程的服务不再像 Vista 那样容易了。改进的会话分离是这里的问题。但是,您可以模拟管道另一端的用户,并且当前线程应该能够充当该用户(例如 SYSTEM)。

【讨论】:

SeTcbPrivilege 是不够的。您需要 SeCreateTokenPrivilege,它在较新的 Windows 版本上仅由 lsass.exe 持有。如果您在正确的安全上下文中运行,没有什么能真正阻止您从 lsass.exe 复制进程令牌,例如来自作为 LocalSystem 运行的服务。【参考方案3】:

至少理论上,您可以实现自己的authentication package,然后使用它来生成合适的令牌。

根据您的确切要求,另一个可能的选项是使用CreateRestrictedToken 函数的SidsToRestrictPrivilegesToDelete 选项以及SetTokenInformation 来创建您自己的令牌的适当修改的衍生物。

但是,如果您要运行不受信任的代码,我不会相信这种方法:我不完全确定足够聪明的攻击者不可能使用这样的令牌来攻击父进程或其他特权进程。 (特别是我不确定您是否能够创建新的登录会话并将其分配给受限令牌;这可能不是唯一的问题。)

【讨论】:

以上是关于无密码的 CreateProcessAsUser 和 LogonUser的主要内容,如果未能解决你的问题,请参考以下文章

CreateProcessAsUser 生成错误 5

CreateProcessAsUser 在活动会话中创建窗口

从 Vista 上的服务中使用 CreateProcessAsUser 的桌面问题

CreateProcessAsUser hToken 为零

CreateProcessAsUser 进程以 -1073741502 退出

“更改用户”时 CreateProcessAsUser 不起作用