Cacti命令注入

admin 2024年12月6日16:06:08评论4 views字数 1278阅读4分15秒阅读模式
漏洞描述

Cacti存在命令注入漏洞,该漏洞存在于remote_agent.php文件中,无需身份验证即可访问此文件,由于该php文件内部存在命令执行且参数可控,攻击者仅需绕过相关限制即可达到命令注入目的。

漏洞复现
环境

https://files.cacti.net/cacti/windows/  (Windows版本)

https://files.cacti.net/cacti/linux/      (Linux版本)

演示

Cacti命令注入

Cacti命令注入

漏洞分析

由于`remote_agent.php`存在命令执行且相关限制可被绕过导致命令注入。

人口点(remote_agent.php)

在该PHP文件中,首先会执行到鉴权部分,然后代码逻辑继续执行程序流才有机会进入到漏洞污点处

Cacti命令注入

这里使用的`remote_client_authorized()`函数进行鉴权,而该鉴权可以绕过

Cacti命令注入

这里会查数据表`poller`并和其中记录`hostname`对比,而该表中记录的`hostname`实为该机器名,这里的通过`gethostbyaddr($client_addr)`获取与其对比的值,也就代表请求的`$client_addr`需要为该机器的IP才可以绕过这一限制。

Cacti命令注入

关于`$client_addr`取值来自于`get_client_addr`这个函数,分析该函数可以发现会从XFF头中取值,所以我们仅需伪造XFF头即可实现鉴权的绕过。

Cacti命令注入

回到`rmeote_agent.php`继续分析,在该PHP文件中会获取请求中的`action`参数,并根据其值执行不同操作,漏洞点产生与该分支中的`polldata`分支,当`action`为`polldata`时候会触发`poll_for_data()`函数

Cacti命令注入

跟进分析`poll_for_data`函数:

Cacti命令注入

在该函数中由于存在命令执行且执行命令的参数存在与请求参数拼接导致存在命令注入漏洞,我们仅需绕过函数中的限制使得程序流可以执行到命令执行即可。

要想流入到命令执行面临的问题:`items`必须有记录数据且必须必须存在一条`action`为`POLLER_ACTION_SCRIPT_PHP`的记录,实测就是`action`值为2,追踪`items`数据来源,可知其来自于SQL查询,而SQL查询的参数可控,所以我们仅需可知查询参数使得查询出来的数据存在`action`为2的记录即可使得程序流进入到命令执行中。

Cacti命令注入

以下为当前分析环境下的数据包记录内容,所以我们只需要传入请求参数`local_data_ids[]=1&host_id=1`或`local_data_ids[]=2&host_id=1`即可,实际场景可能存在差异,可采用fuzz爆破等手法实现。

Cacti命令注入

最后程序流来到命令执行,这里拼接的参数来自于请求参数`$poller_id`,所以最终的命令注入点也在该参数上。

Cacti命令注入
由于该参数采用`get_nfilter_request_var()`函数获取,未存在任何过滤,故可实现任意命令注入。
Cacti命令注入
总结
好久没水文章了,,,,

原文始发于微信公众号(安全之道):Cacti命令注入

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月6日16:06:08
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Cacti命令注入https://cn-sec.com/archives/2496593.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息