gal*_*ets 8 c++ security impersonation winapi sspi
LogonUser是否有任何替代方案以及模拟给定帐户以访问网络资源?我正在寻找模仿的方法,这将让我连接到外国域(或同一事件的工作组机器)的机器.
对于初始数据,我有:机器名,用户名(或域\用户名),明文密码.
我知道有一种方法可以使用WNetAddConnection与\\ machinename\ipc $建立连接,然后大多数网络功能将在该帐户的上下文中运行,但win2008添加了另一个扭曲,一些功能仍然使用该帐户,该线程在.
我也知道,有一些方法可以使用SSPI获取模拟令牌.有没有人尝试过这些令牌,它们是否适合访问共享,SCM,远程注册表和东西?是WNetAddConnection使用的是什么?
编辑:澄清,我不能使用LogonUser的原因是因为我需要在不受信任的域或工作组中模拟用户
EDIT2:另一个澄清:我试图实现的项目类似于psexec,例如:
编辑3:我真的很想听听有关SSPI InitializeSecurityContext/AcquireCredentialsHandle选项的更多信息.是否有人广泛使用此API?是否可以使用通过模拟返回的令牌,以便线程可以访问网络共享和复制文件等?有人可以发布一个有效的代码片段吗?
EDIT4:感谢Marsh Ray,问题得到了解决.如果有人希望看到概念验证代码,它就在这里
如果您想在森林之外"访问网络资源",请使用您提到的WNetAddConnection2/3,或使用带有RPC_ C__ AUTHN__ GSS__ NEGOTIATE和显式凭据结构的标准RPC API.
通常,"冒充"是在服务器端发生的事情.服务器端将能够以您连接的帐户模拟连接.
但关键在于:模拟只对模拟服务器可以在其本地SAM/domain/forest目录中访问的帐户有意义.如果客户端和服务器位于不同的林中,他们显然无法就模拟令牌的帐户的SID达成一致(除了管理员等众所周知的SID主要用于混淆此类事件),以及这似乎有必要检查DACL等.
也许您想要的是使用LOGON32__ LOGON__ NEW__ CREDENTIALS标志调用LogonUserEx.这应该成功(即使在不同的林中 - 它实际上并不验证您提供的凭据)给您一个带有您指定的用户名/密码的令牌.您可能必须使用DuplicateToken将其转换为模拟令牌.然后,您可以使用SetThreadToken替换线程上的令牌.
恕我直言,这不是真正的"假冒",你只是直接使用凭证,但它允许您透明地访问网络资源作为您提供的任意用户名/密码.
编辑:哦,是的,请注意,在这种类型的连接上没有针对中间人的保护.客户端尤其不能强烈地验证服务器(缺少像IPSEC这样的英雄),所以理论上你不能相信服务器告诉你的任何东西.