导语:使用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旁路程序集加载 – https://pentestlab.blog/tag/assembly-load/
· C#到Windows Meterpreter 10分钟 – https://holdmybeersecurity.com/2016/09/11/c-to-windows-meterpreter-in-10mins/