GhostContainer后门:针对亚洲高价值组织Exchange服务器的恶意软件分析

本文详细分析了GhostContainer后门,一种针对Microsoft Exchange服务器的高度定制化恶意软件,利用开源项目构建,具备动态扩展功能、C2命令解析、虚拟页面注入和Web代理能力,主要攻击亚洲政府机构和高科技公司。

GhostContainer后门:恶意软件入侵亚洲高价值组织的Exchange服务器

在最近的一起事件响应(IR)案例中,我们发现了高度定制化的恶意软件,针对政府环境中的Exchange基础设施。对检测日志和样本内线索的分析表明,Exchange服务器很可能通过已知的N-day漏洞被入侵。我们对恶意软件的深入分析揭示了一个复杂的、多功能的backdoor,可以通过下载额外模块动态扩展任意功能。我们将其命名为GhostContainer,但它也被称为NightEagle(APT-Q-95)。

值得注意的是,攻击者利用了几个开源项目来构建这个backdoor。一旦加载,backdoor授予攻击者对Exchange服务器的完全控制权,允许他们执行一系列恶意活动。为了逃避安全产品的检测,恶意软件采用各种规避技术,并伪装成常见服务器组件以融入正常操作。此外,它可以作为代理或隧道运行,可能将内部网络暴露给外部威胁,或促进从内部设备窃取敏感数据。我们的遥测数据表明,这种恶意软件可能是针对亚洲高价值组织(包括高科技公司)的APT活动的一部分。我们的团队目前正在调查这些攻击活动的范围和程度,以更好地了解威胁格局。

GhostContainer: the backdoor

  • MD5: 01d98380dfb9211251c75c87ddb3c79c
  • SHA1: 2bb0a91c93034f671696da64a2cf6191a60a79c5
  • SHA256: 87a3aefb5cdf714882eb02051916371fbf04af2eb7a5ddeae4b6b441b2168e36
  • Link time: 1970-01-01 12:00 AM UTC
  • File type: PE32 executable (EXE) (CLI) Intel 80386, for MS Windows Mono/.Net assemblys
  • File size: 32.8 KB
  • File name: App_Web_Container_1.dll

该文件名称为App_Web_Container_1.dll。如文件名所示,它充当“容器”。它包含三个关键类(Stub、App_Web_843e75cf5b63和App_Web_8c9b251fb5b3)和一个实用类(StrUtils)。一旦文件被Exchange服务加载,Stub类首先执行。它充当C2命令解析器,能够执行shellcode、下载文件、运行命令和加载额外的.NET字节码。最显著的功能之一是它创建了App_Web_843e75cf5b63的实例,通过虚拟页面注入器作为web代理类(App_Web_8c9b251fb5b3)的加载器。

Stub: C2解析器和分发器

在执行开始时,Stub类尝试绕过AMSI(反恶意软件扫描接口)和Windows事件日志。这是通过覆盖amsi.dll和ntdll.dll中的特定地址来实现的,从而逃避AMSI扫描和Windows事件记录。

接下来,它从ASP.NET配置中检索机器密钥,特别是验证密钥,并将其转换为字节数组。用于生成验证密钥的代码直接从开源项目machinekeyfinder-aspx复制。验证密钥然后使用SHA-256进行哈希处理,确保其长度为32字节,生成的字节数组用于AES加密和解密(以保护攻击者和Exchange服务器之间传输的数据)。

恶意软件的主要功能是接收来自攻击者的请求并按以下方式解析:

  • 从攻击者的请求数据中获取x-owa-urlpostdata的值,然后将其解码为Base64。
  • 使用上述生成的AES密钥对解码后的数据执行AES解密。解码数据的前16字节用作初始化向量(IV)。
  • 解压缩解密后的数据,并根据命令ID(第一个字节)分派操作。

为了执行命令,Stub检查当前用户是否为系统账户。如果不是,它尝试通过利用存储在应用程序域数据存储中的令牌来模拟用户。这允许应用程序以不同身份执行操作。

C2命令和功能

命令ID 描述
0 获取架构类型(例如x86或x64)
1 将接收的数据作为shellcode运行
2 执行命令行
3 在子线程中加载.NET字节码
4 发送GET请求
5 下载并保存文件
6 将提供的原始数据保存到文件
7 删除文件
8 读取文件内容
9 执行.NET程序并输出
10 调用虚拟页面注入器(创建App_Web_843e75cf5b63类的实例)
11 迭代并删除定义文件夹及其子目录中包含App_Global的文件
14 并发执行HTTP POST请求到多个URL

每次执行命令时,会生成一个XML格式的响应,包含执行结果或返回值。XML中的value元素以硬编码字符串/wEPDwUKLTcyODc4开头,相同的字符串在另一个开源项目ExchangeCmdPy.py中用于利用Exchange漏洞CVE-2020-0688。

1
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTcyODc4[BASE64_ENCODED_RESULT]" />

通过进一步比较GhostContainer与ExchangeCmdPy.py开源项目的代码,我们观察到它们的入口函数结构和关键字字符串高度相似。这使我们推测Stub类的代码是基于开源项目开发的。我们怀疑Exchange攻击中利用的漏洞可能与CVE-2020-0688相关。

