Remco Sprooten

REF2924:如何作为(高级?)威胁维持持久性

Elastic 安全实验室介绍了 SIESTAGRAPH、NAPLISTENER 和 SOMNIRECORD 背后的组织使用的新持久性技术。

9 分钟阅读攻击模式
REF2924: how to maintain persistence as an (advanced?) threat

前言

最近几个月,在 REF2924 下跟踪的事件性质发生了明显的变化。最初,攻击者使用自定义的、专门构建的恶意软件。随着攻击的演变,我们观察到同一组织开始使用开源工具或公开可用的源代码作为开发新功能的基础。

主要发现

  • 攻击者已从使用自定义恶意软件转变为使用开源工具或公开可用的源代码来开发新功能。

    • 攻击者还在受害者的环境中部署了 TFirewall 和 AdFind 等开源工具。
    • 为了维持持久性,攻击者部署了多种不同的工具和技术。

.NET Webshell

2023 年 2 月 16 日,Elastic 安全实验室观察到 Microsoft .NET 编译器 ( csc.exe ) 被用于编译 DLL 文件。 Elastic Defend 将输出识别为恶意文件。可能观察到 .NET Web Shell 的动态运行时编译的分析师应注意,这是由操作员执行的,而不是由系统自动执行的。

生成的输出文件名为 App_Web_lgntop.aspx.ec688436.pkx46see.dll (a50ca8df4181918fe0636272f31e19815f1b97cce6d871e15e03b0ee0e3da17b),它是恶意软件分析的主题。

分析

Web Shell 需要少量预配置,以确保它侦听正确的 URI。在这种情况下,路径将为 “ ~/auth/Current/themes/resources/lgntop.aspx ”。

此路径在 Microsoft Exchange Outlook Web Access (OWA) 站点上是预期的,因此它很可能是为了与目标服务器上运行的 OWA 服务相融合而选择的。收到 Web 请求后,它将通过以下方法进行处理。

此方法检查请求标头中是否存在名为 XFF 的特定 HTTP 标头。如果存在,并且其值在通过 MD5 哈希函数和子字符串函数后与字符串 “ 19267E61029B4546 ” 匹配,则该方法将继续执行其余代码。该字符串很可能用作身份验证密钥,以防止其他人使用 Web Shell。

if 语句中,该方法使用 BinaryRead 方法从请求正文中读取二进制数据,并将其存储在字节数组中。然后,它创建一个包含 .NET 类型完全限定名称的字符串,该代码希望加载,并使用 Type.GetType 方法获取对该类型的引用。图像中的字节数组是文本“ System.Reflection.Assembly ”的 ASCII 代码表示形式。这种呈现代码的方式是为了避免基于字符串的检测。System.Reflection.Assembly 类提供在运行时加载、检查和操作程序集的方法和属性。

该代码获取对加载类型中名为 Load 的方法的引用,并使用 Invoke 方法调用它。Load 方法将字节数组作为参数,该代码使用 Decrypt 方法对其进行解密(此出版物中未显示)。Load 方法调用的结果存储在对象变量中。

然后,该代码获取对加载类型中另一个名为 CreateInstance 的方法的引用,并使用 Invoke 方法调用它。CreateInstance 方法将字符串作为参数,该代码从包含字符串 U 的 ASCII 代码的字节数组构造该字符串。CreateInstance 方法调用的结果存储在对象变量中。

最后,该代码调用对象的 Equals 方法,传入当前对象。由于 Equals 将调用对象的 GetType,因此这种方法是一种隐式秘密调用函数的方式。

EncryptDecrypt 函数包含硬编码的密钥。

来源

密钥 “ e45e329feb5d925b ” 是取字符串“rebeyond”的 MD5 哈希值的前一半的结果。“rebeyond”指的是 Behinder Web Shell 框架的开发人员。这指的是 Behinder Web Shell 框架的开发人员。当您使用 Behinder 或派生的 Godzilla Web Shell 框架生成 Shell 模板时,此密钥也是默认值。

持久性模块

2023 年 2 月 13 日,我们观察到一种新的持久性恶意软件,名为 kavUpdate.exe,它用 .NET 编写,占用空间极小(编译后约 6Kb)。我们认为此软件是由威胁专门为该环境开发的。Elastic 安全实验室观察到此二进制文件通过计划任务持久存在,但其他机制也可能兼容。

分析

