是否有LogonUser的替代方案以及模拟指定帐户以访问网络资源?我正在寻找模仿的方法,它可以让我连接到外国域的机器(或工作组机器同样的事情)。
对于初始数据我有:机器名,用户名(或域\用户名),明文密码。
我知道有一种方法可以使用WNetAddConnection与\\ machinename \ ipc $建立连接,然后大多数网络功能将在该帐户的上下文中运行,但win2008添加了另一个扭曲,一些功能仍然使用该帐户,该线程正在运行。
我也知道,有一些方法可以使用SSPI获取模拟令牌。有没有人尝试过这些令牌,它们是否适合访问共享,SCM,远程注册表和东西?是WNetAddConnection正在使用的吗?
编辑:为了澄清,我无法使用LogonUser的原因是因为我需要在不受信任的域或工作组中模拟用户
EDIT2:另一个澄清:我正在尝试实施的项目类似于psexec,例如:
EDIT3:我真的很想听听有关SSPI InitializeSecurityContext / AcquireCredentialsHandle选项的更多信息。是否有人广泛使用此API?是否可以使用通过模拟返回的令牌,以便线程可以访问网络共享和复制文件等?有人可以发布一个有效的代码片段吗?
EDIT4:感谢Marsh Ray,问题得到了解决。如果有人希望看到概念验证代码,it is here
答案 0 :(得分:9)
如果您想在森林之外“访问网络资源”,请按照您的提及使用WNetAddConnection2 / 3执行此操作,或使用标准RPC API和RPC_ C__ AUTHN__ GSS__ NEGOTIATE以及显式凭据结构。
通常,“冒充”是服务器端发生的事情。服务器端将能够以您要连接的帐户模拟连接。
但关键在于:假冒只对模拟服务器可以在其本地SAM / domain / forest目录中访问的帐户有意义。如果客户端和服务器位于不同的林中,他们显然无法就模拟令牌的帐户的SID达成一致(除了管理员等众所周知的SID主要用于混淆此类事件),以及这似乎有必要检查DACL等。
也许您想要的是使用LOGON32__ LOGON__ NEW__ CREDENTIALS标志调用LogonUserEx。这应该成功(即使在不同的林中 - 它实际上并不验证您提供的凭据)给您一个带有您指定的用户名/密码的令牌。您可能必须使用DuplicateToken将其转换为模拟令牌。然后,您可以使用SetThreadToken替换线程上的令牌。
恕我直言,这不是真正的“冒充”,你只是直接使用凭证,但它允许你透明地访问网络资源作为你提供的任意用户名/密码。
编辑:哦,是的,要知道在这种类型的连接上没有针对中间人的保护。客户端尤其不能强烈地验证服务器(缺少像IPSEC这样的英雄),所以理论上你不能相信服务器告诉你的任何东西。
答案 1 :(得分:4)
理论认为,您将凭据作为SEC_WINNT_AUTH_IDENTITY
结构传递给创建AcquireCredentialsHandle中使用的句柄的InitializeSecurityContext函数。我从来没有尝试过在国外域名,我不知道它是否有效。
答案 2 :(得分:0)
通过Windows API直接可靠地执行此操作几乎是不可能的,而Windows在幕后做了大量工作,使网络访问“正常工作”。此外,事件的模拟方面仅适用于调用API的单个线程。
但是......你可以在不同的用户下运行整个程序......例如当你运行服务时。
因此,您可以编辑主程序中的注册表,以在不同的安全令牌下运行各种服务,并使用IPC /套接字与主应用程序中的这些进程进行通信。即。在主应用程序滥用的不同用户下运行的帮助程序进程的一大堆(或重新启动并重新配置相同的进程)。
我意识到这是一个黑客但似乎可行;)
答案 3 :(得分:0)
您可以打开命令行,使用明文用户名和密码映射驱动器。然后断开驱动器:
net use m: \\machinename\share password /user:username
... do stuff ...
net use m: /delete
http://technet.microsoft.com/en-us/library/cc756153(WS.10).aspx