绕过使用__PSLockDownPolicy时的约束语言模式限制

绕过使用__PSLockDownPolicy时的约束语言模式限制

Carrie Roberts //

PowerShell的约束语言模式(CLM)通过限制用户可用功能来减少攻击面。它本应与应用程序控制解决方案(如设备保护用户模式代码完整性)结合使用。如果未正确配置应用程序控制设置就启用CLM,则无法提供有效的安全防护。

一种错误的CLM启用方法是使用__PSLockDownPolicy环境变量。微软对此有以下说明:

作为约束语言实现的一部分,PowerShell包含了一个用于调试和单元测试的环境变量__PSLockDownPolicy。虽然我们从未正式记录此变量,但有些人发现并将其描述为一种强制执行机制。这是不明智的,因为攻击者可以轻易更改环境变量以移除这种强制措施。此外,还存在一些文件命名约定,可以使脚本在完全语言模式下运行,从而有效绕过约束语言模式。

具有管理员权限的恶意用户可以轻松移除该环境变量,但对于没有管理员权限的用户呢?在上述引文的结尾,有一个非常引人关注的陈述:

此外,还存在一些文件命名约定,可以使脚本在完全语言模式下运行,从而有效绕过约束语言模式。

存在启用完全语言模式的文件命名约定?请务必详细说明——求知者渴望了解!

我正在准备一个为期16小时的“PowerShell在信息安全中的应用”课程,其中将涵盖此主题。在没有实际掌握操作方法的情况下,我不愿轻易做出此类声明。因此,我全力使用谷歌搜索,试图找到这种神奇的文件命名约定,但未能成功。最终,我下定决心直接查看了PowerShell的源代码,现在与大家分享这一秘诀。

答案就在这里。我们只需要在希望以完全语言模式运行的PowerShell脚本路径中包含“System32”即可。让我们来测试一下。首先,在管理员权限的PowerShell提示符下,使用环境变量(即“错误的方式”)启用CLM。

[Environment]::SetEnvironmentVariable('__PSLockdownPolicy', '4', 'Machine')

现在,我们将使用一个非常简单的脚本来打印当前的语言模式。

$ExecutionContext.SessionState.LanguageMode

首先从一个不包含“System32”的路径运行该脚本,然后再从一个包含此字符串的路径运行。

结果显而易见:在这种情况下,即使没有管理员访问权限,我们也可以轻松地以完全语言模式运行任何脚本。

下次在渗透测试中遇到CLM时,请记住这个技巧,以帮助确认组织是否正确实施了该机制。

如果您有兴趣了解更多关于PowerShell的主题,如“Just Enough Admin”、PowerShell远程处理、语言模式等,请在此处查看我16小时的课程“PowerShell For InfoSec”。


您可以从Carrie的课程中学到更多!
在此查看:
攻击模拟工具:Atomic Red Team、CALDERA等
PowerShell在信息安全中的应用
提供实时/虚拟和点播课程!
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码

posted @ 2025-08-30 19:11  qife  阅读(2)  评论(0)    收藏  举报