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

时间:2018-03-09 01:51:26

标签: powershell windows-identity

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

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

“[Security.Principal.WindowsIdentity] :: GetCurrent()”

您需要PSCredential对象进行网络呼叫,例如Invoke-RestMethod。

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

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

之前可能已经提出了类似的问题,但是我找不到尝试将WindowsIdentity转换为PSCredential类型的方法 - 或任何关于为何可以通过设计来防止这种情况的明确答案。如果这不是根本可能的 - 可能是不支持它的原因是什么?你看到任何看似合理的解决方法吗? (我试图添加一个标签:PSCredential但这个标签还不存在,我没有足够的声誉来创建它:我想添加该标签:也许社区中的某个人可以添加它。谢谢)

1 个答案:

答案 0 :(得分:2)

我相信其他人会对此有所了解,但这里有一些我理解的内容,这会使这成为一项真正的挑战,而不是作为一项运营协议而谨慎。

[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将无法运行。当然,如果您亲自输入信息,您和只有您可以撤销信息,而不是某些远程人员或服务。

考虑一下。你能想象能够做到这一点的风险后果吗?

能够动态地拉动当前登录用户的所有auth熵。这将是即时ESP(模仿/升级特权)问题。密码混淆,长度,复杂性,这样的方法将毫无意义。想想Pth(传递类似哈希的攻击)的情况,而不需要抓住哈希值。

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

所有这一切,如果您是在用户模仿之后,那么有资源提供了如何执行此操作的方法。然而,当您查看代码时,它更多地涉及到您在MS PowerShell库中所要求的内容,但即使它希望您将其传递给真正的cred对象而不是WI对象。

通过网络进行访问需要完整的身份,用户和密码。每次尝试触摸您尚未触及的资源,或者在很长一段时间内没有触及的资源,您的KDC(域控制器)将参与其中并且没有完全的信誉,KDC Curb TGT将失败。

<强> 更新

shivesh suman

至于---

  

感谢。关于:“但是,当你看代码时,它会更多   涉及的不仅仅是你要求的......“ - 它会不会   你有可能指出我的一些代码   在评论中提及?

这是我所指的代码。

  

冒充用户

     

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

     

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