【翻译】威胁狩猎:GuptiMiner劫持杀毒软件更新以分发后门程序和进行隐秘挖矿
朝闻道 发表于 湖北 二进制安全 742浏览 · 2024-04-25 01:35

翻译:https://decoded.avast.io/janrubin/guptiminer-hijacking-antivirus-updates-for-distributing-backdoors-and-casual-mining/

简介

  • Avast 发现并分析了劫持 eScan 防病毒更新机制以分发后门和挖矿程序的恶意软件活动
  • Avast 向 eScan 防病毒软件和印度 CERT 披露了该漏洞。 2023年7月31日,eScan确认问题已修复并成功解决
  • 该活动是由可能与 Kimsuky 有联系的威胁行为者精心策划的
  • 已发现两种不同类型的后门,针对大型企业网络
  • GuptiMiner分配的最终有效负载也是XMRig
    # 介绍
    我们一直在追踪一个有趣的案例。首先,GuptiMiner 是一种高度复杂的威胁,它使用了一个有趣的感染链和一些技术,包括向攻击者的 DNS 服务器执行 DNS 请求、执行侧载、从看似无害的图像中提取有效载荷、用自定义的信任根锚证书颁发机构签署其有效载荷等。

GuptiMiner的主要目标是在大型企业网络内分发后门程序。我们遇到了两种不同的后门变种:第一种是PuTTY Link的增强版本,提供对本地网络的SMB扫描,并通过网络实现横向移动,可能影响到网络上潜在易受攻击的Windows 7和Windows Server 2008系统。第二种后门是多模块化的,接受攻击者的命令以安装更多模块,并专注于扫描本地系统上存储的私钥和加密钱包。
有趣的是,GuptiMiner还在受感染设备上分发了XMRig,这对于这样一个深思熟虑的操作来说有点出乎意料。
GuptiMiner背后的行动者一直在利用印度杀毒软件供应商eScan更新机制中的一个不安全点来通过执行中间人攻击来分发恶意软件。我们在2023年7月31日向eScan和印度计算机应急响应团队(CERT)披露了这个安全漏洞,并从eScan那里得到了确认,问题已经得到修复并成功解决。
GuptiMiner是一种长期存在的恶意软件,其痕迹可以追溯到2018年,尽管它可能更早。我们还发现GuptiMiner可能与臭名昭著的朝鲜APT组织Kimsuky有联系,这是通过观察Kimsuky键盘记录器和部分GuptiMiner操作之间的相似性得出的。
在这次分析中,我们将介绍GuptiMiner的特点及其随时间的发展情况。我们还将指出哪些样本包含或引入了特定功能以支持对大量IoCs的整体理解。
同样重要的是要注意的是,由于用户很少在他们的机器上安装多个防病毒软件(AV),我们对GuptiMiner的活动及其整体范围的视野可能有限。因此,我们可能只是在看冰山一角,整个操作的真实范围仍待发现.

感染链

为了说明整个感染过程的复杂性,我们提供了一个流程图,包含了链中的所有部分。请注意,根据 GuptiMiner 的具体版本,使用的文件名或工作流可能会略有不同,但下面的流程图说明了整个过程。
整个过程始于 eScan 从更新服务器请求更新时,在未知的中间人攻击(MitM)拦截下载并用恶意包替换了更新包。然后 eScan 解压缩并加载该包,并由 eScan 干净的二进制文件侧载入一个 DLL 文件。这个 DLL 文件启用了链中剩余的部分,随后是多个 shellcode 和中间 PE 加载器。
生成的 GuptiMiner 包括在受感染机器上使用 XMRig,并引入后门程序,在部署到大型企业网络时被激活。


GuptiMiner的感染链

演变和时间线

GuptiMiner 自 2018 年至少以来一直活跃。多年来,背后的开发者显著改进了恶意软件,带来了新功能。我们将在各自的子部分中详细描述特定功能。
话虽如此,我们还想以时间线的形式展示重要的 IoC(指标),以及它们是如何随时间变化的——重点关注互斥体、PDB(程序数据库)和使用的域名。这些时间线是基于对大量样本数据集进行 IoC 扫描创建的,取样例的第一个和最后一个编译时间戳,然后形成间隔。请注意,扫描的数据集比 IoC 部分列出的 IoC 大。有关更详细的 IoC 列表,请访问我们的 GitHub 页面。

域名时间线

一般来说,GuptiMiner 在运行过程中使用以下类型的域名:

  • 恶意DNS服务器 - GuptiMiner托管自己的DNS服务器,通过DNS TXT响应提供C&C服务器的真实目标域名地址
  • 请求恶意域名 - 恶意软件查询这些域名获取C&C服务器的 IP 地址
  • PNG下载 - 下载有效负载(T-Mobile徽标)形式的PNG文件的服务器。这些PNG文件是有效的图像,在它们的末尾包含附加的shellcodes
  • 配置矿池 - GuptiMiner包含两种不同的矿池配置。一种是直接在XMRig配置中硬编码
  • 修改后的矿池 - GuptiMiner有能力修改预定义的矿池
  • 最终C&C - 在GuptiMiner的最后一步后门阶段使用的域,为被后门化的系统提供额外的恶意软件功能
  • 其他 - 用于不同目的的不同域,例如在脚本中使用

请注意,由于恶意软件直接连接到恶意 DNS 服务器,因此 DNS 协议与 DNS 网络完全分离。因此,任何合法的 DNS 服务器都不会看到来自该恶意软件的流量。这里使用 DNS 协议作为 telnet 的功能等效项。因此,该技术不是 DNS 欺骗,因为欺骗通常发生在 DNS 网络上。

此外,GuptiMiner 在该类别中要求的服务器Requested domain实际存在的事实纯粹是巧合,或者更确切地说是网络混淆,以迷惑网络监控工具和分析人员。


时间线展示了GuptiMiner在不同时间使用域名的情况
从这个时间线可以明显看出,GuptiMiner 背后的作者意识到正确设置 DNS 服务器对于整个链的正常工作至关重要。因此,我们可以观察到该Malicious DNS组中存在最大的轮换和较短的时间范围。

此外,由于该组中的域名Requested domain是不相关的(至少从技术角度来看),我们可以注意到作者在更长的时间内重复使用相同的域名。

互斥体时间线

互斥体有助于确保软件的正确执行流程,恶意软件作者经常将这些命名对象用于相同目的。自 2018 年以来,GuptiMiner 已多次更改其互斥体。最重要的是,我们可以注意到自 2021 年以来的变化,作者更改了互斥体以反映新版本的编译/分发日期。


时间线展示了GuptiMiner在不同时间使用互斥体的情况
细心的读者可能会注意到两个要点:第一个是MIVOD6、SLDV15、SLDV13和的使用中明显的异常值Global\Wed Jun 2 09:43:03 2021。根据我们的数据,这些互斥体确实在不同的构建中被重复使用了多次,从而产生了比预期更长的时间范围。
另一个问题是去年年末重新引入了 PROCESS\
互斥锁。在这个时候,作者们用 UTF-16 编码的字符串重新引入了这个互斥锁,我们已经单独注意到了这一点。

