SSPI:从运行具有本地管理员特权的进程中获取另一用户的凭据

问题描述

我正在Windows中运行具有loacl admin特权的进程,并尝试使用 AcquireCredentialsHandle 为另一个用户获取证书句柄。 可以传递带有用户信息(例如,用户,域,密码)的SEC_WINNT_AUTH_IDENTITY结构并获取句柄。我已经验证了如果没有通过SEC_WINNT_AUTH_IDENTITY,则只有pszPrincipal不起作用。

我想知道是否有其他方法可以在不提供用户密码的情况下做到这一点?

我正在运行以下情况:

  1. 客户端使用UPN获取一个kerberos令牌并将其发送到服务器
  2. 服务器尝试使用客户端的UPN获取凭据句柄(AcquireCredentialsHandle)。

有什么建议吗?

解决方法

通常,您不会代表其他用户请求门票。那将是一个非常危险的安全问题。

有两种解决方法。

  1. 使用S4U2Self,在该应用程序中,应用程序使用传入的用户名向自己请求票证,这将代表用户向自己获取票证。这使您可以看到用户组成员身份之类的信息。您需要以SYSTEM身份运行或拥有SeImpersonatePrivilege来做到这一点。

  2. 使用S4U2Proxy aka协议转换,在该转换中,应用程序使用传入的用户名来请求其他服务的票证。这样,您就可以仅基于名称来模拟用户,并且必须由AD明确将其授予服务器和目标。这是一个非常危险的特权,因为您要允许您的应用程序具有与KDC相同的权限。

不幸的是,这是一个相当复杂的代码,因此不能按原样在此帖子中共享。您可以在此处找到示例应用程序:https://github.com/SteveSyfuhs/DelegatedAuthentication

该过程的要旨是:

  1. 客户端将用户名发送给服务。
  2. SeImpersonatePrivilegeSeTcbPrivilege(意味着以SYSTEM运行)配置了服务
  3. 服务调用LsaLogonUser并仅传递用户名,并返回NT令牌句柄。
  4. 服务使用来自(3)的令牌调用SetThreadToken
  5. 服务呼叫AcquireCredentialsHandle,无需任何凭据(使用默认的SSO凭据)。
  6. 服务电话InitializeSecurityContext
  7. 服务将令牌发送到目标服务器

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...