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 webshell动态运行时编译的分析师应该注意,这是由操作员执行的,而不是系统自动执行的。

生成的输出文件名为App_Web_lgntop.aspx.ec688436.pkx46see.dll (a50ca8df4181918fe0636272f31e19815f1b97cce6d871e15e03b0ee0e3da17b),并且是恶意软件分析的对象。

分析

该webshell需要少量预配置才能确保它侦听正确的URI。在这种情况下,路径将为"~/auth/Current/themes/resources/lgntop.aspx"。

此路径在Microsoft Exchange Outlook Web Access (OWA)站点上预期存在,因此它很可能被选择以与目标服务器上运行的OWA服务融合。一旦收到Web请求,它就会由以下方法处理。

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

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 webshell框架的开发者。这指的是Behinder webshell框架的开发者。此密钥也是使用Behinder或派生Godzilla webshell框架生成shell模板时的默认值。

持久性模块

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

分析

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

  1. 删除用户'norshasa'
  2. 添加用户'norshasa',密码为'P@ssw0rd123...'
  3. 激活用户'norshasa'
  4. 将用户'norshasa'添加到“域管理员”组
  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(威胁战术和技术)组合,这些组合提供了可识别的指纹。例如,攻击者导出邮箱的方式在这篇博文中进行了详细描述。我们还发现从 LSASS 导出凭据的方式与此处描述的方式非常相似。攻击者部署的大多数命令和工具都在同一个 GitHub 用户的技巧存储库中进行了详细说明。

我们还注意到,部署 NAPLISTENER 的技术在此处进行了描述,而恶意 IIS 模块(如 DOORME)的部署方法可以在这篇博文中找到。最后,一篇关于 Godzilla 和 Behinder Web shell 在 Exchange 服务器中的文章与这些功能在目标环境中的实现方式非常相似。

在对 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 中发现的与 Behinder 或 Godzilla 相关的 Web shell" 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 }