约束语言模式绕过当使用__PSLockDownPolicy时
PowerShell的约束语言(CLM)模式限制了用户可用的功能,以减少攻击面。它旨在与应用程序控制解决方案(如设备保护用户模式代码完整性)结合使用。如果在没有适当应用程序控制设置的情况下启用CLM,它并不是一个有效的安全解决方案。
一种错误启用CLM的方法是使用__PSLockDownPolicy环境变量。以下是微软对此的说明:
作为约束语言实现的一部分,PowerShell包含了一个用于调试和单元测试的环境变量,称为
__PSLockDownPolicy。虽然我们从未记录过这一点,但有些人发现了它,并将其描述为一种强制执行机制。这是不明智的,因为攻击者可以轻松更改环境变量以移除此强制执行。此外,还有一些文件命名约定可以在脚本上启用完全语言模式,从而有效绕过约束语言。
具有管理员权限的恶意用户可以简单地移除环境变量,但对于没有管理员权限的用户呢?在上述引用的最后,有一个非常引人入胜的陈述:
此外,还有一些文件命名约定可以在脚本上启用完全语言模式,从而有效绕过约束语言。
有文件命名约定可以启用完全语言模式?请详细说明——好奇的头脑想知道!
我正在准备一个关于“PowerShell For InfoSec”的16小时课程,其中将涵盖此主题,但如果不实际知道如何操作,我不太放心做出这样的陈述。因此,我尽力使用谷歌搜索来寻找神奇的文件命名约定,但没有成功。最终,我下定决心,实际查看了PowerShell源代码,现在与大家分享这个魔法。
我们只需要在我们希望在完全语言模式下运行的PowerShell脚本的路径中包含“System32”,它就会实现。让我们来测试一下。首先,从管理员PowerShell提示符中,使用环境变量(即“错误的方式”)启用CLM。
|
|
现在,我们将使用这个超级简单的脚本来打印出当前的语言模式。
|
|
首先从不包含“System32”的路径运行脚本,然后再从包含“System32”的路径运行。
就是这样;在这种情况下,即使没有管理员访问权限,我们也可以轻松地在完全语言模式下运行任何脚本。
下次在渗透测试中遇到CLM时,请记住这个技巧,以帮助确保组织已正确实施它。
如果您有兴趣了解更多关于PowerShell主题,如“Just Enough Admin”、PowerShell远程处理、语言模式等,请在此处查看我的16小时课程“PowerShell For InfoSec”。