符号文件(PDB)时间线

关于调试符号,GuptiMiner 的作者在其二进制文件中留下了多个 PDB 路径。大多数时候,它们包含诸如MainWork,Projects等 字符串。


时间线展示了GuptiMiner在不同时间使用PDB的情况

阶段 0 – 安装过程

拦截更新

每个人都应该更新他们的软件,对吗?通常,个人要么从官方供应商的网站手动下载新版本,要么最好是软件本身自动执行更新,而无需用户过多思考或采取行动。但是,当有人能够劫持这个自动过程时会发生什么呢?
当我们开始观察到一些用户收到来自其他合法请求的异常响应时,我们开始了调查,例如:
http://update3[.]mwti[.]net/pub/update/updll3.dlz
这确实是下载文件的合法 URL updll3.dlz,在正常情况下,该文件是包含 eScan 防病毒更新的合法存档。然而,我们开始在一些客户端上发现可疑行为,这些行为正是源自这样的 URL。
我们发现,GuptiMiner 背后的攻击者正在执行中间人 (MitM) 操作,在受害者的 PC 上下载受感染的安装程序,而不是更新。不幸的是,我们目前没有关于 MitM 是如何执行的信息。我们假设受害者的设备或其网络上必须存在某种预感染,从而导致 MitM。

更新包

c3122448ae3b21ac2431d8fd523451ff25de7f6e399ff013d6fa6953a7998fa3
(version.dll, 2018-04-19 09:47:41 UTC)
在整个分析过程中,我们不仅会尝试描述感染链的流程、恶意软件技术和各个阶段的功能,而且还会关注不同的版本,描述恶意软件作者如何随着时间的推移开发和更改 GuptiMiner。
我们找到的第一个 GuptiMiner 样本是在 2018 年 4 月 19 日星期二编译的,并于第二天从印度上传到 VirusTotal,随后又从德国上传:
c3122448ae3b21ac2431d8fd523451ff25de7f6e399ff013d6fa6953a7998fa3


该文件的命名C:\Program Files\eScan\VERSION.DLL表明目标受众是真正的 eScan 用户,它来自 AV 下载的更新包。

尽管此版本缺少较新示例中的一些功能,但安装过程仍然相同,如下所示:

  • eScan更新程序触发更新
  • 由于缺少 HTTPS 加密(执行了 MitM),下载的软件包文件被线上的恶意文件替换
  • updll62.dlzeScan更新程序下载并解压 恶意软件包
  • 该包的内容包含version.dll由 eScan 旁加载的恶意 DLL(通常称为 )。由于旁加载,DLL 以与源进程 eScan 相同的权限运行,并且在 eScan 下次运行时加载,通常是在系统重新启动后
  • 如果系统中不存在互斥体(取决于版本,例如Mutex_ONLY_ME_V1),恶意软件将搜索services.exe进程并将其下一阶段注入它可以找到的第一个阶段
  • 执行清理,删除更新包

恶意 DLL 包含干净的 DLL 中不存在的附加功能。值得庆幸的是,这些名称非常冗长,因此大多数名称都不需要进行分析。功能列表如下所示。


附加导出函数

然而,有些功能是独一无二的。例如,该函数X64Call提供Heaven's Gate,即它是一个帮助函数,用于在64位系统上的32位进程内运行x64代码。恶意软件需要它才能运行注入的 shellcode,具体取决于操作系统版本以及services.exe进程的位数。

天堂之门在需要时在 x64 环境中运行 shellcode
为了保持原始 eScan 功能的完整性,恶意软件version.dll还需要处理原始的遗留version.dll功能。这是通过转发原始 DLL 中的所有导出函数来完成的。当识别出对旧 DLL 函数的调用时,GuptiMiner 会解析原始函数并随后调用它。


确保所有原始version.dll导出可用的解析功能

在 services.exe 中注入 Shellcode

shellcode注入后services.exe,作为下一阶段的加载器。这是通过读取纯文本形式的嵌入 PE 文件来完成的。


shellcode加载的嵌入PE文件
该PE文件通过标准方式加载,但此外,shellcode还破坏PE的DOS标头并通过调用其入口点来运行它,并且从原始位置内存中完全删除嵌入的PE。

命令行操作

在整个GuptiMiner感染链中,每个加载和注入PE文件的shellcode也会操纵当前进程的命令行。这是通过操作结果来完成的,GetCommandLineA/W该结果更改了任务管理器中显示的结果命令行。


命令行操作功能
检查此功能后,我们认为它要么没有按照作者的预期工作,要么我们不理解它的用法。长话短说,命令行的更改方式是--parameter跳过第一个之前的所有内容,然后将此参数附加到进程名称中。

为了说明这一点,我们可以使用一个命令:
notepad.exe param1 --XX param2
它将被转换为:
notepad.exeXX param2

然而,我们还没有看到这样的用法power --shell.exe param1 param2会导致:
powershell.exe param1 param2

我们也没有看到任何参数隐藏(例如 XMRig 的用户名和密码),这是我们在遇到此类情况时预期的一种行为。无论哪种情况,此功能都会混淆命令行外观,这一点值得一提。感兴趣的读者可以在此处的很棒的 godbolt.org 上试用该功能。

代码虚拟化

7a1554fe1c504786402d97edecc10c3aa12bd6b7b7b101cfc7a009ae88dd99c6
(version.dll, 2018-06-12 03:30:01)

另一个带有互斥锁的版本ONLY_ME_V3引入了代码虚拟化。这可以通过 PE 文件中名为 的附加部分观察到.v_lizer。此部分在后来的版本中也被重命名了几次。


包含虚拟化代码的新部分称为.v_lizer
值得庆幸的是,只要 shellcode 和嵌入的 PE 文件仍然是明文形式,混淆就相当弱。

此外,作者开始version.dll通过额外的互斥体来区分 shellcode 加载的阶段和 PE 文件。以前,两个阶段都使用共享互斥体ONLY_ME_Vx,现在侧面加载用作MTX_V101互斥体。

阶段 0.9 – 安装改进

3515113e7127dc41fb34c447f35c143f1b33fd70913034742e44ee7a9dc5cc4c
(2021-03-28 14:41:07 UTC)

随着时间的推移,安装过程经历了多次改进,并且由于它与旧版本相比有很大不同,因此我们决定将其单独描述为中间阶段 0.9。通过这些改进,作者引入了计划任务、WMI 事件、两个不同加载的下一阶段(阶段 1 – PNG 加载器)、关闭 Windows Defender 以及将精心设计的证书安装到 Windows 的使用。

此阶段还删除了多个文件,从而使恶意软件能够进一步进行旁加载。这些文件是干净的,专门用于旁加载目的。被侧面加载的恶意 DLL 是两个 PNG 加载器(第一阶段):

de48abe380bd84b5dc940743ad6727d0372f602a8871a4a0ae2a53b15e1b1739 atiadlxx.dll
e0dd8af1b70f47374b0714e3b368e20dbcfa45c6fe8f4a2e72314f4cd3ef16ee
BrLogAPI.dll

