如何解决SSPI:从运行具有本地管理员特权的进程中获取另一用户的凭据
我正在Windows中运行具有loacl admin特权的进程,并尝试使用 AcquireCredentialsHandle 为另一个用户获取证书句柄。 可以传递带有用户信息(例如,用户,域,密码)的SEC_WINNT_AUTH_IDENTITY结构并获取句柄。我已经验证了如果没有通过SEC_WINNT_AUTH_IDENTITY,则只有pszPrincipal不起作用。
我想知道是否有其他方法可以在不提供用户密码的情况下做到这一点?
我正在运行以下情况:
有什么建议吗?
解决方法
通常,您不会代表其他用户请求门票。那将是一个非常危险的安全问题。
有两种解决方法。
-
使用S4U2Self,在该应用程序中,应用程序使用传入的用户名向自己请求票证,这将代表用户向自己获取票证。这使您可以看到用户组成员身份之类的信息。您需要以
SYSTEM
身份运行或拥有SeImpersonatePrivilege
来做到这一点。 -
使用S4U2Proxy aka协议转换,在该转换中,应用程序使用传入的用户名来请求其他服务的票证。这样,您就可以仅基于名称来模拟用户,并且必须由AD明确将其授予服务器和目标。这是一个非常危险的特权,因为您要允许您的应用程序具有与KDC相同的权限。
不幸的是,这是一个相当复杂的代码,因此不能按原样在此帖子中共享。您可以在此处找到示例应用程序:https://github.com/SteveSyfuhs/DelegatedAuthentication
该过程的要旨是:
- 客户端将用户名发送给服务。
- 为
SeImpersonatePrivilege
或SeTcbPrivilege
(意味着以SYSTEM
运行)配置了服务 - 服务调用
LsaLogonUser
并仅传递用户名,并返回NT令牌句柄。 - 服务使用来自(3)的令牌调用
SetThreadToken
。 - 服务呼叫
AcquireCredentialsHandle
,无需任何凭据(使用默认的SSO凭据)。 - 服务电话
InitializeSecurityContext
- 服务将令牌发送到目标服务器
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。