原文:https://bohops.com/2018/01/07/executing-commands-and-bypassing-applocker-with-powershell-diagnostic-scripts/

概述


从上周开始,我就着手在Windows操作系统中寻找可能对未来的渗透测试和红队作战有用的脚本和二进制文件。因为随着客户端在安全性能、安全意识和监控技术(例如AppLocker、Device Guard、AMSI、Powershell ScriptBlock日志记录、PowerShell约束语言模式、用户模式代码完整性、HIDS/防病毒,SOC等)方面日益提高,寻找欺骗、规避和/或绕过安全解决方案的方法已成为道德黑客工作中的重要一环。

在这个过程中,我发现了一个有趣的目录结构,其中包含一些诊断脚本。准确来说,这些脚本位于如下所示的“父”路径中:

%systemroot%\diagnostics\system\

需要特别说明的是,其中\AERO和\Audio这两个子目录中含有两个非常有趣的PowerShell脚本(带有安全签名):

其中,CL_Invocation.ps1提供了一个SyncInvoke函数,可以通过System.Diagnostics.Process执行二进制文件;而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在可信赖的执行链中还是有些价值的,并且如果与其他技术结合的话,则可以避开某些防御措施。

**非常感谢@Oddvarmoe和@xenosCR在CL_Invocation方面提供的帮助和分析

深入考察CL_LoadAssembly.ps1


在研究CL_LoadAssembly时,我通过@netbiosX发现了一篇非常有趣的文章(Applocker Bypass-Assembly Load),详细介绍了Casey Smith(@subTee)在SchmooCon 2015演讲期间提供的研究结果。他成功地发现了一种绕过AppLocker的方法:通过URL、文件位置和字节码在PowerShell中加载程序集。另外,@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(注意:必须已经启用),然后利用CL_LoadAssembly.ps1加载程序集来绕过AppLocker,从而绕过约束语言模式。为了完整起见,这里给出相应的命令序列:

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 Bypass List。而且,这些资源在编写这篇文章时帮助极大:

AppLocker Bypass-Assembly Load——https://pentestlab.blog/tag/assembly-load/
C# to Windows Meterpreter in 10 min – https://holdmybeersecurity.com/2016/09/11/c-to-windows-meterpreter-in-10mins/

小结


本文中,我们为读者介绍了一种利用PowerShell诊断脚本执行命令并绕过AppLocke的方法,可供大家在渗透测试过程中借鉴使用。如果您有疑问/评论,欢迎随时与我联系或留言。祝阅读愉快!

源链接

Hacking more

...