铭说|针对新型恶意软件Redis P2Pinfect的发现与研究分析 |
来源:聚铭网络 发布时间:2023-08-16 浏览次数: |
近期,我们的研究人员遇到了一种针对Redis数据存储部署的新型恶意软件,该恶意软件被命名为“P2Pinfect”,它由Rust编写,主要被用来充当僵尸网络代理。该恶意软件样本包括一个可移植嵌入式文件(PE)以及一个附加的ELF可执行文件,这表明其具有跨平台兼容性。 据进一步研究发现,此变体是通过利用CVE-2022-0543进行传播,而CVE-2022-0543是Redis某些版本中存在的LUA沙箱逃逸漏洞。接下来铭说将为您做进一步的详细阐述。 P2Pinfect功能特性总结:
初始访问 研究人员在对蜜罐遥测进行分类时首次遇到了P2Pinfect。该恶意软件通过利用复制功能来破坏Redis数据存储的暴露实例,复制功能允许Redis实例以分布式方式运行。而这会允许追随者节点充当领导节点的精确副本,为数据存储和故障转移提供高可用性。 在云环境中,针对Redis的常见攻击模式是使用恶意实例来启用复制,通过连接到一个公开的Redis实例并发出SLAVEOF命令来实现。当复制完成后,攻击者就可以加载一个恶意模块(Linux共享对象文件),该模块扩展了Redis本身的功能。这种初始访问载体于2018年首次展示,此后多次被运用于云恶意软件活动中,其中包含H2miner和最近的Headcrab。
图1 P2Pinfect用于初始访问的Redis命令(事件排序是非线性的) P2Pinfect使用了多种已知的Redis漏洞进行初始访问,但最终成功破坏Cado蜜罐基础设施的正是上述方法。从截图中可以看出,随着恶意的SLAVEOF命令被下达,针对恶意领导者的Cado Redis被部署复制。 在进行复制后,MODULE LOAD命令开始加载恶意共享对象文件exp.so。这个共享对象扩展了Redis的功能,为攻击者提供了反向shell访问,并添加一个新命令system.exec,将允许在主机上运行任意shell命令。 然后system.exec通过/dev/tcp反向shell向C2服务器发出命令,最终检索并执行主要的Linux负载。 P2Pinfect还尝试通过cron我们之前描述的未经身份验证的RCE机制来危害Redis主机。
图2 用于注册恶意cronjob的示例Redis命令 这种滥用config set dir命令的方法也可用于攻击者控制的SSH密钥,可确保利用后门对主机进行访问。P2Pinfect也尝试此漏洞利用,在其他Redis漏洞利用尝试失败时提供冗余。 主要有效载荷 检索到的主要有效负载是使用Rust的外部函数接口(FFI)库,是一个用C语言和Rust语言组合编写的ELF。有效负载具有一个典型的libc_start_main入口和一个C语言函数,该函数在其他设置操作中为进程进行系统调用注册了许多sigaction。然后它分成一个典型的Rust lang_start函数,用来执行有效负载的Rust组件。该组件还使用FFI与C函数进行互操作。除此之外,二进制文件还使用了UPX进行打包。 执行后,该二进制文件将更新主机的SSH配置。它使用捆绑的配置文件将sshd_config文件更新到接近默认状态。而这会删除任何可能妨碍作者通过SSH访问服务器的配置,并启用密码验证。然后重启SSH服务,并将以下密钥放入当前用户的authorized_keys文件中: 然后它使用bash运行以下命令:
相关内容:
由于Redis服务器是已知的易受攻击的,恶意软件使用iptables表明这是为了防止任何其他威胁行为者破坏Redis服务器,同时仍然允许Redis服务器的合法运营商仍然访问服务器,以免信息泄露。 为了在重新启动后建立持久性,二进制文件会写入/path/to/binary到.bash_logout.无论是通过TTY还是通过SSH退出任何bash会话,都会导致二进制文件重新显示。通常,这可以通过使用.bashrc登录时运行命令,但使用.bash_logout是在注销之后生成的,这可以确保任何执行系统检查的分析人员都没有机会发现该进程。 释放有效载荷 一个名为bash的二进制文件被放入 /tmp ,并使用execv() 运行,参数为-bash。这样做会导致ps aux在运行后,文件自动删除。bash二进制文件扫描 /proc ,并打开stat中的每个进程,并监视/proc变更目录,如果二进制文件被终止,它将重新启动主负载,如下所示:
图3 被丢弃的bash二进制文件重新显示被终止的负载的审计日志 bash还能够在主二进制文件上执行升级。它读取主二进制文件,并验证它与从僵尸网络中提取的最新签名文件是否匹配。如果不匹配(如:篡改或有新版本可用),则旧实例被终止,新版本以随机名称下载到相同目录然后执行。 主二进制文件还将监控文件操作的其他进程。由于一些不明确的标准(如打开的文件数量和IOPS),它会试图杀死超过阈值的进程。据推测,这是为了尝试检测事件响应或分析工具,列举磁盘或创建内存转储。
图4 显示向其他进程发送SIGKILL的示例的内核跟踪日志 除了bash之外,一个名为miner的二进制文件的副本以一个随机的名称放在当前目录中被执行然后删除。尽管名字如此,但这个二进制文件实际上并不是一个加密矿工。唯一观察到的行为是它重复进行休眠调用。然而,由于僵尸网络操作员可以随时更新二进制文件,因此该有效负载可能只是处于休眠状态,等待僵尸网络增长到特定规模时才能被激活。 僵尸网络 P2Pinfect恶意软件针对僵尸网络的利用点。每台受感染的服务器都被视为一个节点,然后该节点会连接到其他受感染的服务器。假设命令是通过在网络上传播签名的消息来发布的,这会使得整个僵尸网络可以在不使用集中式C2服务器的情况下互相牵连。 启动后,二进制文件开始在0.0.0.0上监听,端口随机选择,通常在60100和60150之间。该端口用于与其他对等端通信,在一个简单的HTTP服务器上提供大量有效负载,并使用HTTPS进行实际的僵尸网络协调。HTTPS服务器主要使用硬编码证书(该证书在所有僵尸网络成员中都是相同的),很可能该证书也被用作客户端证书以向服务器进行身份验证(相互TLS)。 鉴于证书的颁发日期,该活动很可能是在6月29日或之后开始的。 二进制文件以逗号分隔的IP和端口对列表启动,这些IP和端口对经过加密,然后以base64编码作为其第一个参数。它将访问这些服务器之一,以获取以下所有二进制文件的副本:
然后使用HTTP服务器提供这些二进制文件(这样其他新的对等点可以获得一个副本)。 然后,二进制文件将自己注册给其他僵尸网络对等体。它通过在/ip上发送HTTP请求来实现这一点,该请求返回正在运行的恶意软件的本地主机IP。恶意软件试图从ipv4.icanhazip.com获取其IP,但是由于这是恶意软件的常见TTP,该请求可能会被阻止或欺骗,因此它可能会使用其他对等体进行检查。而这也可以用于验证对等体是否在线,接着它会与每个对等体建立TLS连接。
图5 nhazip和/ip的HTTP请求 扩散 此时,二进制文件将尝试感染更多的主机。二进制文件将读取bash_history、ssh config和已知的hosts文件,以收集用户、IPs和ssh密钥的列表。然后,使用这些信息来尝试感染新的实例。该二进制文件还将选择一个随机的/16网络前缀来扫描暴露的SSH和Redis服务器,并使用密码列表来尝试暴力破解它遇到的相关服务器。 对于Redis服务器,它将尝试利用LUA沙箱逃逸漏洞或使用和SLAVEOF命令MODULELOAD加载恶意模块。 一旦获得对主机的访问权限,它就会以与最初受感染的服务器相同的方式感染该主机,即删除自身的副本(从内置HTTP服务器获取)并使用节点列表作为参数执行它。 结论 P2Pinfect设计精良,采用复杂的复制和C2技术。选择使用Rust还可以更轻松地跨平台移植代码(Windows和Linux二进制文件共享许多相同的代码),同时也使代码的静态分析变得更加困难。这是由于Rust本身的复杂性,以至于缺乏可用于分析的工具。 研究人员遇到的样本与Unit42分析的Windows变体具有类似的功能。尽管如此,我们的研究人员没有发现任何证据表明该恶意软件专门针对云环境。根据分析期间收集的信息,无论它们是云托管还是本地部署,P2Pinfect可能会在大多数Linux主机上运行。 |