导语:使用PowerShell诊断脚本执行命令并绕过AppLocker

介绍

上周,我在Windows操作系统上寻找有趣的脚本和二进制文件,这些文件可能对未来的渗透测试和红色团队的工作有用。随着企业安全意识越来越高,使用各种防护设备(例如AppLocker, Device Guard, AMSI, Powershell ScriptBlock Logging, PowerShell Constraint Language Mode, User Mode Code Integrity, HIDS/anti-virus,SOC等)的增加,我们需要规避/绕过这些防护方案已成为渗透测试时必不可少的部分。

在狩猎时,我遇到了一个有趣的目录结构,其中包含位于以下路径的诊断脚本:

%systemroot%\diagnostics\system\

特别是,AERO、Audio这两个子目录包含两个签名的PowerShell脚本:

CL_Invocation.ps1
CL_LoadAssembly.ps1
CL_Invocation.ps1提供了一个通过System.Diagnostics.Process执行二进制文件的函数(SyncInvoke)。而CL_LoadAssembly.ps1提供了两个用于加载.NET / C#程序集(DLL / EXE)的函数(LoadAssemblyFromNS和LoadAssemblyFromPath)。

分析CL_Invocation.ps1

在调查这个脚本时,很明显执行命令会非常简单,如下面的截图所示:

导入模块并使用SyncInvoke非常简单,命令执行通过以下方式成功实现:

CL_Invocation.ps1 (or import-module CL_Invocation.ps1)
SyncInvoke <command> <arg...>

然而,进一步的研究表明,这种技术没有绕过任何保护,随后的测试工作。PowerShell有约束语言模式(在PSv5中)阻止某些PowerShell代码/脚本的执行,并且默认AppLocker策略阻止在未授权帐户的上下文中执行未签名的二进制文件。尽管如此,CL_Invocation.ps1在可信赖的执行链中可能具有优点,并且在与其他技术结合时可以逃避防御者分析。

分析CL_LoadAssembly.ps1

当调查CL_LoadAssembly,我发现了由@netbiosX写的(AppLocker Bypass – Assembly Load)使用的技术是@subTee在SchmooCon 2015年会议发表的技术。另外,@subTee在几年前发布的Tweet中提到了CL_LoadAssembly的旁路技术。

为了测试这个方法,我在C#(Target Framework:.NET 2.0)中编译了一个非常基本的程序(程序集),我调用funrun.exe,如果(成功)执行,它通过proc.start()运行calc.exe:

在非特权用户环境下,使用具有默认AppLocker规则的Windows 2016计算机,用户试图直接执行funrun.exe。在cmd行和PowerShell(v5)上调用时,策略阻止了这一点,如以下屏幕截图所示:

在PowerShell版本2下运行时,Funrun.exe也被策略阻止:

使用CL_LoadAssembly,用户通过对funrun.exe的路径遍历调用成功加载程序集。但是,约束语言模式阻止用户在PowerShell(v5)中调用方法,如以下屏幕截图所示:

要跳过约束语言模式,用户调用PowerShell v2并成功加载程序集,并将路径遍历调用到funrun.exe:

用户调用funrun程序集方法并生成calc.exe:

成功!作为一个非特权用户,我们证明了我们可以通过调用的PowerShell版本2绕过约束语言模式(注意:这必须启用),并绕过AppLocker的通过CL_LoadAssembly.ps1加载的程序集

powershell -v 2 -ep bypass cd C:\windows\diagnostics\system\AERO import-module .\CL_LoadAssembly.ps1 LoadAssemblyFromPath ..\..\..\..\temp\funrun.exe [funrun.hashtag]::winning()

AppLocker绕过资源

有关AppLocker绕过技术的更多信息,我强烈建议查看由Oddvar Moe(@Oddvarmoe)创建和维护的Ultimate AppLocker绕过列表。而且,这些资源在这篇文章时非常有帮助:

· AppLocker旁路程序集加载 – https://pentestlab.blog/tag/assembly-load/

· C#到Windows Meterpreter 10分钟 – https://holdmybeersecurity.com/2016/09/11/c-to-windows-meterpreter-in-10mins/

源链接

Hacking more

...