热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【技术分享】如何绕过应用程序白名单和受限的PowerShell

翻译:myswsun预估稿费:200RMB投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿0x00 前言过去几年,我一直对应用程序白名单绕过很有兴趣,并且阅读了Casey Smit

https://img.php1.cn/3cd4a/1e618/cd5/af17da15769ccb2e.jpeg

翻译:myswsun

预估稿费:200RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


0x00 前言

过去几年,我一直对应用程序白名单绕过很有兴趣,并且阅读了Casey Smith(@subtee)和Matt Graeber(@mattifestation)的成果。从他们的成果中得出的主要结论是应用程序白名单必须被锁定,以避免受信任的程序运行攻击者的代码。在Windows 7和8.1上面非常明确,Powershell是一个绕过应用程序白名单的简单方法,即通过反射PE注入,Windows10上面将会不同。随着Windows 10中AppLocker的Powershell受限语言模式的激活,这条路被堵死了。Casey Smith有大量的关于绕过应用程序白名单的其他方式的研究。我是Veris Group发布的PowerShell Empire攻击框架的忠实粉丝,并且我非常喜欢HTML应用攻击向量。正如我将在下面展示的,这种攻击在开启Powershell受限语言模式时不能起作用。但是我将思考使用先前公布的研究和代码使得这种攻击向量再次有效。本文将描述我如何做到的,尽管有大量的嵌套技术和代码。


0x01 HTA攻击

如果你没有听说过HTML应用作为一个攻击向量或者没有看过PowerShell Empire,我将快速的描述和展示它如何工作的。在开始看PowerShell Empire和创建一个Listener(在我的例子中称为test)之后,我们创建一个HTA stager,且设置Listener名字和输出文件:

http://p5.qhimg.com/t010f0460e894d22d6c.png

我们将它放在一个web服务器上面,且保证能被受害者访问。HTA文件包含如下代码:

http://p5.qhimg.com/t010bdf4b089b5eb53a.png

因为HTA文件是在浏览器沙盒之外打开的,ActiveX对象被允许执行。它将以base64加密的命令行启动PowerShell,以获取另一个更大的Empire agent stager,并在内存中执行它。受害者的浏览器看起来像下面这样:

http://p4.qhimg.com/t013cc7746798465ab0.png

接下来:

http://p5.qhimg.com/t01c99db1ef167b0588.png

在点击运行之后,回调触发,Empire在受害者机器上启动一个新的agent:

http://p6.qhimg.com/t01141e6f4c40ddbe1c.png


0x02 Applocker和PowerShell 受限语言

本文是关于即使开启了Applocker和PowerShell受限语言模式,如何通过一个HTA文件获取Empire agent。在那之前,我想强调下做坏事后果自负。如果我试图在机器上面运行一个恶意程序(Malware.exe),得到下面的提示:

http://p5.qhimg.com/t01c35bf74ad353eb3e.png

并且如果我尝试在PowerShell中使用.NET组件运行命令,也会被阻止:

http://p3.qhimg.com/t01dfdad620fbd83373.png

同样,如果我试图在使用HTA之前启动相同的攻击,也被阻止了:

http://p6.qhimg.com/t0192737a1b40c73b9b.png

由于受限语言模式,我们从PowerShell中得到了相同的错误。现在我不得不绕过它。


0x03 PowerShell without PowerShell

有一些研究是不使用powershell.exe运行PowerShell命令。这个想法是因为PowerShell.exe只是.NET集合System.Management.Automation的解释器,并且完全可以自己写解释器调用那个集合。我们面对的问题是应用程序白名单,因此我们需要启动自定义的解释器。而且这个解释器不得不运行在一些进程地址空间内。我想把它注入到一个存在的进程中,而不是它自己创建自己,且要保持和agent一起使用。在搜索之后,我发现Veris Group发布的PowerPick项目,包含了一个ReflectivePick模块(以Lee Christensen (@tifkin_)的项目为基础重建)。它是一个C++程序,编译后是一个DLL,且调用了一个来自System.Management.Automation的自定义运行空间,能允许PowerShell命令运行。

为了测试,我使用简单的命令编译了ReflectivePick DLL,以便在运行空间中执行。

