gpt4 book ai didi

c++ - 用于网络模拟的 LogonUser 替代方案 (C++)

转载 作者:可可西里 更新时间:2023-11-01 17:36:28 26 4
gpt4 key购买 nike

对于 LogonUser 和模拟给定帐户以访问网络资源,是否有任何替代方法?我正在寻找一种模拟方法,它可以让我连接到外部域中的机器(或者,工作组机器同样如此)。

对于初始数据,我有:机器名、用户名(或域\用户名)、明文密码。

我知道有一种方法可以使用 WNetAddConnection 与\\machinename\ipc$ 建立连接,然后大多数网络功能将在该帐户的上下文中运行,但是 win2008 添加了另一个转折,一些功能仍然使用该帐户,即该线程正在运行。

我也知道,有一些方法可以使用 SSPI 获取模拟 token 。有没有人试验过这些 token ,它们是否适合访问共享、SCM、远程注册表和其他东西? WNetAddConnection 正在使用什么?

编辑:澄清一下,我不能使用 LogonUser 的原因是因为我需要模拟不受信任的域或工作组中的用户

EDIT2: 另一个说明:我要实现的项目类似于 psexec,例如:

  • 程序不应修改主机或事件目录配置(例如:创建临时本地用户等)。此外,不能假设它是否在 DC 上运行
  • 无法假设远程主机上预装了哪些软件,唯一给出的条件是在目标上启用了 Windows 文件共享
  • 已知帐户/密码在目标上工作,但目标机器可能在本地域、外部域,甚至根本不在域中。

EDIT3:我真的很想听到更多关于 SSPI InitializeSecurityContext/AcquireCredentialsHandle 选项的信息。有没有人一直在广泛使用这个 API?是否可以使用模拟返回的 token ,以便线程可以访问网络共享和复制文件等?有人可以发布工作代码片段吗?

EDIT4:感谢 Marsh Ray,问题得到解决。如果有人想查看概念验证代码,it is here

最佳答案

如果您想要“访问您的森林之外的网络资源”,请使用您提到的 WNetAddConnection2/3 执行此操作,或者使用带有 RPC_ C__ AUTHN__ GSS__ NEGOTIATE 和显式凭据结构的标准 RPC API。

通常,“模拟”是发生在服务器端的事情。服务器端将能够将连接模拟为您正在连接的帐户。

但关键是:模拟只对模拟服务器可以在其本地 SAM/域/森林目录中访问的帐户有意义。如果客户端和服务器在不同的林中,他们显然不能就模拟 token 帐户的 SID 达成一致(除了像 Administrator 这样的知名 SID 主要用于混淆这种事情的情况),并且这似乎有必要检查 DACL 等。

也许您想要的是使用 LOGON32__ LOGON__ NEW__ CREDENTIALS 标志调用 LogonUserEx。这应该会成功(即使在不同的林中 - 它实际上不会验证您提供的凭据)为您提供一个带有您指定的用户名/密码的 token 。您可能必须使用 DuplicateToken 将其转换为模拟 token 。然后您可以使用 SetThreadToken 来替换线程上的 token 。

恕我直言,这并不是真正的“模拟”,您只是直接使用凭据,但它允许您以您提供的任意用户名/密码透明地访问网络资源。

编辑:哦,是的,请注意在这种类型的连接上没有针对中间人的保护。客户端尤其不能对服务器进行强身份验证(缺少像 IPSEC 这样的英雄),因此理论上您不能相信服务器告诉您的任何内容。

关于c++ - 用于网络模拟的 LogonUser 替代方案 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1155553/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com