攻击者利用ManageEngine ADSelfService Plus的漏洞发起针对性攻击(下)
2021-11-17
来源:嘶吼专业版
自定义 NGLite
NGLite 是一个用 Go 语言(特别是 Go 1.13 版)编写的开源后门。它可以从公共 GitHub 存储库下载。NGLite 是一种后门木马,只能运行通过其 C2 通道接收到的命令。虽然这些函数是后门的标准函数,但 NGLite 使用一种新颖的 C2 通道,该通道利用基于合法 NKN 的去中心化网络在后门和攻击者之间进行通信。
NKN声称,他们的去中心化网络使用一个公共区块链,可以支持数百万个对等点之间的通信,每个对等点都由一个唯一的NKN地址标识,而不是典型的网络标识符,如IP地址。因此,NGLite工具在其C2通道中通信的直接IP地址只是分散网络中的一个点,不太可能代表攻击者的网络位置,这种设计给NGLite C2通信信道的检测和防御带来了困难。
幸运的是,将 NKN 用作 C2 通道的情况非常罕见。研究人员总共只看到 13 个示例与 NKN 通信,其中9 个 NGLite 示例和 4 个与名为 Surge 的开源实用程序相关,该实用程序使用 NKN 进行文件共享。VirusTotal 扫描了九个已知 NGLite 示例中的八个。四个未被检测到,三个被一种防病毒软件检测到,其余的示例被五个检测到。如上一节所述,dropper 创建注册表项并执行保存在以下路径中的NGLite后门的自定义变体(SHA256: 805b92787ca7833eef5e61e2df1310e4b6544955e812e60b5f834f904623fd9f):
C:\Windows\system32\ME_ADAudit.exe
基于 Go 的后门中的数据结构包含以下路径,用于在开发人员系统上存储此自定义 NGLite 变体的主要源代码:
/mnt/hgfs/CrossC2-2.2/src/ng.com/lprey/main.go
基于此路径,可以推测该攻击者使用 CrossC2 构建跨平台 Cobalt Strike C2 有效载荷。然而,研究人员没有理由相信这个有效载荷实际上是基于 CrossC2 的,因为有效载荷是公开可用的 NGLite 后门的定制版本。
攻击者可能将 CrossC2 字符串包含在路径中作为误导,希望使攻击分析人员误以为他们正在提供 Cobalt Strike 有效载荷。研究人员已经看到以下 NGLite 示例使用可追溯到 8 月 11 日的相同源代码路径,这表明该攻击者已经使用该工具好几个月了:
此活动中使用的自定义 NGLite 示例检查 g 或组值的命令行参数。如果此开关不存在,则载荷将使用默认字符串 7aa7ad1bfa9da581a7a04489896279517eef9357b81e406e3aee1a66101fe824 作为其种子标识符。
有效载荷将创建它所指的攻击对象id,它是通过将系统网络接口卡 (NIC) 的 MAC 地址和 IPv4 地址连接起来生成的,用连字符 (-) 将两者分开。这个攻击对象标识符将用于 C2 通信。
NGLite 有效载荷将使用 NKN 去中心化网络进行 C2 通信。详见下面示例中的NKN客户端配置:
嵌入式 NKN 客户端配置
该示例首先通过 TCP/30003 访问 seed.nkn[.]org,特别是使用 HTTP POST 请求,结构如下:
原始NKN HTTP POST
它还将发送以 monitor_03 作为攻击对象 id 的 HTTP POST 请求,如下所示:
包含“prey id”的 HTTP Post
seed.nkn[.]org 服务器使用结构如下的 JSON 中的 [prey id (MAC-IPv4)] 响应此请求:
这表明有效载荷将通过 TCP/30003 与 66.115.12.89 处的对等端通信。然后,seed.nkn[.]org 服务器使用以下内容响应 monitor_03 请求,这表明有效载荷将通过 TCP/30003 与 54.204.73.156 通信:
从seed.nkn[.]org 获得响应后,有效载荷将向JSON 中addr 字段中提供的IP 地址和TCP 端口发出HTTP GET 请求。这些HTTP请求如下所示,但需要注意,这些系统不是由攻击者控制的;相反,它们只是最终会返回actor内容的对等链中的第一个对等:
NKN 对等互连
最终,自定义 NGLite 客户端和服务器之间的网络通信使用具有以下密钥的 AES 进行加密:
WHATswrongwithUu
自定义 NGLite 示例将首先向 C2 发送一个初始信标,该信标包含 whoami 命令的结果并连接字符串 #windows,如下所示:
[username]#windows
发送初始信标后,NGLite 示例将运行一个名为 Preylistener 的子函数,该函数创建一个侦听入站请求的服务器。该示例还将侦听入站通信,并尝试使用默认的 AES 密钥 1234567890987654 对其进行解密。它将通过 Go 方法 os/exec.Command 将解密的内容作为命令运行,然后使用相同的 AES 密钥对结果进行加密并发送回请求者。
后漏洞利用阶段活动
攻击网络得手后,攻击者迅速从最初的立足点转移到目标网络上的其他系统,通过其 NGLite 载荷和 Godzilla webshell 运行命令。在获得对初始服务器的访问权限后,攻击者将会集中精力从本地域控制器收集和窃取敏感信息,例如 Active Directory 数据库文件 (ntds.dit) 和注册表中的 SYSTEM 配置单元。不久之后,研究人员观察到攻击者安装了 KdcSponge 凭证窃取程序,我们将在下面详细讨论这个问题。接下来,攻击者将会窃取凭据、维护访问权限以及从受害者网络收集敏感文件。
KdcSponge凭证窃取程序
在分析过程中,Unit 42 发现的日志表明攻击者使用 PwDump 和内置的comsvcs.dl来创建了一个迷你的lasss .exe进程转储文件;然而,当攻击者希望从域控制器窃取凭据时,他们就会安装KdcSponge凭证窃取程序。
KdcSponge 的目的是在LSASS进程中挂钩API函数,以便从通过Kerberos服务(“KDC服务”)进行身份验证的入站尝试中窃取凭证。KdcSponge将捕获系统上的一个文件的域名、用户名和密码,然后攻击者将通过现有的服务器访问权限手动窃取该文件。
研究人员总共发现了两个 KdcSponge 示例,并将它们被命名为 user64.dll。他们有以下 SHA256 哈希值:
3c90df0e02cc9b1cf1a86f9d7e6f777366c5748bd3cf4070b49460b48
b4d4090b4162f039172dcb85ca4b85c99dd77beb70743ffd2e6f9e0ba78531945577665
为了启动 KdcSponge 凭据窃取程序,攻击者将运行以下命令来加载和执行恶意模块:
regsvr32 /s user64.dll
首次执行时,regsvr32 应用程序运行 user64.dll 导出的 DllRegisterServer 函数。DllRegisterServer 函数解析 sfc_os.dll 中的 SetSfcFileException 函数,并尝试禁用 c:\windows\system32\kdcsvc.dll 文件上的 Windows 文件保护 (WFP)。然后它尝试通过以下方式将自己注入正在运行的 lsass.exe 进程:
使用 OpenProcess 打开 lsass.exe 进程;
使用VirtualAllocEx分配远程进程中的内存;
使用WriteProcessMemory将字符串user64.dll写入分配的内存;
以user64.dll 为参数,使用RtlCreateUserThread 在lsass.exe 进程中调用LoadLibraryA;
现在user64.dll正在lsass.exe进程中运行,它将通过创建以下注册表项来通过系统重启建立持久性:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce\KDC Service : regsvr32 /s user64.dll
这样,示例将通过尝试获取以下模块之一的句柄来检查以确保系统正在运行 Kerberos 服务:
kdcsvc.dll
kdccli.dll
Kdcsvs.dll
KdcSponge 尝试使用以下三种方法定位三个未记录的 API 函数,特别是 KdcVerifyEncryptedTimeStamp、KerbHashPasswordEx3 和 KerbFreeKey:
标识Kerberos模块的版本,并使用硬编码偏移量挂钩API函数;
联系 Microsoft 的符号服务器以查找 Kerberos 模块内 API 函数的偏移量,并通过与硬编码字节序列进行比较来确认正确的函数;
在 Kerberos 模块中搜索硬编码字节序列;
KdcSponge 定位要挂钩的 API 函数的主要方法是基于可移植可执行 (PE) 文件的 IMAGE_FILE_HEADER 部分中的 TimeDateStamp 值来确定 Kerberos 模块的版本。一旦确定了 Kerberos 模块的版本,KdcSponge 就会有硬编码的偏移量,它将用于挂钩该模块版本中的适当函数。KdcSponge 查找以下 TimeDateStamp 值:
如果 KdcSponge 无法确定 Kerberos 模块的版本并且域控制器正在运行 Windows Server 2016 或 Server 2019(主要版本 10),则有效载荷将联系 Microsoft 的符号服务器 (msdl.microsoft.com) 以尝试找到几个未记录的 API 函数的位置。该示例将向如下结构的 URL 发出 HTTPS GET 请求,URL 的 GUID 部分是 PE 的 IMAGE_DEBUG_TYPE_CODEVIEW 部分中 RSDS 结构的 GUID 值:
/download/symbols/[library
name].pdb/[GUID]/[library name].pdb
该示例将结果保存到以下位置的文件中,文件名的 GUID 也是来自 IMAGE_DEBUG_TYPE_CODEVIEW 部分中 RSDS 结构的 GUID 值:
ALLUSERPROFILE\Microsoft\Windows\Caches\[GUID].db:
如上所述,研究人员认为代码接触符号服务器的原因是为了找到三个未记录的与kerberos相关的函数的位置:KdcVerifyEncryptedTimeStamp、KerbHashPasswordEx3和KerbFreeKey。该示例主要在以下库中查找这些函数:
kdcsvc.KdcVerifyEncryptedTimeStamp
kdcsvc.KerbHashPasswordEx3
kdcpw.KerbHashPasswordEx3
kdcsvc.KerbFreeKey
kdcpw.KerbFreeKey
如果找到了这些函数,示例将搜索特定的字节序列,如表1所示,以确认函数是正确的,并验证它们没有被修改。
KdcSponge 用于确认 Windows 主要版本的正确函数的未记录函数和字节序列
如果域控制器运行的是 Windows Server 2008 或 Server 2012(主要版本 6),KdcSponge 不会访问符号服务器,而是会搜索整个kdcsvc.dll模块,以查找表2中列出的字节序列,以找到API函数。
KdcSponge用于定位查找函数的未记录函数和字节序列
一旦找到 KdcVerifyEncryptedTimeStamp、KerbHashPasswordEx3 和 KerbFreeKey 函数,示例将尝试挂钩这些函数以监视对它们的所有调用,窃取凭据。当对域控制器进行身份验证的请求传入时,Kerberos 服务(KDC 服务)中的这些函数将被调用,并且示例将捕获入站凭据。然后将凭据写入磁盘的以下位置:
%ALLUSERPROFILE%\Microsoft\Windows\Caches\system.dat
被窃取的凭据使用一个单字节的XOR算法进行加密,使用0x55作为密钥,并以如下结构每一行写入system.dat文件:
[< timestamp >]< domain >< username > < cleartext password >
总结
虽然研究人员无法验证活动背后的攻击组织是谁,但确实观察到攻击中使用的策略和工具与 Threat Group 3390(TG-3390,Emissary Panda,APT27)之间存在一些相关性。
正如 SecureWorks 在一篇关于之前 TG-3390 操作的文章中所记录的那样,研究人员可以看到 TG-3390 也使用了 Web 漏洞利用和另一个名为 ChinaChopper 的流行中文 webshell 作为其初始立足点,然后利用合法窃取的凭据进行横向移动和攻击域控制器。虽然 webshell 和漏洞利用不同,但一旦攻击者获得了对环境的访问权限,他们的一些信息窃取工具就会存在功能重叠。
研究人员发现,攻击者使用 WinRar 伪装作为不同的应用程序,将数据分割到Recycler目录中的RAR文件中。他们从部署的批处理文件中提供了以下片段来完成这项工作:
根据研究人员对 ManageEngine ADSelfService Plus 最近攻击的分析,它们观察到了相同的技术,传递给重命名的 WinRar 应用程序的参数的顺序和位置相同。
一旦文件被分割,在上述两个示例中,它们都可以在面向外部的 Web 服务器上访问。然后攻击者将通过直接 HTTP GET 请求下载它们。
2021 年 9 月,在Unit 42 观察到的一次攻击活动中,攻击者通过利用 Zoho 的 ManageEngine 产品 ADSelfService Plus 中最近修复的漏洞获得了对目标组织的初始访问权限,该漏洞在 CVE-2021-40539 中进行了跟踪。在这次攻击行动中,至少有9家科技、国防、医疗、能源和教育行业的实体都受到了攻击。
漏洞被利用之后,攻击者迅速在网络中横向移动,并部署了多种工具来运行命令,以执行其利用后的活动。攻击者严重依赖Godzilla webshell,在操作过程中将开源 webshell 的几个变体上传到被攻击的服务器。其他一些工具具有新颖的特征,或者在之前的攻击中没有被公开讨论过,特别是 NGLite 后门和 KdcSponge 窃取程序。例如,NGLite 后门使用一种新颖的 C2 通道,涉及称为 NKN 的去中心化网络,而KdcSponge窃取器将未记录的函数挂接到域控制器,从入站Kerberos身份验证尝试获取凭证。
Unit 42 研究人员认为,攻击者的主要目标是获得对网络的持续访问权限并从被攻击目标中收集和窃取敏感文件。攻击者将敏感文件收集到暂存目录,并在 Recycler 文件夹中创建受密码保护的多卷 RAR 文件。攻击者通过直接从面向外部的 Web 服务器下载单个 RAR 文件来窃取文件。