
![]()
几个月前,Intezer的安全研究人员Joakim Kennedy和BlackBerry威胁研究与情报团队发现了一种新出现的且从未被检测到的 Linux恶意软件,研究人员已将其命名为 Symbiote。
Symbiote 与通常遇到的其他 Linux 恶意软件的不同,它需要感染其他正在运行的进程才能对受感染的设备发起攻击。它不是一个运行以感染设备的独立可执行文件,而是一个共享对象 (SO) 库,它使用 LD_PRELOAD (T1574.006) 加载到所有正在运行的进程中,然后通过寄生的方式潜入设备实施攻击。一旦它感染了所有正在运行的进程,它就会获得攻击目标的 rootkit 功能、获取凭证的能力和远程访问能力。
LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的目的。
![]()
Symbiote的首次出现
最早发现 Symbiote 是在 2021 年 11 月,它似乎是针对拉丁美洲的金融部门而编写的。一旦感染成功,它就会隐藏起来。由于恶意软件隐藏了所有文件、进程和网络构件,因此在受感染的设备上执行实时取证可能不会发现任何问题。除了 rootkit 功能外,该恶意软件还为攻击者提供了一个后门,以使用硬编码密码以设备上的任何用户身份登录,并以最高权限执行命令。
截止发稿时,研究人员还未找到足够的证据来确定 Symbiote 是否被用于高度针对性或广泛的攻击。
Symbiote 的一个特殊之处是其 Berkeley Packet Filter (BPF) 挂钩功能。Symbiote 并不是第一个使用 BPF 的 Linux 恶意软件。例如, 方程式组织(Equation Group)开发的高级后门一直在使用 BPF 进行隐蔽通信。然而,Symbiote 利用 BPF 隐藏受感染设备上的恶意网络流量。当管理员在受感染的设备上启动任何数据包捕获工具时,BPF 字节码被注入内核,定义应该捕获哪些数据包。在这个过程中,Symbiote 首先添加它的字节码,这样它就可以过滤掉它不希望数据包捕获软件看到的网络流量。
![]()
逃避检测
Symbiote非常隐蔽,该恶意软件被设计为通过LD_PRELOAD指令由链接器加载。这允许它在任何其他共享对象之前加载。由于它首先被加载,才可以从为应用程序加载的其他库文件中“劫持导入”。Symbiote 使用它通过挂钩 libc 和 libpcap 函数来隐藏它在设备上的存在。逃避检测过程如下图所示。
![]()
Symbiote逃避检测技术
![]()
Host 活动
Symbiote 恶意软件除了隐藏自己在设备上的存在外,还隐藏与可能与其一起部署的恶意软件相关的其他文件。在二进制文件中,有一个 RC4 加密的文件列表。调用挂钩函数时,恶意软件首先会动态加载 libc 并调用原始函数。此逻辑用于所有挂钩函数。具体示例如下图所示。
![]()
从 libc 解析 readdir 的逻辑
如果调用应用程序试图访问 /proc 下的文件或文件夹,恶意软件会删除其列表中进程名称的输出。下面列表中的进程名称是从我们发现的样本中提取的。
![]()
如果调用应用程序没有尝试访问 /proc 下的内容,则恶意软件会从文件列表中删除结果。从我们检查的所有样本中提取的文件显示在下面的列表中。一些文件名与 Symbiote 使用的文件名相匹配,而其他文件名与疑似是受感染设备上的攻击者使用的工具的文件名相匹配。该列表包括以下文件。
![]()
通过LD_PRELOAD将Symbiote加载到进程中的一个后果是,像 ldd 这样的工具(一种打印每个程序所需的共享库的实用程序)会将恶意软件列为加载的对象。为了解决这个问题,恶意软件挂钩 execve 并在环境变量 LD_TRACE_LOADED_OBJECTS 设置为 1 的情况下查找对该函数的调用。ldd 的手册页是这样解释其中原因的:
通常情况下,ldd 调用标准动态链接器,并将 LD_TRACE_LOADED_OBJECTS 环境变量设置为 1。这会导致动态链接器检查程序的动态依赖关系,并找到加载满足这些依赖关系的对象。对于每个依赖项,ldd 显示匹配对象的位置和加载它的十六进制地址。
当恶意软件检测到这一点时,它会像 ldd 一样执行加载程序,但它会从结果中删除自己的条目。
![]()
网络活动
Symbiote 还具有隐藏受感染设备上的网络活动的功能。它使用三种不同的方法来实现这一点。第一种方法涉及挂钩 fopen 和 fopen64。如果调用应用程序尝试打开 /proc/net/tcp,恶意软件会创建一个临时文件并将第一行复制到该文件。然后,它扫描每一行,以确定是否存在特定端口。如果恶意软件在它正在扫描的一行中找到了它正在搜索的端口,它就会跳到下一行。否则,该行被写入临时文件。一旦原始文件被完全处理,恶意软件就会关闭文件,并将临时文件的文件描述符返回给调用者。本质上,这给了调用进程一个清除的结果,它排除了恶意软件想要隐藏的所有网络连接条目。
Symbiote 用来隐藏其网络活动的第二种方法是劫持任何注入的数据包过滤字节码。Linux 内核使用扩展的 Berkeley Packet Filter (eBPF)来允许基于用户域进程提供的规则进行数据包过滤。过滤规则以内核在虚拟机 (VM) 上执行的 eBPF 字节码的形式提供。因为内核直接执行过滤,这最大限度地减少了内核和用户空间之间的上下文切换,从而提高了性能。
如果受感染设备上的应用程序尝试使用 eBPF 执行数据包过滤,Symbiote 会劫持过滤过程。首先,它挂钩了 libc 函数 setsockopt。如果使用选项 SO_ATTACH_FILTER 调用该函数,该选项用于在套接字上执行数据包过滤,它会在调用应用程序提供的 eBPF 代码之前添加自己的字节码。
代码片段 1 显示了由 其中一个Symbiote 样本注入的字节码的注释版本。如果它们符合以下条件,则字节码被释放:
·IPv6(TCP 或 SCTP)和 src 端口(43253 或 43753 或 63424 或 26424);;
·IPv6(TCP 或 SCTP)和dst端口 43253;
·IPv4(TCP 或 SCTP)和 src 端口(43253 或 43753 或 63424 或 26424);
·IPv4(TCP 或 SCTP)和dst端口(43253 或 43753 或 63424 或 26424);
虽然此字节码仅根据端口释放数据包,但研究人员还观察到基于 IPv4 地址的流量过滤。在所有情况下,过滤都会对来自设备的入站和出站流量进行操作,以隐藏两个方向的流量。如果条件不满足,它只是跳转到调用应用程序提供的字节码的开头。
如代码片段 1 所示,从其中一个样本中提取的字节码包含 32 条指令。这段代码不能单独注入内核,因为它假定在它之后存在更多字节码。这个字节码中有一些跳转,会跳到调用进程提供的字节码的开头。如果没有调用者的字节码,注入的字节码会跳出边界,这是内核不允许的。像这样的字节码要么必须手写,要么通过修补编译器生成的字节码。这两种选择都表明该恶意软件是由熟练的开发人员编写的。
![]()
![]()
![]()
代码片段 1:从一个Symbiote 样本中提取的带注释的字节码
Symbiote 用来隐藏其网络流量的第三种方法是挂钩 libpcap 函数。恶意软件使用此方法过滤掉指向列表中域名的 UDP 流量。它挂钩函数 pcap_loop 和 pcap_stats 来完成这个任务。对于接收到的每个数据包,Symbiote 都会检查 UDP 有效负载以查找要过滤掉的域的子字符串。如果找到匹配项,恶意软件会忽略该数据包并增加一个计数器。pcap_stats 使用此计数器通过从处理的真实数据包数中减去计数器值来“更正”处理的数据包数。如果数据包有效负载不包含其列表中的任何字符串,则调用原始回调函数。该方法用于过滤掉 UDP 数据包,而字节码方法用于过滤掉 TCP 数据包。通过使用这三种方法,恶意软件可确保隐藏所有流量。
![]()
Symbiote的攻击目标
除了隐藏设备上的恶意活动外,该恶意软件的目标是获取凭据并为攻击者提供远程访问。凭证收集是通过挂钩 libc 读取函数来执行的。如果 ssh 或 scp 进程正在调用该函数,它会捕获凭据。凭证首先使用嵌入式密钥使用 RC4 加密,然后写入文件。例如,恶意软件的一个版本将捕获的凭据写入文件 /usr/include/certbot.h。
除了在本地存储凭据外,还会泄露凭据。数据经过十六进制编码并分块,以通过 DNS 地址 (A) 记录请求泄露到攻击者控制的域名。A 记录请求的格式如下:
代码片段 2:Symbiote 用于泄露数据的 DNS 请求结构
恶意软件检查设备是否在 /etc/resolv.conf 中配置了名称服务器。如果没有,则使用 Google 的 DNS (8.8.8.8)。除了向域名发送请求外,Symbiote 还将其作为 UDP 广播发送。
对受感染计算机的远程访问是通过连接几个Linux可插入身份验证模块(PAM)函数来实现的。当服务试图使用PAM对用户进行身份验证时,恶意软件会根据硬编码的密码检查提供的密码。如果提供的密码匹配,挂起的函数将返回一个成功响应。由于钩子在PAM中,所以它允许攻击者对使用PAM的任何服务设备进行身份验证。这包括像Secure Shell (SSH)这样的远程服务。
如果输入的密码与硬编码的密码不匹配,恶意软件会将其保存并泄露,作为其键盘记录功能的一部分。此外,恶意软件还会向其命令与控制 (C2) 域发送 DNS TXT 记录请求。TXT 记录的格式为 %MACHINEID%.%C2_DOMAIN%。如果收到响应,恶意软件 base64 会解码内容,检查内容是否已由正确的 ed25519 私钥签名,使用 RC4 解密内容,并在生成的 bash 进程中执行 shell 脚本。此功能可以作为一种打破僵局的方法运行,以在正常过程不起作用的情况下重新获得对设备的访问权限。
一旦攻击者通过受感染设备的身份验证,Symbiote 就会提供获得 root 权限的功能。首次加载共享对象时,它会检查环境变量 HTTP_SETTHIS。如果变量设置了内容,则恶意软件将有效用户和组 ID 更改为 root 用户,然后通过系统命令在执行内容之前删除变量。
此过程要求 SO 设置了 setuid 权限标志。一旦系统命令退出,Symbiote 也会退出进程,以防止原始进程执行。下图显示了执行的代码。这允许通过在 shell 中以任何用户身份运行 HTTP_SETTHIS= " /bin/bash -p " /bin/true作为shell中的任何用户。
![]()
使用root权限执行命令的逻辑
![]()
网络基础设施
Symbiote 恶意软件使用的域名冒充巴西的一些主要银行。这表明这些银行或其客户是Symbiote 的潜在目标。利用恶意软件使用的域名,研究人员成功地发现了一个相关的样本,该样本被上传到VirusTotal,名称为certbotx64。这个文件名与我们最初获得的Symbiote样本中列出的一个文件相匹配。该文件被识别为一个名为dnscat2的开源DNS隧道工具。
该示例在二进制文件中有一个配置,该配置使用 git[.]bancodobrasil[.]dev 域作为其 C2 服务器。在 2 月和 3 月期间,该域名解析为与 Njalla 的虚拟专用服务器 (VPS) 服务相关联的 IP 地址。DNS 记录显示,几个月前,相同的 IP 地址被解析为 ns1[.]cintepol[.]link 和 ns2[.]cintepol[.]link。Cintepol是巴西联邦警察提供的一个情报门户,该门户允许警察访问联邦警察提供的不同数据库,作为他们调查的一部分。用于此冒充域名的名称服务器从 2021 年 12 月中旬到 2022 年 1 月末一直处于活动状态。
同样从 2022 年 2 月开始,caixa[.]wf 域的名称服务器指向另一个 Njalla VPS IP。下图显示了这些事件的时间线。除了网络基础设施之外,还包括文件提交给 VirusTotal 的时间戳。这三个 Symbiote 样本是由来自巴西的同一提交者上传的。这些文件似乎是在基础架构上线之前提交给 VirusTotal 的。
鉴于这些文件是在基础设施上线之前提交给 VirusTotal 的,并且由于某些样本包含隐藏本地 IP 地址的规则,因此这些样本有可能在使用之前提交给 VirusTotal 以测试防病毒检测。此外,巴西于 11 月底提交了一个似乎正在开发中的版本,进一步表明 VirusTotal 正被 Symbiote 背后的攻击者或组织用于检测测试。
![]()
显示文件何时提交给 VirusTotal 以及网络基础设施何时启动的时间线
![]()
与其他恶意软件的相似之处
Symbiote 似乎是为窃取凭据和提供对受感染 Linux 服务器的远程访问而设计的。Symbiote 并不是第一个为此目的开发的 Linux 恶意软件。2014 年,ESET 发布了对 Ebury 的深入分析,Ebury 是一个 OpenSSH 后门,也会执行凭据窃取。两个恶意软件家族使用的技术有一些相似之处。两者都使用挂钩函数来捕获凭据并将捕获的数据作为 DNS 请求外泄。但是,这两个恶意软件家族对后门的身份验证方法是不同的。当我们第一次使用 Intezer Analyze 分析样本时,只检测到唯一代码。由于 Symbiote 和 Ebury/Windigo 或任何其他已知恶意软件之间没有共享代码,研究人员得出结论,Symbiote 是一种新的、未被发现的 Linux 恶意软件。
![]()
![]()
总结
Symbiote 是一种具有高度隐蔽性的恶意软件。它的主要目标是捕获凭据并加快对受感染设备的后门访问。由于恶意软件作为用户级 rootkit 运行,因此要检测到它很困难。
参考及来源:https://www.intezer.com/blog/research/new-linux-threat-symbiote/
到此这篇libnids源码分析(licode 源码分析)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/cjjbc/12728.html