XorDdos使用各种持久性机制,在系统启动时会自动支持不同的Linux发行版,如下所示。 初始化脚本 恶意软件会在/etc/init.d位置放置一个初始化脚本。初始化脚本是用于在系统启动时运行任何程序的启动脚本。它们遵循Linux标准基础(LSB)样式的标头部分,包括默认运行级别、描述和依赖项。 放置在/etc/init.d/HFLgGwYfSC.elf位置的init脚本的内容 Cron脚本 恶意软件在/etc/cron.hour/gcc.sh的位置创建一个cron脚本。该cron脚本传递的参数如下: gcc.sh脚本内容 然后它会创建一个/etc/crontab文件以每三分钟运行一次/etc/cron.hourly/gcc.sh: 从/etc/crontab文件中删除/etc/cron.hourly/gcc.sh条目并添加新条目的系统命令 文件“/etc/crontab.conf”的内容 SystemV运行级别 运行级别是init和系统的一种模式,用于指定UnixsystemV-Style操作系统正在运行哪些系统服务。运行级别包含一个值,通常编号为0到6,每个值指定不同的系统配置,并允许访问不同的进程组合。一些系统管理员根据他们的需要设置系统的默认运行级别,或者使用运行级别来识别哪些子系统正在工作,例如网络是否正常运行。/etc/rc< run_level > 目录包含符号链接(符号链接),符号链接是指向原始文件的软链接。这些符号链接指向应在指定的运行级别运行的脚本。 这个恶意软件为放置在 /etc/init.d/< base_file_name > 位置的 init 脚本创建一个符号链接,这些目录与 /etc/rc< run_level >.d/S90 和 /etc/rc.d/rc< run_level >.d/S9< base_file_name >0< base_file_name >的 runlevels 1 到 5 相关联。 使用/etc/init.d/< base_file_name > 安装 rc.d 目录的符号链接脚本 自动启动服务 该恶意软件运行一个命令来安装启动服务,这些服务会在启动时自动运行XorDdos。恶意软件的LinuxExec_Argv2子例程使用提供的参数运行系统API。 命令chkconfig–add< service_name > 和 update-rc.d 然后添加一个在引导时启动守护进程的服务。 chkconfig和update-rc.d命令安装启动服务
XorDdos具有与提供给程序的参数数量相对应的特定代码路径。这种灵活性使它的操作更加健壮和隐秘。恶意软件首先在没有任何参数的情况下运行,然后运行另一个带有不同参数的实例,比如pid和假命令,以执行清理、欺骗和持久化等功能。 在处理基于参数的控件之前,它调用readlinkAPI,第一个参数为/proc/self/exe以获取其完整的进程路径。完整路径稍后用于创建自动启动服务条目并读取文件内容。 以下是不同参数的功能: 1.不带任何参数的标准代码路径 此代码路径描述了恶意软件的标准工作流程,这也是XorDdos作为在系统启动位置创建的条目的一部分运行的典型工作流程。 恶意软件首先检查它是否从/usr/bin/、/bin/或/tmp/位置运行。如果它没有从这些位置运行,那么它会在这些位置以及/lib/和/var/run/上使用10个字符的字符串名称创建并自我复制。 它还在/lib/libudev.so位置创建了自己的一个副本。为了避免基于哈希值的恶意文件查找,它执行以下步骤,修改文件哈希值,使每个文件都是唯一的: 只有写入时才会打开文件; 调用lseek(fd,0,SEEK_END)指向文件中的最后一个位置; 创建一个10个字符的随机字符串; 在文件末尾写入带有额外空字节的字符串; 修改文件后,它运行二进制文件,执行双fork(),并从磁盘中删除其文件。 恶意软件文件的末尾包含两个随机字符串,“wieegnexuk”和“yybrdajydg”,表明原始恶意软件二进制文件被修改了两次 2.清理代码路径 在此代码路径中,恶意软件使用作为PID提供的另一个参数运行,例如: /usr/bin/jwvwvxoupv4849 使用上面的示例,恶意软件与IPC密钥“0xDA718716”共享64字节大小的内存段,以检查作为参数提供的另一个恶意软件进程。如果没有找到,它会运行自己的二进制文件而不带任何参数,并调用fork()API两次以确保第三代子进程没有父进程。这导致第三代进程被init进程采用,从而将其与进程树断开连接并充当反取证技术。 另外,它在提供的$pid上执行以下任务:
3.进程名欺骗代码路径 这个恶意软件生成了带有两个附加参数的新的被删除的二进制文件:一个假的命令行及其PID,例如: 虚假命令可以包括: 在此代码路径中,恶意软件使用进程名称欺骗通过在运行时修改其虚假命令行来隐藏进程树。然后,它通过使用命令“1”调用HidePidPort来隐藏其进程,并读取与当前进程相关的磁盘上文件的内容。 然后,它进入一个5秒的循环,执行以下检查: 3.1通过调用/proc/$pid/exe上的readlinkAPI,获取特定于作为第三个参数的一部分提供的$pid的文件名。 3.2如果readlink调用失败,这可能表明磁盘上的文件不存在。在这种情况下,会发生以下5种情况: 3.2.1打算删除$pid的所有服务相关条目但失败。这似乎是由于一个代码缺陷造成的,当缓冲区应该从成功的readlinkAPI调用中填充时,该漏洞允许将归零缓冲区作为服务名称传递。 3.2.2创建类似于标准代码路径方案的目录。 3.2.3调用文件/lib/libudev.so的statAPI。如果statAPI返回一个非零值,那么它会尝试将先前获取的当前进程的图像文件的内容复制到以下位置,并使用随机名称: /usr/bin/ /bin/ /tmp/ 3.2.4如果对/lib/libdev.so的statAPI调用成功,则将/lib/libudev.so文件复制到上面列出的相同的三个目录中。 3.2.5更改写入或复制文件的哈希值,然后在不传递任何参数的情况下运行它。 3.3如果readlink调用成功并返回复制的字节数,则休眠一秒钟,然后在五秒钟内循环剩余时间。 3.4取消隐藏当前进程和作为第三个参数的一部分提供的$pid; 3.5删除当前进程的磁盘文件。 4.没有提供任何参数的已知位置代码路径 此代码路径与标准代码路径相似,主要区别在于恶意软件从以下位置运行: 一旦它从其中一个位置运行,恶意软件就会调用以下函数来执行各种任务: 4.1InstallSYS——顾名思义,这个函数是一个应该部署rootkit驱动程序的包装器,但它只清零两个本地数组。 虚拟InstallSYS例程 4.2AddService——创建前面提到的持久自动启动项,以便恶意软件在系统启动时运行。 4.3HidePidPort——隐藏恶意软件的端口和进程。 4.4CheckLKM——检查rootkit设备是否处于活动状态。它使用数字“0x9748712”和命令“0”的类似IOCTL调用来查找rootkit是否处于活动状态。如果rootkit处于活动状态,它会使用所有者值“0xAD1473B8”和组值“0xAD1473B8”通过函数lchown(< 文件名 >、0xAD1473B8、0xAD1473B8)。 4.5decrypt_remotestr——使用相同的XOR密钥“BB2FA36AAA9541F0”解码远程URL,以解码config.rar和其他目录。解码URL后,它将它们添加到一个远程列表中,该列表稍后用于从命令和控制(C2)服务器通信和获取命令: www[.]enoan2107[.]com:3306 www[.]gzcfr5axf6[.]com:3306
在创建持久条目、删除其活动证据并解码config.rar之后,恶意软件使用sem_initAPI初始化循环冗余校验(CRC)表,后跟未命名的信号量。该信号量使用apshared值设置为“0”进行初始化,从而使生成的信号量在所有线程之间共享。信号量用于维护访问共享对象的线程之间的并发性,例如kill_cfg数据。 然后恶意软件初始化三个线程来执行恶意活动,例如停止进程、创建TCP连接和检索kill_cfg数据。 信号量和恶意线程初始化 kill_process kill_process线程执行以下任务: 解码加密字符串; 获取/var/run/gcc.pid的文件统计信息,如果不存在,则创建文件; 获取/lib/libudev.so的文件统计信息,如果不存在,则创建目录/lib并在/lib/libudev.so位置创建自身的副本; 获取与当前进程相关的磁盘文件信息;如果失败,则退出循环并停止当前进程; 从kill_cfg中读取内容,并根据配置文件中匹配的指定项执行相应的操作,如停止进程或删除文件,例如: tcp_thread tcp_thread触发与之前使用decrypt_remotestr()解码的C2服务器的连接。它执行以下任务: 读取文件/var/run/gcc.pid的内容,获取一个唯一的32字节魔术字符串,用于在连接C2服务器时识别设备;如果该文件不存在,则创建该文件并使用一个随机的32字节字符串对其进行更新。 计算CRC标头,包括设备的详细信息,例如魔术字符串、操作系统版本、恶意软件版本、rootkit存在、内存统计信息、CPU信息和LAN速度。 加密数据并将其发送到C2服务器。 等待从C2服务器接收以下任何命令,然后使用exec_packet子例程对该命令进行操作。 系统信息收集 daemon_get_killed_process daemon_get_killed_processthread从之前解码的远程URL(hxxp://aa[.]hostasa[.]org/config[.]rar)下载kill_cfg数据,并使用前面提到的相同XOR密钥对其进行解密。然后它会休眠30分钟。 daemon_get_killed_process线程函数从远程URL获取并解码kill_cfg数据
恶意软件调用sysconf(_SC_NPROCESSORS_CONF)来获取设备中的处理器数量。然后,它创建的线程数量是设备上找到的处理器数量的两倍。 在内部调用每个线程都会调用线程例程threadwork。使用全局变量“g_stop”和从C2服务器接收的命令,threadwork然后发送精心制作的数据包65535次以执行DDoS攻击。
XorDdos的模块化特性为攻击者提供了一种多功能木马,能够感染各种Linux系统架构。它的SSH暴力攻击是一种相对简单但有效的技术,可用于获得对许多潜在目标的root访问权限。 XorDdos擅长窃取敏感数据、安装rootkit设备、使用各种规避和持久性机制以及执行DDoS攻击,使攻击者能够对目标系统造成潜在的重大破坏。此外,XorDdos可用于引入其他危险威胁或为后续活动提供载体。 XorDdos和其他针对Linux设备的威胁都表明,拥有跨越众多Linux操作系统发行版、具有全面能力和完整可见性的安全解决方案是多么重要。MicrosoftDefenderforEndpoint提供了这样的可见性和保护,以捕捉这些新出现的威胁,其下一代反恶意软件和终端检测和响应(EDR)功能。利用来自集成威胁数据的威胁情报,包括客户端和云启发式、机器学习模型、内存扫描和行为监控,MicrosoftDefenderforEndpoint可以检测和补救XorDdos及其多阶段模块化攻击。这包括检测和防止其使用恶意shell脚本进行初始访问、从全局可写位置放置并执行二进制文件以及终端上的任何潜在后续活动。 参考及来源:https://www.microsoft.com/security/blog/2022/05/19/rise-in-xorddos-a-deeper-look-at-the-stealthy-ddos-malware-targeting-linux-devices/ |