WMI 事件

de48abe380bd84b5dc940743ad6727d0372f602a8871a4a0ae2a53b15e1b1739
(atiadlxx.dll, 2021-03-28 14:30:11 UTC)

在此阶段,WMI 事件用于加载第一个 PNG 加载器。该加载程序被提取到路径:
C:\PROGRAMDATA\AMD\CNext\atiadlxx.dll

与此同时,附加的干净文件被删除,它们用于侧面加载,在这些位置之一(可以是两个): 或
C:\ProgramData\AMD\CNext\slsnotif.exe
C:\ProgramData\AMD\CNext\msvcr120.dll
or
C:\Program Files (x86)\AMD\CNext\CCCSlim\slsnotify.exe
C:\Program Files (x86)\AMD\CNext\CCCSlim\msvcr120.dll

然后通过 WMI 事件注册干净文件slsnotify.exe,以便在满足以下条件时执行该文件:


触发侧面加载的 WMI 条件

换句话说,侧载是在 1 月、7 月或 11 月的工作日执行的。代表的数字%d是随机选择的值。该小时的两个可能性正好相隔两个小时,并且在 11-16 或 13-18(含)范围内。这种情况进一步凸显了 GuptiMiner 运营的长久性。

计划任务

e0dd8af1b70f47374b0714e3b368e20dbcfa45c6fe8f4a2e72314f4cd3ef16ee
(BrLogAPI.dll, 2021-03-28 14:10:27 UTC)

与 WMI 事件类似,GuptiMiner 也会在此位置放置一个用于旁加载的干净二进制文件:
C:\ProgramData\Brother\Brmfl14c\BrRemPnP.exe

然后,恶意 PNG 加载器被放置在以下位置之一(或两个位置):
C:\Program Files (x86)\Brother\Brmfl14c\BrLogAPI.dll
C:\Program Files\Brother\Brmfl14c\BrLogAPI.dll

计划任务是通过调用任务计划程序创建的。计划任务具有以下特点:

  • 它被创建并命名为C:\Windows\System32\Tasks\Microsoft\Windows\Brother\Brmfl14c
  • 执行:C:\ProgramData\Brother\Brmfl14c\BrRemPnP.exe
  • 执行是在包含要旁加载的 DLL 的文件夹下完成的,例如:C:\Program Files (x86)\Brother\Brmfl14c\
  • TASK_TRIGGER_BOOT每次启动 ( ) 时都会以SYSTEM特权 执行该执行

停机期间部署

3515113e7127dc41fb34c447f35c143f1b33fd70913034742e44ee7a9dc5cc4c
(2021-03-28 14:41:07 UTC)

现在让我们看看所有这些文件(无论是干净的还是恶意的)是如何部署的。 GuptiMiner 的技巧之一是,它仅在系统关闭过程中删除包含 PNG 加载阶段的最终有效负载。因此,这种情况发生在其他应用程序关闭并且可能不再保护用户时。


Stage 0.9 变体的主要流程 - 在系统关闭期间丢弃最终有效负载
从上面的代码中,我们可以观察到,只有当SM_SHUTTINGDOWN指标非零时,意味着当前会话正在关闭,并且所有支持的干净文件都已成功删除,最终的有效负载 DLL 也会被删除。

感兴趣的读者还可能会注意到上面的代码中被调用的第一个函数禁用了 Windows Defender。这是通过修改注册表项的标准方法来完成的。只有禁用 Defender 后,恶意软件才能继续执行恶意操作。

将证书添加到 Windows

大多数时候,GuptiMiner 使用自签名二进制文件进行恶意活动。然而,这一次,攻击者更进一步。在这种情况下,两个删除的 PNG 加载程序 DLL 均由自定义的受信任根锚点证书颁发机构签名。这意味着签名本质上是不可信的,因为 Windows 中的常见验证过程无法信任攻击者的证书颁发机构。

然而,在恶意软件安装过程中,GuptiMiner 还会将根证书添加到 Windows 的证书存储中,从而使该证书颁发机构受到信任。因此,当这样的签名文件被执行时,就被理解为正确签名。这是通过使用CertCreateCertificateContext、CertOpenStore和CertAddCertificateContextToStoreAPI 函数来完成的。


将GuptiMiner的根证书添加到Windows的功能
该证书以纯文本形式直接存在于 GuptiMiner 二进制文件中。


恶意软件将其作为根添加到 Windows 的明文形式的证书
在我们的研究过程中,我们发现 GuptiMiner 操作期间使用了三种不同的证书颁发者:

  • GTE Class 3 Certificate Authority
  • VeriSign Class 3 Code Signing 2010
  • DigiCert Assured ID Code Signing CA
    请注意,这些名称是人为的,与合法认证机构的任何相似之处均应被视为巧合。

在注册表中存储有效负载

8e96d15864ec0cc6d3976d87e9e76e6eeccc23c551b22dcfacb60232773ec049
(upgradeshow.dll, 2023-11-23 16:41:34 UTC)

在后期的开发阶段,GuptiMiner 背后的作者开始通过将有效负载存储在注册表项中来集成更好的有效负载持久性。此外,有效负载还使用固定密钥通过异或加密。这确保了有效载荷在肉眼看来毫无意义。

到目前为止,我们已经发现这些注册表项位置可用于存储有效负载:

  • SYSTEM\CurrentControlSet\Control\Nls\Sorting\Ids\en-US
  • SYSTEM\CurrentControlSet\Control\PnP\Pci\CardList
  • SYSTEM\CurrentControlSet\Control\Wdf\DMCF
  • SYSTEM\CurrentControlSet\Control\StorVSP\Parsers

第 1 阶段 – PNG 加载器

ff884d4c01fccf08a916f1e7168080a2d740a62a774f18e64f377d23923b0297
(2018-04-19 09:45:25 UTC)

当 PE 文件的入口点由阶段 0的 shellcode 执行时,恶意软件首先创建一个计划任务,尝试通过从系统中 删除updll62.dlz存档和库来清除初始感染。version.dll

此外,PE 通过联系攻击者的恶意 DNS 服务器来充当其他阶段的投放程序。这是通过向攻击者的 DNS 服务器发送 DNS 请求,获取带有响应的 TXT 记录来完成的。 TXT 响应包含真实 C&C 服务器的加密 URL 域,应请求额外的有效负载。此有效负载是一个有效的 PNG 图像文件(T-Mobile 徽标),其末尾还附加有一个 shellcode。随后,恶意软件在单独的线程中执行 shellcode,在下一阶段提供进一步的恶意软件功能。

请注意,由于 DNS 服务器本身是恶意的,因此请求的域名并不重要 - 或者,以更抽象的方式思考此功能,它可以被视为传递到服务器的“密码”,决定 DNS 服务器是否应该提供带有说明的所需 TXT 响应。