http://p9.qhimg.com/t01314d610dbd79643c.png

我从白名单文件夹中使用rundll32来运行ReflectivePick DLL,结果如下:

http://p5.qhimg.com/t01aecd90899ad0f65a.png

PowerShell命令执行了,甚至更重要的是运行空间的语言模式是FullLanguage,即使AppLocker锁定powershell.exe为受限语言模式。

使用这个,我更新了参数列表,其包含上面的base64编码的Powershell Empire stager和一个解码的函数过程,因为我们不再需要使用-Encoded参数。我也将解码的命令行保存到文件中,以便调试。所有的命令行显示如下:

http://p1.qhimg.com/t0169604df653fe98d7.png

从命令行运行更新的DLL,显示解码的Empire stager的文本文件如下:

http://p6.qhimg.com/t019bf40952fc60abdb.png

和一个Empire agent已启动:

http://p5.qhimg.com/t017ba6f65175da6744.png


0x04 注入其他进程

目前为止,我们创建了一个新进程rundll32,且加载了DLL。这不是一个可行的方案,因为这个DLL不是白名单内的,而且我们还创建了一个新进程。为了避免这两个问题,我们能通过Powershell脚本Invoke-ReflectivePEInjection注入ReflectivePick DLL到其他进程。这在受限语言模式启用时当然会触发启动Powershell脚本的问题,过会我们在回到这看。Invoke-ReflectivePEInjection使用两个参数,字节数组的DLL和被注入的进程ID,因此我们先找到PID:

http://p8.qhimg.com/t012312d5f83704977a.png

然后我们将ReflectivePick DLL转化为一个字节数组,显示如下:

http://p0.qhimg.com/t016a257df32c726056.png

Invoke-ReflectivePEInjection脚本,以函数形式编写,因此我们首先要导入这个模块,确保它放在白名单目录,以避免触发受限语言模式。然后以PID和DLL为参数调用它:

http://p1.qhimg.com/t013e2ae5ab2fd2dbca.png

我们注意到Empire stager创建的调试文本文件,如下所见,我们成功让agent运行在explorer进程中:

http://p7.qhimg.com/t01c1d123b8f1bc014a.png

让我们将用于获取的PID和字节数组DLL的命令行嵌入Powershell脚本,同时我们不必导入它就能调用这个函数。添加完后的脚本如下:

http://p5.qhimg.com/t01dbdc96daa70614e2.png

然后我们无参数运行Powershell脚本:

http://p5.qhimg.com/t01597df02fc777097a.png

并且我们得到了Empire agent的回调:

http://p9.qhimg.com/t01dbb519fb92bf592d.png

我们一直面对一个问题,即ReflectivePick DLL以文件形式存在磁盘上,因此让我们将它嵌入到Powershell脚本中。将DLL字节数组base64编码,显示如下:

http://p9.qhimg.com/t011aeeb486312a83cd.png

然后把文件的内容编码拷贝到Powershell脚本中,并赋值给一个变量:

http://p8.qhimg.com/t012427a6405ae8c7f6.png

并且,代替从磁盘取得文件字节,我们将从保存base64编码的内容的变量中获得:

http://p7.qhimg.com/t01243ef08b68d50852.png

我们再一次得到了Empire agent:

http://p1.qhimg.com/t014c685c3b4592c0af.png


0x05 从InstallUtil.exe调用Powershell

原则上,我们还没有实现任何东西,因为现在我们使用Powershell将DLL加载进内存中调用Powershell,仍会被受限语言模式阻止。然而,我们已经确保Powershell在一个存在的进程中执行,而不是创建一个新的。我们需要克服调用Invoke-ReflectivePEInjection会被受限语言模式阻止的问题。为了实现这个,我们使用InstallUtil.exe来运行一个自定义的EXE,以创建一个非托管的Powershell运行空间。Casey Smith发布了一种使用InstallUtil.exe绕过AppLocker的方法和创建Powershell运行空间的PoC代码。

我修改了代码,来执行一个预定义的命令,其开始只是一些假的代码来确保能工作,显示如下:

http://p0.qhimg.com/t01063bc155c1acb56b.png

把它编译为Bypass.exe,且尝试在受害者机器上面运行它,很明显会被AppLocker阻止:

