Ivanti Connect Secure VPN 面临新零日攻击

近日,Mandiant 分析团队发现 Ivanti Connect Secure VPN 面临新零日攻击。这一攻击利用了 CVE-2025-0282 漏洞,影响了多个 Ivanti Connect Secure 设备。Mandiant 正在分析多个受损设备,并将继续更新本文以提供更多见解。

攻击活动

Mandiant 目前正在分析来自多个组织的受损 Ivanti Connect Secure 设备。该团队观察到,在至少一个受损设备上,Mandiant 发现了之前观察到的 SPAWN 间谍软件生态系统的部署,这包括 SPAWNANT 安装程序、SPAWNMOLE 隧道器和 SPAWNSNAIL SSH 后门。这些恶意软件被归因于 UNC5337 集群活动,根据信心程度为中等评估为 UNC5221 的一部分。

此外,Mandiant 还发现了之前未观察到的恶意软件家族,包括 DRYHOOK 和 PHASEJAM,但这些恶意软件尚未与已知团体关联。虽然有可能存在多个攻击者负责这些代码家族的创建和部署,但截至发表本报告时,Mandiant 并未获得足够数据来准确评估 CVE-2025-0282 漏洞所涉及的威胁actor数量。随着收集更多见解,Mandiant 将继续更新本文。

系统升级持久性

Mandiant 发现威胁actor在受损 Ivanti Connect Secure 设备上使用了两种方法来在系统升级时保持持久性。最近版本的 Ivanti Connect Secure 包含内置的完整性检查工具(ICT),该工具定期扫描文件系统以检测新建或修改的系统文件,这些文件可能指示系统被破坏。ICT 使用一个清单进行扫描,该清单包含系统上预期文件路径及其预期 SHA256 散列值。

为了绕过 ICT 扫描,攻击者重新计算修改后的 DSUpgrade.pm 文件的 SHA256 散列值,并将其插入清单中。具体操作如下:

1
sed -i "s/$(grep /home/perl/DSUpgrade.pm | /home/etc/manifest/manifest -a | grep -oE '[0-9a-f]{64}')/$(/home/bin/openssl dgst -sha256 /home/perl/DSUpgrade.pm | grep -oE '[0-9a-f]{64}')/g" /home/etc/manifest/manifest;

此外,攻击者将 VERSION 文件从挂载升级分区(tmp/root/home/VERSION) 复制到当前版本分区(/home/VERSION). 这样系统会错误地指示升级成功,而实际上仍在运行旧版本。具体操作如下:

1
2
3
4
5
chdir("/tmp");
system("/bin/mkdir", "-p", "root/home");
system("/bin/tar", "-xzf", $tgz_path, "./root/home/VERSION");
system("/bin/cp -f ./root/home/VERSION /data/versions/reset/VERSION");
system("/bin/cp -f ./root/home/VERSION /home/VERSION");

然后,攻击者重新计算 VERSION 文件的 SHA256 散列值,并将其插入 ICT 清单中。具体操作如下:

1
system('sed -i \'s/$(grep /home/VERSION | grep -oE "[0-9a-f]{64}")/$(/home/bin/openssl dgst -sha256 /home/VERSION)/g\' /home/etc/manifest/manifest');

机器人数据库盗窃

Mandiant 观察到威胁actor在受损设备上存档数据库缓存,并将存档数据放置在由公共面向 Web 服务器服务的目录中,以便盗窃数据库。数据库缓存可能包含与 VPN 会话相关的信息、会话 cookie、API 密钥、证书和凭证材料。

攻击者将 /runtime/mtmp/lmdb 目录的内容存档,并将其重命名为一个伪装成 CSS 文件的文件,位于 /home/webserver/htdocs/dana-na/css/ 目录中。Ivanti 曾发布有关从数据库缓存泄露风险的修复指南,包括重置本地账户凭证、重置 API 密钥以及撤销证书。

凭证窃取

Mandiant 观察到威胁actor部署了一个用 Python 编写的脚本,追踪为 DRYHOOK,用于窃取凭证。该恶意软件旨在修改 Ivanti Connect Secure 环境中的系统组件 DSAuth.pm 以便收集成功认证信息。

当执行该脚本时,它会打开 /home/perl/DSAuth.pm 文件并读取其内容,然后使用正则表达式找到并替换以下代码行:

1
2
3
setPrompt
runSignin = DSAuthc::RealmSignin_runSignin;
runSigninEBSL

替换的 setPrompt 函数捕获第二和第三参数,将它们组合成 <param2>=<param3> 格式,并将产生的字符串分配给全局变量 $ds_g。接下来,替换的代码段显示第二参数是用户名,而第三参数是用户尝试认证时的密码。

修改后的内容尝试写回 DSAuth.pm 文件,如果写入失败,则会重新挂载文件系统为可读写模式,写入文件,然后重新挂载为只读模式。最后,所有 cgi-server 进程都会被杀死,以便激活修改后的 DSAuth.pm 文件。

通过这些手段,攻击者能够成功窃取和利用目标系统中的凭证信息。为了防止此类攻击,组织应及时更新软件,并采取有效的安全措施来保护其关键设备和数据。