写点什么

当使用 __PSLockDownPolicy 时绕过 PowerShell 约束语言模式的技术分析

作者:qife
  • 2025-07-18
    福建
  • 本文字数:871 字

    阅读完需:约 3 分钟

当使用__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"的路径下执行:显示约束语言模式

  • 包含"System32"的路径下执行:切换为完全语言模式

攻防意义

渗透测试中遇到 CLM 时,可尝试此技巧验证目标是否采用了错误配置方案。该发现也提醒蓝队必须配合应用控制策略正确实施 CLM。


如需深入学习 Just Enough Admin、PowerShell 远程处理、语言模式等主题,可参考作者 16 小时的"PowerShell 信息安全"课程。更多精彩内容 请关注我的个人公众号 公众号(办公 AI 智能小助手)公众号二维码


办公AI智能小助手


用户头像

qife

关注

还未添加个人签名 2021-05-19 加入

还未添加个人简介

评论

发布
暂无评论
当使用__PSLockDownPolicy时绕过PowerShell约束语言模式的技术分析_PowerShell_qife_InfoQ写作社区