App_Web_843e75cf5b63: 虚拟页面注入器

该类基于另一个开源项目PageLoad_ghostfile.aspx,旨在使用VirtualProvider等类创建幽灵页面。它包含几个继承自多个系统类的类,负责创建虚拟ASPX页面并覆盖其某些方法。它将使用两个提供的参数创建虚拟页面:fakePageName和fakePath。这种方法的目的是运行.NET反射加载器(假页面——参见附录II)并绕过文件检查。加载器作为Base64编码的.aspx源代码硬编码到程序中。

这个假页面用于定位当前域中的web代理类App_Web_8c9b251fb5b3并执行其静态方法AppWebInit。一旦创建,攻击者开始向其发送请求,这些请求随后将被App_Web_8c9b251fb5b3接收和解析。

App_Web_8c9b251fb5b3: web代理

App_Web_8c9b251fb5b3是GhostContainer样本中的一个核心组件,通常通过假页面(App_Web_843e75cf5b63)间接加载。该类包括web代理、socket转发和隐蔽通信功能,是结合web代理和隧道模块的典型示例。

当创建该类的实例时,静态值utcDate用当前日期和时间初始化。为了识别当前版本的类,假页面选择并调用具有最大utcDate值的那个。

该类中只有两个函数。AppWebInit()函数作为模块的实际入口点,通过假.aspx页面中的反射动态调用。在函数StrTr中,它在解码Base64编码字符串之前实现自定义字符串转换机制。

再次,我们将此算法链接到开源项目,这次是Neo-reGeorg。函数名称StrTr及其代码完全相同。通过比较代码,很明显这个类是Neo-reGeorg的高度定制版本。

模块的主要行为集中在解析攻击者发送到假网页的请求。当接收到请求时,它首先检查头部。其进一步行为可能因识别的头部而异:

  • Qprtfva头部:标识代理转发请求。
  • Dzvvlnwkccf头部:标识socket通信请求。
  • 其他情况,恶意软件将响应字符串""。

如果头部是Qprtfva,恶意软件通过完成以下步骤建立web代理:

  • 解码Base64编码字符串以获取目标URL。
  • 克隆原始请求内容(除Qprtfva外的头部和正文)。
  • 将请求转发到解码的目标地址。
  • 将目标响应内容作为本地响应返回。

如果头部是Dzvvlnwkccf,恶意软件在互联网和内部网络之间建立或管理长寿命的TCP隧道连接。为了同时识别和维护不同的socket对象,它为每个socket对象定义一个名称,然后将该名称与socket对象成对保存在全局存储中。socket的名称包含在头部Dzvvlnwkccf值的前22字节中。确切的活动包含在请求的命令部分,从字节23开始。模块接受以下socket通信命令。

命令 描述
1iGBIM1C5PmawX_1McmR7StamYn23jpfQoENPlm19cH42kceYkm8ch4x2 从加密头部提取IP和端口,尝试连接,并保存socket。
vfhafFQZ4moDAvJjEjplaeySyMA 关闭socket并从全局存储中移除。
M4LubGO0xaktF_YgZpsiH3v1cJ4dloAPOZKdG8AK4UxM 将HTTP请求正文内容转换为socket数据并发送到内部主机。
NYIJVBf2PXRn7_BWxFyuheu1O0TuE9B0FtF0O 从内部网络接收数据,编码后作为HTTP响应正文发送回攻击者。

StrUtils: 字符串和XML格式处理类

StrUtils看起来像是一个实用类,用于拆分和修剪字符串,以及拆分、提取和取消转义XML元素。然而,只有少数函数被其他三个类引用,即负责以下功能的函数:

  • 将接收的数据拆分为多个部分
  • 修剪文件路径的关闭字符

我们在任何类中都没有找到对XML取消转义函数的引用。

基础设施

GhostContainer后门不建立与任何C2基础设施的连接。相反,攻击者从外部连接到受感染的服务器,其控制命令隐藏在正常的Exchange web请求中。因此,我们尚未识别出任何相关的IP地址或域。

受害者

到目前为止,我们已经确定了该活动的两个目标:一个关键政府机构和一个高科技公司。两个组织都位于亚洲地区。

归因

此APT攻击中使用的样本与任何已知恶意软件没有结构相似性。它合并了多个开源项目的代码,这些项目公开可访问,可能被全球黑客或APT组织利用。因此,基于代码相似性的归因不可靠。根据我们的遥测,攻击无法与其他攻击活动关联,因为攻击者没有暴露任何基础设施。

结论

基于所有进行的分析,很明显攻击者非常擅长利用Exchange系统,并利用各种与渗透IIS和Exchange系统相关的开源项目。他们对Exchange web服务的运作方式有深入的理解,并在组装和扩展公开可用代码以创建和增强复杂间谍工具方面表现出卓越的专业知识。我们认为这是一个成熟且高度专业的团队。我们继续跟踪他们的活动。

入侵指标

01d98380dfb9211251c75c87ddb3c79c       App_Web_Container_1.dll

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计