利用PowerShell诊断脚本执行命令并绕过AppLocker
字数 1335 2025-08-29 08:32:10

利用PowerShell诊断脚本绕过AppLocker的技术分析

概述

本文详细分析如何利用Windows系统内置的诊断脚本(CL_Invocation.ps1CL_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的技术实现

准备工作

  1. 准备一个简单的C#程序集(以.NET 2.0为目标框架),例如funrun.exe,其功能是通过proc.start()运行calc.exe

  2. 在启用默认AppLocker规则的Windows系统上测试:

    • 直接运行funrun.exe会被阻止
    • 在PowerShell v5中运行也会被阻止

绕过步骤

  1. 调用PowerShell版本2(必须已启用):

    powershell -v 2 -ep bypass
    
  2. 导航到诊断脚本目录:

    cd C:\windows\diagnostics\system\AERO
    
  3. 导入模块:

    import-module .\CL_LoadAssembly.ps1
    
  4. 通过路径遍历加载程序集:

    LoadAssemblyFromPath ..\..\..\..\temp\funrun.exe
    
  5. 调用程序集方法:

    [funrun.hashtag]::winning()
    

技术原理

  1. 数字签名信任:这些脚本具有微软的数字签名,被系统视为可信

  2. 路径遍历:利用相对路径访问系统目录外的程序集文件

  3. PowerShell版本差异:PowerShell v2的安全限制较少,可以绕过约束语言模式

  4. 程序集加载:通过.NET程序集加载机制绕过AppLocker对可执行文件的直接限制

防御措施

  1. 禁用PowerShell v2(如果不需要)

    Disable-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2
    
  2. 限制对%systemroot%\diagnostics\system\目录的访问

  3. 监控PowerShell v2的使用情况

  4. 实施更严格的AppLocker规则,包括对.NET程序集加载的限制

  5. 启用PowerShell脚本块日志记录和约束语言模式

替代方法

如果上述方法不可行,可以参考"Ultimate AppLocker Bypass List"中列出的其他绕过技术,包括但不限于:

  • 使用InstallUtil
  • 使用Regsvr32
  • 使用Mshta
  • 使用Cscript/Wscript

结论

利用系统内置的信任组件是绕过安全限制的有效方法。安全团队应全面了解系统内置工具的功能,并实施纵深防御策略来应对此类技术。定期审计系统上的脚本和二进制文件,限制不必要的功能,并监控异常活动是防御此类攻击的关键。

利用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 执行二进制文件 使用方法 : 限制 : 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版本差异 :PowerShell v2的安全限制较少,可以绕过约束语言模式 程序集加载 :通过.NET程序集加载机制绕过AppLocker对可执行文件的直接限制 防御措施 禁用PowerShell v2(如果不需要) 限制对 %systemroot%\diagnostics\system\ 目录的访问 监控PowerShell v2的使用情况 实施更严格的AppLocker规则,包括对.NET程序集加载的限制 启用PowerShell脚本块日志记录和约束语言模式 替代方法 如果上述方法不可行,可以参考"Ultimate AppLocker Bypass List"中列出的其他绕过技术,包括但不限于: 使用InstallUtil 使用Regsvr32 使用Mshta 使用Cscript/Wscript 结论 利用系统内置的信任组件是绕过安全限制的有效方法。安全团队应全面了解系统内置工具的功能,并实施纵深防御策略来应对此类技术。定期审计系统上的脚本和二进制文件,限制不必要的功能,并监控异常活动是防御此类攻击的关键。