http://p1.qhimg.com/t016a7eb43dd2bebb92.png

然后我们运行InstallUtil.exe来执行卸载方法,下面是Casey Smith描述的命令行参数:

http://p2.qhimg.com/t0108f5d00afa26598b.png

从上图得知,命令执行了且自定义的Powershell运行空间不会开启受限语言模式。从这里,我们将测试命令改变为整个Invoke-ReflectivePEInjection脚本及嵌入的DLL和添加的启动命令。我们现在面临了另一个困难,Powershell以新行或分号分割命令。Invoke-ReflectivePEInjetion有很多行,但是把它嵌入到C#代码则需要的是一行。为了修改这个问题,我们将整个文件base64编码。显示如下:

http://p0.qhimg.com/t019fcdefdf40075f6b.png

将它和base64解码例程一起嵌入到EXE中:

http://p9.qhimg.com/t01a6aa10425338affa.png

我们也将解码的Powershell命令写入test5.txt文件,来确保工作正常。以新代码运行InstallUtil.exe:

http://p3.qhimg.com/t012b6f80d557ff22ce.png

Invoke-ReflectivePEInjection脚本被解码其保持了一行,Empire stager也被写入了调试文件。如下所见,Empire agent成功启动了:

http://p3.qhimg.com/t01bffa91be5ec34126.png


0x06 调用InstallUtil.exe

目前为止,我们设法将绕过Powershell的受限语言模式转化为EXE文件绕过AppLocker。虽然我们成功执行了EXE,我们还是需要一些方法来调用InstallUtil.exe并下载EXE到磁盘上。为了实现这个我们来看下regsvr32.exe,它是Casey Smith描述的另一个绕过AppLocker的方法。

Regsvr32.exe能用来只想能够包含Javascript的脚本。因此,我们开始欺骗且EXE还是在磁盘上,但是通过regsvr32.exe来运行脚本执行InstallUtil.exe。Casey Smith的PoC代码修改如下:

http://p6.qhimg.com/t0102875176216ace5a.png

运行如下:

http://p7.qhimg.com/t01bcf4ed8dc8874bcb.png

能得到一个Empire agent回调:

http://p3.qhimg.com/t0155e4b329af2b29e5.png

现在你可能知道为什么我使用regsvr32.exe来启动InstallUtil.exe,因为我事实上没有得到任何东西。但是关键点是regsvr32.exe也能用来下载EXE到磁盘上,而且脚本文件也存储在一个web服务器上,显示如下:

http://p6.qhimg.com/t01e2db27820f05bd21.png


0x07 下载文件

为了通过regsvr32.exe测试下载,我base64编码了一个假的文本:

http://p5.qhimg.com/t013329c25af899de28.png

然后我们使用Casey Smith发现的另一个滥用certutil.exe来解码并写磁盘文件方法。Base64编码的文本放置在BEGIN CERTIFICATE和END CERTIFICATE标记中,来给certutil.exe提供正确的格式。然后我们将base64编码的文本写入一个文件,且使用certutil.exe解码它:

http://p1.qhimg.com/t018dc8634e5c9c42a1.png

像下面这样执行它:

http://p2.qhimg.com/t01a0f5185bab547b4e.png

文件内容被解码成功。现在是时候做点微调,代替嵌入EXE给InstallUtil.exe。因此,我们在另一台电脑上使用certutil编码它:

http://p9.qhimg.com/t01f534ec16f7a35098.png

为了允许base64编码内容多行显示,我们在每行的末尾添加一个反斜杠:

http://p9.qhimg.com/t0129ca875803888f6b.png

测试结果是我们不能嵌入编码的EXE到一个脚本中。因此我不得不将它分割为4部分。每个携带一些base64代码且将它写入一个文件:

http://p1.qhimg.com/t0100f8c9bf0ecb831f.png

执行后,写入的文件显示如下:

http://p0.qhimg.com/t01f7fa7c8390e23974.png

然后,我创建第5个脚本,将磁盘上的4个文件组合为一个文本文件,并调用certutil.exe解码它,将EXE写入磁盘:

http://p0.qhimg.com/t018e8c0b79409b1222.png

运行所有的脚本:

http://p4.qhimg.com/t019e0f8027c90020d6.png

