Cacti存在命令注入漏洞,该漏洞存在于remote_agent.php文件中,无需身份验证即可访问此文件,由于该php文件内部存在命令执行且参数可控,攻击者仅需绕过相关限制即可达到命令注入目的。
https://files.cacti.net/cacti/windows/ (Windows版本)
https://files.cacti.net/cacti/linux/ (Linux版本)
演示
由于`remote_agent.php`存在命令执行且相关限制可被绕过导致命令注入。
人口点(remote_agent.php)
在该PHP文件中,首先会执行到鉴权部分,然后代码逻辑继续执行程序流才有机会进入到漏洞污点处
这里使用的`remote_client_authorized()`函数进行鉴权,而该鉴权可以绕过
这里会查数据表`poller`并和其中记录`hostname`对比,而该表中记录的`hostname`实为该机器名,这里的通过`gethostbyaddr($client_addr)`获取与其对比的值,也就代表请求的`$client_addr`需要为该机器的IP才可以绕过这一限制。
关于`$client_addr`取值来自于`get_client_addr`这个函数,分析该函数可以发现会从XFF头中取值,所以我们仅需伪造XFF头即可实现鉴权的绕过。
回到`rmeote_agent.php`继续分析,在该PHP文件中会获取请求中的`action`参数,并根据其值执行不同操作,漏洞点产生与该分支中的`polldata`分支,当`action`为`polldata`时候会触发`poll_for_data()`函数
跟进分析`poll_for_data`函数:
在该函数中由于存在命令执行且执行命令的参数存在与请求参数拼接导致存在命令注入漏洞,我们仅需绕过函数中的限制使得程序流可以执行到命令执行即可。
要想流入到命令执行面临的问题:`items`必须有记录数据且必须必须存在一条`action`为`POLLER_ACTION_SCRIPT_PHP`的记录,实测就是`action`值为2,追踪`items`数据来源,可知其来自于SQL查询,而SQL查询的参数可控,所以我们仅需可知查询参数使得查询出来的数据存在`action`为2的记录即可使得程序流进入到命令执行中。
以下为当前分析环境下的数据包记录内容,所以我们只需要传入请求参数`local_data_ids[]=1&host_id=1`或`local_data_ids[]=2&host_id=1`即可,实际场景可能存在差异,可采用fuzz爆破等手法实现。
最后程序流来到命令执行,这里拼接的参数来自于请求参数`$poller_id`,所以最终的命令注入点也在该参数上。
原文始发于微信公众号(安全之道):Cacti命令注入
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论