正如我们在域名时间线部分中已经提到的,使用了多个此类“请求的域名”。在此处引用的版本中,我们可以看到使用了这两个:
ext.peepzo[.]com
crl.peepzo[.]com
本例中的恶意DNS服务器地址为:

ns1.peepzo[.]com
在这里我们可以看到使用 Wireshark 捕获的 DNS TXT 响应。请注意,Transaction ID = 0x034b在 GuptiMiner 运营的所有年份中,这一点都保持不变。我们发现这很有趣,因为我们预计这很容易被受影响网络中的防火墙或 EDR 标记。


Wireshark 捕获的 DNS TXT 响应
恶意软件执行查询时的请求是随机间隔完成的。对 DNS TXT 记录的初始请求在 PNG 加载程序执行后的前 20 分钟内执行。针对恶意软件的更新例程执行的连续请求在两次尝试之间等待长达 69 小时。

这种更新机制通过使用 shellcode 版本号创建单独的互斥体来体现,该版本号由解密的 DNS TXT 响应的前两个字节表示(解密过程见下文)。这可以确保相同版本的 shellcode 不会在系统上运行两次。


互斥量由 shellcode 的版本信息编号

DNS TXT记录解密

收到 DNS TXT 记录后,GuptiMiner 使用 Base64 对内容进行解码,并使用用作密钥派生函数的 MD5 和用于解密的 RC2 密码的组合进行解密。请注意,在该恶意软件的更高版本中,作者还使用校验和和附加解密密钥改进了解密过程。
对于密钥导出函数和解密过程,作者决定使用标准 Windows CryptoAPI 函数。

标准 Windows CryptoAPI 函数的典型用法
有趣的是,敏锐的眼睛可以观察到上面所示的初始化过程中的疏忽,特别是在CryptHashData函数中。CryptHashData API函数的原型是:

BOOL CryptHashData(
  [in] HCRYPTHASH hHash,
  [in] const BYTE *pbData,
  [in] DWORD      dwDataLen,
  [in] DWORD      dwFlags
);

该函数的第二个参数是一个指向长度为 的字节数组的指针dwDataLen。但是,该恶意软件提供 Unicode (UTF-16) 格式的字符串L"POVO@1",由 bytes 数组表示*pbData。

因此,该数组的前六个字节仅db 'P', 0, 'O', 0, 'V', 0有效地将密钥切成两半并用零填充。尽管恶意软件作者多年来不断更改解密密钥,但他们从未修复这一疏忽,并且它仍然存在于最新版本的 GuptiMiner 中。

DNS TXT记录解析

此时,我们将演示解密的 TXT 记录以及如何解析它。在此示例中,在访问攻击者的恶意 DNS 服务器ns.srnmicro[.]net和请求的域时spf.microsoft[.]com,服务器返回了以下 DNS TXT 响应:

VUBw2mOgagCILdD3qWwVMQFPUd0dPHO3MS/CwpL2bVESh9OnF/Pgs6mHPLktvph2

完全解码并解密该字符串后,我们得到:

该结果包含多个字段,可以解释为:

前两个字节,版本 1 和版本 2,构成 PNG shellcode 版本。目前尚不清楚为什么有两个这样的版本,因为程序中实际上从未使用过版本 2。仅考虑版本1是否执行更新,即是否下载并加载PNG shellcode。无论哪种情况,我们都可以将这些数字视为主要版本和次要版本,并且只有主要版本才能触发更新过程。

第三个字节是密钥大小,表示之后应读取多少字节,形成密钥。此外,密钥和 URL 之间不需要额外的分隔符,因为密钥大小已知并且 URL 跟随。最后,可以通过计算所有字节的总和(模)来验证两字节校验和0xFF。

DNS TXT 记录被解码和解密后,恶意软件会从提供的 URL 以 PNG 文件的形式下载下一阶段的内容。这是通过使用标准WinINetWindows API 来完成的,其中 被User-Agent设置为包含当前正在运行的进程的位数。


恶意软件将运行进程的位数传达给 C&C
C&C 服务器将这些User-Agent信息用于两件事:

  • 以正确的位数提供下一阶段(shellcode)
  • 作为保护机制,过滤任何不包含此信息的 HTTP 请求

解析 PNG 文件

下载的文件之后是一个有效的 PNG 文件,其中还包含末尾附加的 shellcode。该图像是 T-Mobile 徽标,并且具有精确的805字节数。这些字节被恶意软件跳过,文件的其余部分(从偏移量 开始0x325)由 RC2 使用 TXT 响应中提供的密钥(使用 MD5 派生)进行解密。使用图像作为此“前缀”的原因是为了进一步混淆网络通信,其中有效负载看起来像合法图像,可能会忽略附加的恶意软件代码。

包含从以下位置开始的 shellcode 的 PNG 文件0x325
从位置加载 shellcode 后0x325,它会继续从内存加载额外的 PE 加载器,以使用 Gzip 解压下一个阶段。

IP地址屏蔽

294b73d38b89ce66cfdefa04b1678edf1b74a9b7f50343d9036a5d549ade509a
(2023-11-09 14:19:45 UTC)

2023 年末,作者决定放弃多年来使用 DNS TXT 记录分发有效负载的方法,转而采用 IP 地址屏蔽。
这种新方法包括以下几个步骤:

  • gethostbyname使用API函数 通过标准方式获取攻击者注册的硬编码服务器名称的IP地址
  • 对于该服务器,返回两个 IP 地址 - 第一个是 IP 地址,它是屏蔽地址,第二个表示可用的有效负载版本,并23.195.以前两个八位字节 开头
  • 如果版本比当前版本新,则屏蔽 IP 地址将被取消屏蔽并生成真实的 C&C IP 地址
  • 真实的 C&C IP 地址与硬编码常量字符串(在 URL 路径中使用)一起使用来下载包含 shellcode 的 PNG 文件
  • 去屏蔽过程是通过分别将 IP 地址的每个八位字节与0xA、0xB、0xC、进行异或来完成的0xD。然后获取结果,并将硬编码常量字符串添加到 URL 路径中。

例如,我们观察到的一个这样的服务器是www.elimpacific[.]net.当时,它正在返回:

该地址23.195.101[.]1表示版本,如果它高于当前版本,则通过下载带有 shellcode 的 PNG 文件来执行更新。此更新是通过从真实的C&C服务器请求PNG文件来下载的,其地址是通过去屏蔽179.38.204[.]38地址计算得出的:

然后发出请求以及计算出的 IP 地址185.45.192[.]43和硬编码常量elimp。从某种意义上说,使用这样的常量可以充当附加密码:
185.45.192[.]43/elimp/

GuptiMiner 正在从真实 IP 地址请求有效负载
下载 PNG 文件后,其余过程与平常相同。
到目前为止,我们已经发现了两个用于此功能的服务器:

反虚拟机和反调试技巧

294b73d38b89ce66cfdefa04b1678edf1b74a9b7f50343d9036a5d549ade509a
(2023-11-09 14:19:45 UTC)

除了上述其他更新之外,我们还观察到使用反虚拟机和反调试技巧的演变。这些是通过检查众所周知的磁盘驱动程序、注册表项和正在运行的进程来完成的。

