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

本文探讨了当通过__PSLockDownPolicy环境变量错误启用PowerShell约束语言模式时,如何利用文件路径命名约定绕过限制,实现在完全语言模式下执行脚本的方法,并提供了实际测试步骤和代码示例。

约束语言模式绕过当使用__PSLockDownPolicy时

PowerShell的约束语言(CLM)模式限制了用户可用的功能,以减少攻击面。它旨在与应用程序控制解决方案(如设备保护用户模式代码完整性)结合使用。如果在没有适当应用程序控制设置的情况下启用CLM,它并不是一个有效的安全解决方案。

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

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

具有管理员权限的恶意用户可以简单地移除环境变量,但对于没有管理员权限的用户呢?在上述引用的最后,有一个非常引人入胜的陈述:

此外,还有一些文件命名约定可以在脚本上启用完全语言模式,从而有效绕过约束语言。

有文件命名约定可以启用完全语言模式?请详细说明——好奇的头脑想知道!

我正在准备一个关于“PowerShell For InfoSec”的16小时课程,其中将涵盖此主题,但如果不实际知道如何操作,我不太放心做出这样的陈述。因此,我尽力使用谷歌搜索来寻找神奇的文件命名约定,但没有成功。最终,我下定决心,实际查看了PowerShell源代码,现在与大家分享这个魔法。

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

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

现在,我们将使用这个超级简单的脚本来打印出当前的语言模式。

1
$ExecutionContext.SessionState.LanguageMode

首先从不包含“System32”的路径运行脚本,然后再从包含“System32”的路径运行。

就是这样;在这种情况下,即使没有管理员访问权限,我们也可以轻松地在完全语言模式下运行任何脚本。

下次在渗透测试中遇到CLM时,请记住这个技巧,以帮助确保组织已正确实施它。

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

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计