是否可以以某种方式将 WindowsIdentity 类型转换或转换为 PSCredential 类型?

Posted

技术标签:

【中文标题】是否可以以某种方式将 WindowsIdentity 类型转换或转换为 PSCredential 类型?【英文标题】:Is it possible to somehow cast or convert a WindowsIdentity type to PSCredential type? 【发布时间】:2018-03-09 01:51:26 【问题描述】:

上下文:在 PowerShell 中工作,需要 PSCredential 对象,具有 WindowsIdentity 类型的对象。

假设您使用以下方法获取 WindowsIdentity 类型:

"[Security.Principal.WindowsIdentity]::GetCurrent()"

您需要 PSCredential 对象来进行网络调用,例如 Invoke-RestMethod。

除了调用通常的 Get-Credential 并提示用户输入用户名和密码之外,我们是否可以实际使用当前的安全上下文来创建凭据对象?例如,我们可以将 WindowsIdentity 对象转换为 PSCredential(如果不是直接 - 然后通过一系列步骤?)。

如果没有,那么关于从当前安全上下文创建 PSCredential 对象的任何其他想法(不指定用户名或密码 - 或存储加密的用户名和密码,因为这也需要在密码更改时更新)?

以前可能有人问过类似的问题,但我找不到尝试将 WindowsIdentity 转换为 PSCredential 类型的方法 - 或者任何关于为什么设计可能会阻止这种情况的明确答案。如果这根本不可能 - 不支持它的原因可能是什么?您是否看到任何可行的解决方法? (我尝试添加标签:PSCredential,但此标签尚不存在,并且我没有足够的声誉来创建它:我想添加该标签:也许社区中的某个人可以添加它。谢谢)

【问题讨论】:

【参考方案1】:

我相信其他人会对此有自己的看法,但据我所知,这里有一些事情会让这成为一个真正的挑战,而不是作为一项运营交易。

[Security.Principal.WindowsIdentity]::GetCurrent(), 为您提供有关您在网络上经过身份验证的身份的信息。 它不包含有关用户密码的任何信息

(https://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity(v=vs.110).aspx),

这是 System.Management.Automation.PSCredential 需要的

(https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.pscredential?view=powershellsdk-1.1.0)。

记住,GetNetworkCredential 的目标

(https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.pscredential.getnetworkcredential?view=powershellsdk-1.1.0#System_Management_Automation_PSCredential_GetNetworkCredential)

(当然是 System.Management.Automation.PSCredential 方法)是将您的用户名分解为单独的 Domain 和 UserName 字符串,并以明文形式提供凭证密码。

对于网络、客户端访问,如果没有提供有效密码,PSCredential 将无法工作。当然,如果您亲自输入了信息,那么只有您可以将其撤消,而不是某个远程人员或服务。

想一想。您能想象能够做到这一点的风险后果有增无减吗?

能够动态地提取当前登录用户的所有身份验证熵。这将是一个即时 ESP(模拟/特权升级)问题。使用这样的方法来混淆密码、长度、复杂性是没有意义的。考虑 Pth(传递类似哈希的攻击)情况,而无需从头抓取哈希。

想象一下,向任何远程主机(无论谁登录)启动远程会话,利用您在此处陈述的内容,从而冒充(拥有他们所有的权利和特权)用户做非常邪恶的事情,甚至只是意味着事情(更改他们的密码、桌面设置、ADDS 属性,比如是否允许他们更改图片、电话号码、娘家姓等。所有这些都记录在审核日志中,就好像那个用户做了一样)。您可以登录他们的个人人力资源文件,将 cred 对象传递给 HR 网站等。我确信这不是您的意图(至少我希望不是),但仍然如此。

话虽如此,如果您是在模拟用户,那么有一些资源可以提供有关如何执行此操作的方法。然而,当您查看执行此操作的代码时,它所涉及的不仅仅是您在 MS PowerShell 库中要求的内容,而且它甚至希望您将一个真实的 cred 对象而不是 WI 对象传递给它。

通过网络联系需要完整的身份、用户和密码。每次尝试触碰您尚未触碰的资源或很久没有触碰的资源时,您的 KDC(域控制器)都会参与其中,如果没有完整的凭据,KDC Curb TGT 将失败。

更新

沙巴苏曼

至于——

谢谢。关于:“然而,当你查看代码时,它更多的是 所涉及的不仅仅是你所要求的......” - 会不会 您可以向我指出您的一些代码 在您的评论中提到?

这是我所指的代码。

模拟用户

New-ImpersonateUser 使用 advapi32.dll 中的 LogonUser 方法来 获得一个令牌,然后可以用来调用 WindowsIdentity.Impersonate 方法以模拟另一个 用户没有从当前会话中注销。你可以通过 单独的 PSCredential 或每个字段。一旦冒充 完成后,强烈建议使用 Remove-ImpersonateUser(一个函数 在运行时添加到全局范围)被调用以恢复到 原始用户。

https://gallery.technet.microsoft.com/scriptcenter/Impersonate-a-User-9bfeff82

【讨论】:

谢谢。关于:“但是,当您查看执行此操作的代码时,它所涉及的不仅仅是您所要求的……”-您是否可以向我指出您在你的评论?这是我们可以在.Net 中做的事情吗?在 PowerShell 中,我们似乎可以访问所有可以在 .Net 中完成的事情(当然,我真的可以做出如此笼统的声明——我们看到 .Net 框架经常在 PowerShell 中被直接访问——事实上我正在使用 Security .Principal.WindowsIdentity 在我的示例中。)

以上是关于是否可以以某种方式将 WindowsIdentity 类型转换或转换为 PSCredential 类型?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将 URL 的一部分存储到变量中,或者以某种方式使用 cypress 并在以后使用它?

是否可以以某种方式使用recaptcha和auth0来避免让用户登录但仍然有令牌?

是否可以以某种方式在表格行周围设置边框?

是否有可能以某种方式使该程序崩溃?

是否可以在资源管理器窗口中以编程方式将文件夹添加到 Windows 10 快速访问面板?

是否有可能以某种方式同时在 ZMQ 中使用 Send/Recv(通过多线程)?