是否可以以某种方式将 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来避免让用户登录但仍然有令牌?