GuptiMiner 通过枚举来检查这些磁盘驱动程序
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\Disk\Enum:

  • vmware
  • qemu
  • vbox
  • virtualhd
    具体来说,该恶意软件还会检查注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Cylance是否存在 Cylance AV。

与其他反虚拟机措施一样,该恶意软件还会检查系统是否具有超过 4GB 的可用 RAM 和至少 4 个 CPU 核心。

最后但并非最不重要的一点是,恶意软件还通过前缀检查这些进程的存在:

在注册表中存储图像

6305d66aac77098107e3aa6d85af1c2e3fc2bb1f639e4a9da619c8409104c414
(2023-02-22 14:03:04 UTC)

与在注册表中存储有效负载类似,在 GuptiMiner 的后期阶段,作者也开始将下载的 PNG 图像(包含 shellcode)保存到注册表中。与存储有效负载相反,图像不会另外进行异或运算,因为其中的 shellcode 已使用 RC2 进行加密(有关详细信息,请参阅DNS TXT 记录解密部分)。

到目前为止,我们已经发现这些注册表项位置可用于存储包含 shellcode 的加密图像:

  • SYSTEM\CurrentControlSet\Control\Arbiters\Class
  • SYSTEM\CurrentControlSet\Control\CMF\Class
  • SYSTEM\CurrentControlSet\Control\CMF\CORE
  • SYSTEM\CurrentControlSet\Control\CMF\DEF
  • SYSTEM\CurrentControlSet\Control\CMF\Els
  • SYSTEM\CurrentControlSet\Control\CMF\ASN
  • SYSTEM\CurrentControlSet\Control\MSDTC\BSR

第 2 阶段 – Gzip 加载器

357009a70daacfc3379560286a134b89e1874ab930d84edb2d3ba418f7ad6a0b
(2019-04-02 07:30:21 UTC)

这个阶段是最短的,Gzip加载器是由PNG文件中的shellcode提取并执行的,是一个简单的PE,它使用Gzip解压另一个shellcode并在单独的线程中执行它。
该线程还加载第 3 阶段,我们将其称为 Puppeteer,它协调恶意软件的核心功能 - 加密货币挖掘以及在适用时在受感染系统上部署后门。
在整个 GuptiMiner 操作过程中,Gzip 加载程序在后续版本中并未发生变化。

第3阶段 - 傀儡师

364984e8d62eb42fd880755a296bd4a93cc071b9705c1f1b43e4c19dd84adc65
(2019-03-15 10:07:36 UTC)

现在让我们看看最大的第三阶段:傀儡师。它在受感染系统的各处进行控制,操纵 GuptiMiner 组件来执行其命令,这就是我们选择的名称。它协调进一步的行动并部署恶意软件的两个核心组件——一个 XMRig 挖矿程序和两种针对大型企业网络中存在的设备的后门。当然,Puppeteer 还为整个 GuptiMiner 操作的武库引入了额外的技巧。

Global\SLDV此阶段还使用我们在互斥体时间轴中描述的众多互斥体之一。例如,这个特定示例SLDV01用作其互斥锁。

傀儡师设置

Puppeteer 执行几个步骤才能正确设置。首先,它在 Windows 中添加了新的电源方案,这样 PC 就不会进入睡眠状态。如果 CPU 只有一个核心(反虚拟机)或互斥锁已存在,则恶意软件将通过进入无限睡眠来停止运行。

在下一阶段,恶意软件会杀死所有名为msiexec.exe、cmstp.exe或 的进程credwiz.exe。之后,它创建一个单独的线程,将 XMRig 注入恶意软件新创建的 credwiz.exe 进程中。该恶意软件还通过将其服务启动状态设置为禁用来禁用 Windows Defender。

为了坚持,Puppeteer 选择了一个有趣的方法。首先,它创建一个具有以下配置的计划任务:

  • rundll32.exe复制并重命名合法文件C:\ProgramData\Microsoft\Crypto\Escan\dss.exe,并从计划任务执行该文件
  • 恶意 DLL 被放置到并由(导出函数) C:\ProgramData\Microsoft\Crypto\Escan\updll3.dll3加载该文件dss.exeValidateFile
  • TASK_TRIGGER_BOOT该任务在每次启动 ( ) 和TASK_RUNLEVEL_HIGHEST优先级 时执行
  • 该任务被命名并位于C:\Windows\system32\tasks\Microsoft\windows\autochk\ESUpgrade

这样,恶意软件就会将内容复制updll3.dll3到内存中,并从磁盘中删除原始文件。然后,Puppeteer通过等待metric 设置为非零值(指示关闭)来等待系统关闭(类似于阶段 0.9SM_SHUTTINGDOWN )。每 100 毫秒检查一次。仅当启动系统关闭时,恶意软件才会将updll3.dll3文件重新引入磁盘。

在系统重新启动之前将恶意 DLL 放回去确实很偷偷摸摸,但也可能产生潜在的负面后果。如果受害者的设备遇到崩溃、断电或任何其他类型的意外关闭,文件将不会从内存中恢复,Puppeteer 将从此停止工作。也许这就是作者在后来的版本中实际上删除了这个技巧的原因,用复杂性换取了恶意软件的稳定性。


确保重启后正确执行的代码
上面代码中 updll3.dll3 的重复加载实际上是 Puppeteer 的更新过程。 DLL 最终将执行从 C&C 服务器请求新的 PNG shellcode 的步骤,如果是新版本,链将被更新。

XMRig部署

在设置过程中,Puppeteer 创建了一个单独的线程,用于将 XMRig coinminer 注入credwiz.exe进程中。然而,在注射之前,需要执行一些准备步骤。

XMRig 配置直接存在于 Puppeteer 二进制文件中存储的 XMRig 二进制文件(标准 JSON 配置)中。但是,可以将该配置动态修改为不同的值。在下面的示例中,我们可以看到根据受感染系统硬件的稳健性动态分配挖矿线程。

即时修补 XMRig 配置,动态分配挖矿线程
注入是标准的:恶意软件创建一个新的暂停进程 credwiz.exe ,如果成功,则由 WriteProcessMemory 和 CreateRemoteThread 组合注入并执行挖矿。

Puppeteer 持续监控系统的运行进程,默认情况下每 5 秒监控一次。如果遇到下面的任何监控工具,恶意软件就会通过停止整个credwiz.exe进程来杀死任何现有的挖矿,并应用渐进式睡眠,将另一次重新注入尝试推迟 5 小时。

  • taskmgr.exe
  • autoruns.exe
  • wireshark.exe
  • wireshark-gtk.exe
  • tcpview.exe

此外,恶意软件需要定位updll3.dll3系统上的当前版本,以便将其最新版本存储在内存中、从磁盘中删除,并在另一个系统重新启动之前删除。使用两种方法来实现此目的:
读取 eScan 文件夹位置HKEY_LOCAL_MACHINE\SOFTWARE\AVC3
如果检查的进程之一被称为download.exe,这是一个合法的 eScan 二进制文件,它会获取文件位置来发现该文件夹。输出可能如下所示:

  • \Device\HarddiskVolume1\Program Files (x86)\eScan\download.exe
    检查download.exe作为查找 eScan 安装文件夹的替代方法,该代码似乎深受MSDN 上 从文件句柄获取文件名的示例代码的启发。

