上下文:在PowerShell中工作,需要PSCredential对象,有一个WindowsIdentity类型的对象。
假设您使用以下方式获取WindowsIdentity类型:
“[Security.Principal.WindowsIdentity] :: GetCurrent()”
您需要PSCredential对象进行网络呼叫,例如Invoke-RestMethod。
我们是否可以实际使用当前的安全上下文来创建凭证对象,而不是调用通常的Get-Credential并提示用户输入用户名和密码?例如,我们可以将WindowsIdentity对象转换为PSCredential(如果不是直接 - 然后通过一系列步骤吗?)。
如果没有那么关于从当前安全上下文创建PSCredential对象的任何其他想法(没有指定用户名或密码 - 或者存储加密的用户名和密码,因为密码更改时也需要更新)?
之前可能已经提出了类似的问题,但是我找不到尝试将WindowsIdentity转换为PSCredential类型的方法 - 或任何关于为何可以通过设计来防止这种情况的明确答案。如果这不是根本可能的 - 可能是不支持它的原因是什么?你看到任何看似合理的解决方法吗? (我试图添加一个标签:PSCredential但这个标签还不存在,我没有足够的声誉来创建它:我想添加该标签:也许社区中的某个人可以添加它。谢谢)
答案 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 需要
请记住,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