有Empire agent回调:

http://p9.qhimg.com/t01f11bf6c36031ae49.png

为了压缩这个,我将4个脚本片段的调用嵌入到主脚本中:

http://p8.qhimg.com/t016224abeae3691c27.png

再次运行,得到一个Empire agent回调:

http://p0.qhimg.com/t01097595d5d6124089.png


0x08 回到HTA

现在我们有了一个单独的命令,我们能调用后创建我们的Empire agent。为了启动它,我们能嵌入这个命令到HTA文件中,就像AppLocker不存在一样:

http://p2.qhimg.com/t01cf54c2d66b28e75b.png

在调用邮件中放入这个文件的链接,最终在用户的浏览器中调用:

http://p0.qhimg.com/t014f6e2fafb9329bce.png

运行后,能得到我们期望的Empire agent,尽管AppLocker和Powershell受限语言模式都开启了:

https://img.php1.cn/3cd4a/1eebe/cd5/43a754c811e7ec5c.webp


0x09 总结

总结下这个方法,有web服务器提供一个HTA,其调用Regsvr32.exe来只想执行5个脚本,脚本用来下载base64编码的EXE,解码并写入磁盘。然后执行InstallUtil.exe绕过AppLocker,继而执行EXE的卸载方法。EXE包含了base64编码的Powershell脚本,其被解码并在EXE创建的一个自定义的Powershell运行空间中只执行。Powershell脚本包含一个base64编码的DLL,其被解码且反射加载进explorer进程。反射加载的DLL包含一个base64编码的Powershell脚本,其被解码且在explorer进程中创建的自定义的Powershell运行空间中执行。Powershell脚本是Powershell Empire agent的普通的stager。

对于这种攻击能生效,下面的二进制文件需要被AppLocker标记为白名单:

mshta.exe

regsvr32.exe

certutil.exe

installutil.exe

四个都需要在白名单中,如果使用默认AppLocker规则或所有微软签名的二进制文件是受信任的,它们将是白名单。虽然这种攻击确实能绕过AppLocker和Powershell受限语言模式,并且在另外的AMSI中,将不能绕过ScriptBlock日志记录,因此检测是可能的,如下所见:

https://img.php1.cn/3cd4a/1eebe/cd5/bdd1ca32a69bc8b2.webp

我想感谢Casey Smith,Lee Christensen和本文所参考的其他人的成果。独立的代码部分能在github找到。


推荐阅读
  • 本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ... [详细]
  • 在Windows系统中安装TensorFlow GPU版的详细指南与常见问题解决
    在Windows系统中安装TensorFlow GPU版是许多深度学习初学者面临的挑战。本文详细介绍了安装过程中的每一个步骤,并针对常见的问题提供了有效的解决方案。通过本文的指导,读者可以顺利地完成安装并避免常见的陷阱。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 本文详细介绍了如何在Java Web服务器上部署音视频服务,并提供了完整的验证流程。以AnyChat为例,这是一款跨平台的音视频解决方案,广泛应用于需要实时音视频交互的项目中。通过具体的部署步骤和测试方法,确保了音视频服务的稳定性和可靠性。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • MicrosoftDeploymentToolkit2010部署培训实验手册V1.0目录实验环境说明3实验环境虚拟机使用信息3注意:4实验手册正文说 ... [详细]
  • 解决MySQL远程访问故障
    同事反馈无法访问我安装的MySQL数据库。经过排查,发现是在Windows服务器上安装MySQL后未开启远程访问权限。本文将详细介绍如何解决这一问题。 ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • SecureCRT是一款功能强大的终端仿真软件,支持SSH1和SSH2协议,适用于在Windows环境下高效连接和管理Linux服务器。该工具不仅提供了稳定的连接性能,还具备丰富的配置选项,能够满足不同用户的需求。通过SecureCRT,用户可以轻松实现对远程Linux系统的安全访问和操作。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • GET和POST有什么区别?及为什么网上的多数答案都是错的。
    如果有人问你,GET和POST,有什么 ... [详细]
  • python发送邮件(带附件)、发送给多人、抄送给多人的示例#!usrbinenvpython #-*-encoding:utf-8-*-imports ... [详细]
author-avatar
寒灵
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有