最后,Puppeteer 还持续监控系统的 CPU 使用情况,并以一种不会过于占用资源且保持低调的方式调整核心分配。

后门设置

4dfd082eee771b7801b2ddcea9680457f76d4888c64bb0b45d4ea616f0a47f21
(2019-06-29 03:38:24 UTC)

后门是由前一阶段 Puppeteer 设置的,首先会发现计算机是否在 Windows Server 上运行。这是通过检查 DNS 服务器注册表项来完成的(DNS 服务器服务通常在 Windows Server 版本上运行):
SOFTWARE\Microsoft\Windows NT\CurrentVersion\DNS Server
之后,恶意软件运行命令来检查并获取加入域的计算机数量:
net group “domain computers” /domain

该命令打印的数据net group通常使用每台加入域的计算机 25 个字符,加上每三台计算机一个换行符 ( CR+LF),可以通过以下示例进行说明:

net group 命令的输出示例
在此版本的后门设置中,Puppeteer 检查返回的字节数是否超过 100。如果是,Puppeteer 假设它在与至少五台计算机共享的网络中运行,并从硬编码的 C&C ( https://m.airequipment[.]net/gpse/) 下载额外的有效负载并执行它使用 PowerShell 命令。

请注意,在 GuptiMiner 的更高版本中,返回字节数的阈值有所不同,并且明显更高,这可以在讨论模块化后门的专门部分中看到,导致仅损害那些在同一域中加入超过 7000 台计算机的网络!

如果上述检查通过,Puppeteer 将使用 PowerShell 命令下载并执行有效负载,有趣的是,它既在当前进程中运行,又注入到explorer.exe.

此外,无论受感染的计算机是否存在于一定规模的网络中,它也会尝试从中下载额外的有效负载dl.sneakerhost[.]com/u。此有效负载是另一个带有附加 shellcode 的 PNG 文件。我们知道这一点是因为代码使用与阶段 10x325中所述的 PNG 文件的特定偏移量完全相同的解析。然而,在我们的分析过程中,该域名已被删除,我们无法验证此处分发的有效负载类型。

Puppeteer 的后门设置过程在其长期开发过程中进行了多次改进和调整。在接下来的小节中,我们将重点关注更重要的变化,主要是那些影响恶意软件其他部分或呈现全新功能的变化。

更高的木偶师版本

在更高版本中,攻击者切换到日期时间互斥范例(如时间部分中的互斥体中所示),并且还引入了对更多 Sysinternals 工具(如 Process explorer、Process Monitor)以及其他工具(如 OllyDbg、WinDbg 和 TeamViewer)的附加进程监控。

矿池配置

487624b44b43dacb45fd93d03e25c9f6d919eaa6f01e365bb71897a385919ddd
(2023-11-21 18:05:43 UTC)

此外,GuptiMiner 的作者们也开始采用新的方法修改 XMRig 配置中的矿池地址。他们开始使用“r”和“m”作为子域名,这取决于受感染系统上可用的物理内存。如果至少有 3 GB 的 RAM 可用,恶意软件会使用:
m.domain.tldwithauto模式并启用大页面。

如果可用 RAM 小于 3 GB,则使用:
r.domain.tldwithlight模式和禁用大页。

为了不让事情变得简单,作者后来在某些版本中也开始使用“ p ”作为子域名,没有任何特定的命名约定原因(也许只是说它是一个“池” )。

所有此类域的使用情况可以在域时间线中及时看到。

使用的 DLL 的多样性

多年来,Puppeteer 使用许多不同名称和位置的 DLL 进行旁加载或使用计划任务直接加载。例如,这些可能是:

C:\Program Files (x86)\eScan\updll3.dll3
C:\Program Files\Common Files\SYSTEM\SysResetErr\SysResetErr.DLL
C:\Program Files\Microsoft SQL Server\SpellChecking\MsSpellChecking.DLL
C:\Program Files\Microsoft SQL Server\SpellChecking\MsSpellCheckingHost.DLL
C:\ProgramData\AMD\CNext\atiadlxx.dll
C:\ProgramData\Microsoft\Assistance\LunarG\vulkan-1.dll
C:\ProgramData\Microsoft\Crypto\Escan\updll3.dll
C:\ProgramData\Microsoft\Crypto\Escan\updll3.dll3
C:\ProgramData\Microsoft\Network\Escan\AutoWake.dll

傀儡师清理

1c31d06cbdf961867ec788288b74bee0db7f07a75ae06d45d30355c0bc7b09fe
(2020-03-09 00:57:11 UTC)

我们还看到了“更干净”的 Puppeteers,这意味着它们不包含后门的设置过程,但当检测到正在运行的监控工具时,它们能够从系统中删除恶意 DLL。

每季度部署

1fbc562b08637a111464ba182cd22b1286a185f7cfba143505b99b07313c97a4
(2021-03-01 10:43:27 UTC)

在此特定版本中,后门的部署每 3 个月执行一次,即每季度部署一次。


部署发生在三月、六月、九月和十二月

第4阶段 - 后门

由于没有人在恶意软件活动中付出如此大的努力,只会在受感染的设备上部署挖矿程序,因此让我们更深入地研究 GuptiMiner 的其他功能集 - 在受感染的设备上部署两种类型的后门。

PuTTY后门

07beca60c0a50520b8dbc0b8cc2d56614dd48fef0466f846a0a03afbfc42349d
(2021-03-01 10:31:33 UTC)
E:\Projects\putty-src\windows\VS2012\x64\Release\plink.pdb

GuptiMiner 部署的后门之一基于 PuTTY Link ( plink ) 的自定义构建。此版本包含本地 SMB 网络扫描的增强功能,它最终能够通过网络横向移动,通过受害者受感染设备传输 SMB 流量来潜在地利用 Windows 7 和 Windows Server 2008 计算机。

本地SMB扫描

首先,Puppeteer 使用每季度部署的方法将 plink 二进制文件注入到 netsh.exe 进程中。成功注入后,恶意软件通过读取受害者设备的 IP 表来发现本地 IP 范围,并将其添加到本地和全局 IP 范围列表中。

这样,恶意软件就会继续在获取的 IP 范围上进行本地 SMB 扫描:xx.yy.zz.1-254.当发现支持 SMB 的设备时,会将其保存在专用列表中。不支持 SMB 的 IP 也是如此,有效地拒绝将它们列入未来的操作中。此拒绝列表保存在名为Sem和的特定注册表子项中Init,位于以下位置:
HKEY_LOCAL_MACHINE \SYSTEM\CurrentControlSet\Control\CMF\Class
其中Init包含找到的 IP 地址及其Sem总数。

执行此类扫描时会发生一些条件。例如,扫描只能在一周中的某一天(!)、每季度部署时进行,并且只能在中午 12 点到 18 点之间进行。在这里,我们在条件中用唯一的(!)编码制品表示,因为不需要检查星期几(始终为真)。


SMB 扫描的条件有问题
最后,恶意软件还会HKEY_LOCAL_MACHINE\SYSTEM\RNG\FFFF在成功扫描三小时后创建一个新的注册表项。这作为扫描应该完成的标志,并且不需要更多扫描。

RNG\FFFF在注册表删除的条件中可以看到一个更有趣的与日期时间相关的错误。删除的目的是表明恶意软件可以在一段时间后执行另一次 SMB 扫描。

如下图所示,恶意软件通过SystemTimeToVariantTimeAPI函数获取注册表项的写入时间和当前系统时间,并将它们相减。减法结果是一个浮点数,其中整数部分表示天数。
此外,恶意软件606060*24=5184000在删除注册表项的条件下使用恒定的秒数(60 天)。然而,条件是将VariantTime(天)与秒进行比较。因此,后门可以每天激活,51.84而不是(预期的?)60 天。真正因祸得福。

删除 RNG\FFFF 密钥,在 51.84 天后部署后门

SMB 流量上的横向移动

本地 SMB 扫描完成后,恶意软件会根据收到的 SMB 数据包结果检查响应的 IP 地址是否正在运行Windows 7或Windows Server 2008.如果在本地网络上发现任何此类系统,恶意软件会将这些 IP 地址添加到潜在目标列表中。

此外,GuptiMinermain()使用人工参数执行 plink 中的遗留函数。这将445在攻击者的服务器gesucht[.]net和受害者的设备 之间的端口上创建一条隧道。

plink main()函数使用的参数
该隧道用于通过受害者的设备将 SMB 流量发送到目标列表中的 IP 地址,从而实现本地网络上的横向移动。
请注意,部署此后门的这个版本的 Puppeteer 是从 2021 年开始的。我们还提到了 onlyWindows 7和Windows Server 2008是有针对性的,它们相当古老。我们认为这可能是因为攻击者试图在这些旧系统上部署可能存在的漏洞。
TID为了编排 SMB 通信,后门通过修改和字段来动态手工制作 SMB 数据包,UID以反映以前的 SMB 通信。如下面的反编译代码所示,packet 4由恶意软件制作和发送的 SMB 包含本地网络设备的响应中的 TID和UID

后门动态手工制作 SMB 数据包

在这里,我们提供了恶意软件发送 SMB 数据包在 Wireshark 中的样子的示例。建立连接后,恶意软件会尝试以匿名身份登录,并向\IPC$命名管道发出请求。

Wireshark 捕获的 SMB 流量
有兴趣的读者可以在我们的GitHub上找到捕获的 PCAP 。

模块化后门

f0ccfcb5d49d08e9e66b67bb3fedc476fdf5476a432306e78ddaaba4f8e3bbc4
(2023-10-10 15:08:36 UTC)

我们在研究过程中发现的另一个由 Puppeteer 分发的后门是一个针对大型企业网络的模块化后门。它由两个阶段组成——恶意软件扫描设备是否存在本地存储的私钥和加密货币钱包,第二部分是以 shellcode 的形式注入模块化后门。

检查私钥、钱包和公司网络

这部分后门重点扫描系统上的私钥和钱包文件。这是通过在以下位置搜索 .pvk 和 .wallet 文件来完成的:

  • C:\Users*
  • D:*
  • E:*
  • F:*
  • G:*
    如果系统中找到这样的文件,则其路径会记录在新创建的文件中C:\Users\Public\Ca.txt。有趣的是,我们可用的代码并没有单独处理该文件。我们假设稍后当后门下载更多模块时,数据将被窃取。

执行扫描的事实是通过创建注册表项来标记的:
HKEY_LOCAL_MACHINE\SYSTEM\Software\Microsoft\DECLAG

如果在系统上发现一些私钥或钱包,或者恶意软件在大型企业环境中运行,则恶意软件会继续以 shellcode 的形式将后门注入到进程中mmc.exe。
企业环境规模的猜测与Puppeteer后门设置的方式相同,只是规模不同。在此,恶意软件将域中返回的计算机列表与 200,000 个字符进行比较。概括地说, net group 命令打印的数据每台加入域的计算机使用 25 个字符,加上每三台计算机一个换行符 ( CR+LF )。


net group命令输出示例
这实际上意味着恶意软件运行的网络必须至少有 7781 台计算机加入域,这是一个相当大的数字。

后门

8446d4fc1310b31238f9a610cd25ea832925a25e758b9a41eea66f998163bb34

该 shellcode 与我们迄今为止在 GuptiMiner 活动中看到的代码完全不同。它被设计为多模块,能够在执行流程中添加更多模块。然而,只有网络通信模块是硬编码的并且默认可用,其散列为. 74d7f1af69fb706e87ff0116b8e4fa3a9b87275505e2ee7a32a8628a2d066549 (2022-12-19 07:31:39 UTC)

注入后,后门使用 RC4 解密硬编码配置和硬编码网络模块。 RC4 密钥也是硬编码的,可直接在 shellcode 中使用。

配置包含有关要联系哪个服务器、要使用哪些端口、命令/请求之间应设置的延迟长度等详细信息。此配置中用于通信的域是www.righttrak[.]net:443IP 地址185.248.160[.]141。

解密网络模块配置
网络模块包含七个不同的命令,攻击者可以使用这些命令来指示后门做什么。网络模块接受的命令的完整列表可以在下表中找到。请注意,后门可以使用的每个模块都包含自己的这样的命令处理程序。

这些模块以加密形式存储在注册表中,确保其持久性:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PCB

该后门还使用哈希混淆导入来解析 API 函数。哈希函数是一个简单的算法,它获取导出函数名称的每个字节,加 1,然后将之前计算的数字(calculated_hash,从 0 开始)乘以 131,并将其添加到该字节:

服务器www.righttrak[.]net:443当时拥有有效的证书。例如,请注意作者使用的 完全不可疑的电子邮件地址。


Censys 显示的 www.righttrak[.]net:443 上的证书

模块化后门的其他感染载体

af9f1331ac671d241bf62240aa52389059b4071a0635cb9cb58fa78ab942a33b

在我们的研究过程中,我们还发现了一个 7zip SFX 可执行文件,其中包含两个文件:

  • ms00.dat
  • notepad.exe
    notepad.exe是一个小型二进制文件,ms00.dat使用 RC4 和密钥来解密文件V#@!1vw32。解密的ms00.dat文件与上述相同的模块化后门恶意软件。

然而,我们还没有看到 GuptiMiner 分发这个 SFX 可执行文件。这表明该后门也可能由不同的感染媒介传播。

相关和未来的研究

在我们的研究过程中,我们还观察到了其他或多或少相关的样本。

PowerShell 脚本

有趣的是,我们还在其他脚本中发现了来自后门设置阶段(在 Puppeteer 中)的 C&C 域,这些脚本并不是由我们所知的传统 GuptiMiner 操作分发的。我们认为这可能是共享 GuptiMiner 基础设施的另一种攻击,尽管它可能是不同的活动。格式化的 PowerShell 脚本如下:

针对 eScan 的 PowerShell 脚本(已格式化)
在这种情况下,仅当安装了防病毒软件时,才会从恶意域下载并执行有效负载,并且其名称超过 4 个字母并以eS.即使不是拼字游戏冠军,也能发现恶意软件作者再次瞄准了 eScan AV。当安装的 AV 名称少于 5 个字母时,恶意代码也会运行。

我们发现该脚本通过计划任务使用使用的命令运行:

"cmd.exe" /c type "\<domain>\SYSVOL\<domain>\scripts\gpon.inc" | "\<domain>\SYSVOL\<domain>\scripts\powAMD64.dat" -nop -

其中 powAMD64.dat 是 powershell.exe 的副本。任务名称和位置为C:\Windows\System32\Tasks\ScheduledDefrag

被盗证书的使用

我们发现了两个被盗的用于签署 GuptiMiner 有效负载的证书。有趣的是,其中一份被盗证书源自 Winnti 操作。在此特定示例中,数字签名具有哈希值:
529763AC53562BE3C1BB2C42BCAB51E3AD8F8A56

这个证书和卡巴斯基10多年前提到的一样。然而,我们还发现该证书被用于多个恶意软件样本,而不仅仅是 GuptiMiner,这表明泄漏范围更广。

被盗证书及其用途的完整列表如下表所示:

与 Kimsuky 的可能联系

7f1221c613b9de2da62da613b8b7c9afde2ea026fe6b88198a65c9485ded7b3d
(2021-03-06 20:13:32 UTC)

在我们的研究过程中,我们还发现了一个信息窃取程序,它拥有与整个 GuptiMiner 活动中使用的相当相似的 PDB 路径 ( MainWork):
F:!PROTECT\Real\startW-2008\MainWork\Release\MainWork.pdb

但是,我们还没有看到它是由 GuptiMiner 分发的,并且根据我们的数据,它不属于同一操作和感染链。该恶意软件执行窃取活动,例如捕获每次击键、从打开的浏览器选项卡中收集 HTML 表单、记录打开程序的时间等,并将其存储在日志文件中。

然而,真正有趣的是,这个信息窃取者可能来自 Kimsuky 的操作。 Kimsuky 也被称为 Black Banshee 等别名,是朝鲜国家支持的 APT 组织。

它包含与AhnLab和Cisco Talos Intelligence在其信息收集模块49B46336-BA4D-4905-9824-D282F05F6576部分中提到的类似的搜索 AhnLab 实时检测窗口类名称的方法。如果发现这样的窗口,它将被终止/隐藏在受感染用户的视野之外。


搜索并终止AhnLab实时检测窗口类的函数
此外,窃取者在资源中包含加密的有效负载,具有哈希值:并且具有以下 PDB 路径:d5bc6cf988c6d3c60e71195d8a5c2f7525f633bb54059688ad8cfa1d4b72aa6c (2021-02-19 19.02.2021 15:00:47 UTC)
F:\PROTECT\Real\startW-2008\HTTPPro\Release\HTTPPro.pdb

该模块使用标准 RC4 算法和密钥进行解密messi.com。该模块用于下载附加阶段。使用的 URL 之一是:
http://stwu.mygamesonline[.]org/home/sel.php
http://stwu.mygamesonline[.]org/home/buy.php?filename=%s&key=%s

该域名mygamesonline[.]org是 Kimsuky 常用的域名(具有各种子域名)。

键盘记录器还会下载下一阶段,称为ms12.acm:

下一阶段下载时带有名称ms12.acm
这样,我们就看到了一种可能的模式,具有命名约定和模块化后门的链接。正如“其他感染媒介”部分中所述,7z SFX 存档包含一个名为 的加密文件ms00.dat,我们很难忽略它的相似之处。

dddc57299857e6ecb2b80cbab2ae6f1978e89c4bfe664c7607129b0fc8db8b1f最后但并非最不重要的一点是,另一个可能归因的强有力指标是Talos 的同一篇博文中提到的Kimsuky 键盘记录器样本包含一个名为 的部分.vlizer,如下所示:

Kimsuky 键盘记录器部分
在 GuptiMiner 安装过程(第 0 阶段)中,我们撰写了有关威胁参与者在 2018 年引入代码虚拟化的文章。这是通过使用名为 的专用部分来完成的.v_lizer。

结论

在本次分析中,我们详细描述了有关我们称为 GuptiMiner 的长期威胁的发现。这种复杂的操作一直在针对 eScan 防病毒供应商的更新机制进行 MitM 攻击。我们向 eScan 和印度 CERT 披露了该安全漏洞,并于 2023 年 7 月 31 日收到 eScan 的确认,表明该问题已修复并成功解决。
在 GuptiMiner 操作期间,攻击者部署了广泛的阶段和功能链,包括向攻击者的 DNS 服务器执行 DNS 请求、侧载、从看似无辜的图像中提取有效负载、使用自定义的受信任根锚点证书颁发机构对其有效负载进行签名等其他的。
发现了两种不同类型的后门,针对大型企业网络。第一个提供了本地网络的 SMB 扫描,允许通过网络进行横向移动,从而可能利用网络上易受攻击的 Windows 7 和 Windows Server 2008 系统。第二个后门是多模块的,在后台接受命令以安装更多模块,并专注于窃取存储的私钥和加密钱包。
有趣的是,GuptiMiner 分发的最终有效负载也是 XMRig,这对于如此深思熟虑的操作来说有点出乎意料。
我们还发现了与臭名昭著的朝鲜 APT 组织 Kimsuky 可能存在的联系,同时观察 Kimsuky 键盘记录器与 GuptiMiner 操作分析过程中发现的片段之间的相似性。

eScan跟进

在发布此分析之前,我们已与 eScan 分享了我们的发现和研究。为了完整起见,我们添加了他们关于此主题的声明:
“我还想强调一些关键点:

  1. 我们的记录显示,最后一次类似报告是在 2019 年底收到的。
  2. 自 2020 年以来,我们实施了严格的检查机制,利用 EV 签名来确保未签名的二进制文件将被拒绝。
  3. 我们的解决方案已集成多种启发式规则,以检测和阻止用于挖掘的合法进程的任何实例,包括未签名二进制文件的分叉。
  4. 虽然我们的内部调查没有发现 XRig 矿工的实例,但这可能是由于地理位置因素造成的。
  5. 我们最新的解决方案版本采用安全 (https) 下载,确保当客户端与我们面向云的服务器交互以进行更新下载时进行加密通信。”
    根据我们的遥测数据,我们继续观察新的感染情况,并且 GuptiMiner 在我们的用户群中构建。这可能是由于这些设备上的 eScan 客户端未正确更新所致。

IoC

https://github.com/avast/ioc/tree/master/GuptiMiner

0 条评论
某人
表情
可输入 255