绕过使用 __PSLockDownPolicy 时的约束语言模式限制
绕过使用__PSLockDownPolicy 时的约束语言模式限制
Carrie Roberts //
PowerShell 的约束语言模式(CLM)通过限制用户可用功能来减少攻击面。它本应与应用程序控制解决方案(如设备保护用户模式代码完整性)结合使用。如果未正确配置应用程序控制设置就启用 CLM,则无法提供有效的安全防护。
一种错误的 CLM 启用方法是使用__PSLockDownPolicy
环境变量。微软对此有以下说明:
作为约束语言实现的一部分,PowerShell 包含了一个用于调试和单元测试的环境变量
__PSLockDownPolicy
。虽然我们从未正式记录此变量,但有些人发现并将其描述为一种强制执行机制。这是不明智的,因为攻击者可以轻易更改环境变量以移除这种强制措施。此外,还存在一些文件命名约定,可以使脚本在完全语言模式下运行,从而有效绕过约束语言模式。
具有管理员权限的恶意用户可以轻松移除该环境变量,但对于没有管理员权限的用户呢?在上述引文的结尾,有一个非常引人关注的陈述:
此外,还存在一些文件命名约定,可以使脚本在完全语言模式下运行,从而有效绕过约束语言模式。
存在启用完全语言模式的文件命名约定?请务必详细说明——求知者渴望了解!
我正在准备一个为期 16 小时的“PowerShell 在信息安全中的应用”课程,其中将涵盖此主题。在没有实际掌握操作方法的情况下,我不愿轻易做出此类声明。因此,我全力使用谷歌搜索,试图找到这种神奇的文件命名约定,但未能成功。最终,我下定决心直接查看了 PowerShell 的源代码,现在与大家分享这一秘诀。
答案就在这里。我们只需要在希望以完全语言模式运行的 PowerShell 脚本路径中包含“System32”即可。让我们来测试一下。首先,在管理员权限的 PowerShell 提示符下,使用环境变量(即“错误的方式”)启用 CLM。
现在,我们将使用一个非常简单的脚本来打印当前的语言模式。
首先从一个不包含“System32”的路径运行该脚本,然后再从一个包含此字符串的路径运行。
结果显而易见:在这种情况下,即使没有管理员访问权限,我们也可以轻松地以完全语言模式运行任何脚本。
下次在渗透测试中遇到 CLM 时,请记住这个技巧,以帮助确认组织是否正确实施了该机制。
如果您有兴趣了解更多关于 PowerShell 的主题,如“Just Enough Admin”、PowerShell 远程处理、语言模式等,请在此处查看我 16 小时的课程“PowerShell For InfoSec”。
您可以从 Carrie 的课程中学到更多!在此查看:攻击模拟工具:Atomic Red Team、CALDERA 等 PowerShell 在信息安全中的应用提供实时/虚拟和点播课程!更多精彩内容 请关注我的个人公众号 公众号(办公 AI 智能小助手)公众号二维码

评论