此代码的设计目的仅是执行一组预定义的命令。该恶意软件检查当前日期和时间,如果是在星期一或星期四的凌晨 5 点,它将执行一系列命令

  1. 删除用户“norshasa”
  2. 添加用户“norshasa”,密码为“P@ssw0rd123...”
  3. 激活用户“norshasa”
  4. 将用户“norshasa”添加到 Domain Admins 组
  5. 将用户“norshasa”添加到远程桌面用户组
  6. C:\ProgramData\temp 文件夹中创建 NTDS 的完整备份
  7. 在每周的同一天,一小时后,即早上 6 点,删除用户“norshasa”。

开源工具

2023 年 1 月 2 日,威胁在受害者环境中部署了 TFirewall。 TFirewall 是一款测试工具,旨在评估主机是否可以在内网环境中建立 SOCKS5 代理,同时允许通过特定端口进行出站网络通信。 TFirewall 使用 Golang 开发,包含客户端和服务器组件,并与多种操作系统兼容。

除了 TFirewall,我们还观察到攻击者使用了免费工具 AdFindAdFind 是一个用于查询 Active Directory 和其他目录服务的命令行实用程序。 AdFind 可以在 Windows 7 或更高版本上运行,除了启动可执行文件的能力之外,不需要任何特殊的安全权限。 它用 C++ 编写,并使用 Visual Studio 2022 编译。 源代码不可用。

该二进制文件可以根据其哈希值(114b37df703d46a44de0bc96afab8b8590e59a3c389558dd531298e5dd275acb)快速识别。 在执行过程中,我们识别出使用了 AdFind 特定的命令行标志和参数。

2023 年 3 月 6 日,我们观察到一个名为 nat.exe 的进程。 最初,该文件仅被识别为一般恶意文件。 但是,如果我们仔细查看执行期间使用的命令行参数,我们就可以找到攻击者正在使用哪个工具的线索。

基于这些参数,我们可以安全地得出结论,它是一个打包版本的 Impacket 工具 secretsdump。 Impacket 包含用于处理网络协议的 Python 类集合。 Impacket 通常用于执行与网络安全和渗透测试相关的各种任务,但也可能被威胁行为者滥用。

使用相同的方法(检查命令行参数),我们识别出使用了名为 NTDSDumpEx 的工具,该工具展示了该工具所采用的相同命令行参数

NTDSDumpEx 能够从脱机状态的 Active Directory NTDS.dit 数据库中提取数据,这意味着数据库不必运行。 它可以提取诸如用户帐户、组成员身份、访问控制列表和其他目录对象之类的信息。

背景

在整个攻击过程中,我们看到了一系列 TTP 的组合,这些 TTP 提供了一个可识别的指纹。例如,攻击者导出邮箱的方式在这篇博文中进行了详细描述。我们还看到,从 LSASS 中导出凭据的方式非常相似,如此处所述。攻击者部署的大多数命令和工具都在同一 GitHub 用户的 提示存储库中得到了很好的描述。

我们还注意到,用于部署 NAPLISTENER 的技术在此处进行了描述,而像 DOORME 这样的恶意 IIS 模块的部署方法可以在这篇博文中找到。最后,关于 Exchange 服务器中 Godzilla 和 Behinder Web Shell 的文章密切反映了这些功能在目标环境中的实施方式。

在对 SIESTAGRAPH、NAPLISTENER 和 SOMNIRECORD 系列恶意软件进行分析时,我们还发现了开源存储库,这些存储库至少是这些有效负载的灵感来源,并且已在 Elastic Security Labs 的其他出版物中进行了描述。

我们得出的结论是,攻击者至少是博客和开源存储库的常规消费者,这两者都促成了这种威胁活动快速发展。

检测逻辑

以下预构建的保护可从 Elastic 获得: - AdFind 命令活动

YARA

Elastic Security 创建了 YARA 规则来识别此活动。 以下是识别 Behinder Web Shell 的 YARA 规则。

rule Windows_Trojan_Behinder { meta: author = "Elastic Security" creation_date = "2023-03-02" last_modified = "2023-03-02" description = "在 REF2924 中发现的 Web Shell,与 Behinder 或 Godzilla 相关" os = "Windows" arch = "x86" category_type = "Trojan" family = "Behinder" threat_name = "Windows.Trojan.Behinder" License = “Elastic License v2” reference_sample = "a50ca8df4181918fe0636272f31e19815f1b97cce6d871e15e03b0ee0e3da17b" strings: $load = { 53 79 73 74 65 6D 2E 52 65 66 6C 65 63 74 69 6F 6E 2E 41 73 73 65 6D 62 6C 79 } $key = "e45e329feb5d925b" ascii wide condition: all of them }