Cacti命令执行漏洞分析 (CVE-2022-46169)

一、漏洞背景

Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具。

在本漏洞中,攻击者可通过控制由get_nfilter_request_var()函数检索的参数$poller_id,以及构造local_data_ids参数,满足poller_item =POLLER_ACTION_SCRIPT_PHP条件,触发proc_open()函数,从而导致命令执行。

二、影响版本

Cacti < 1.2.23

三、漏洞分析

从漏洞补丁可以看出,本次漏洞点主要存在于lib/functions.php、remote_agent.php,2个文件中。

Merge pull request from GHSA-6p93-p743-35gf · Cacti/cacti@7f0e163 · GitHub

1.未授权访问的问题

remote_agent中对于远程IP取值来自于get_client_addr函数。追踪get_client_addr函数,可以发现位于functions.php内。

如果存在http_addr_headers数组内的代理IPheader,这个函数会从以上header内顺序取第一个合法的IP地址作为客户端IP。这样,攻击者就可以使用XFF进行客户端IP伪造

有一个鸡肋的点在于, 这里校验了通过client_addr取得hostname必须和cacti安装的本机或节点的hostname一致。如果伪造client_addr为127.0.0.1的情况下,默认的情况下client_name取出来的是localhost,会和本机名不一致,除非本机名字就是起的localhost。

如果在本机名字非localhost的情况下,client_addr需要暴力猜解本机的内网IP地址,或者其他设备列表内的IP地址。

2.远程命令执行的问题。

当设备action等于POLLER_ACTION_SCRIPT_PHP时,由于 poller_id参数未进行任何校验,可以直接进入proc_open函数进行命令执行。

 item['action']参数来源于:

$items = db_fetch_assoc_prepared('SELECT *
				FROM poller_item
				WHERE host_id = ?
				AND local_data_id = ?',
				array($host_id, $local_data_id));

所以攻击者可以通过local_data_ids参数来控制筛选出action==2的项目 ,使得函数可以进入POLLER_ACTION_SCRIPT_PHP块执行。当然,由于设备项目在添加时,需要选择相应的设备模板才会出现action=2的情况,local_data_ids参数也是需要靠暴力猜解才会猜解出action=2的项目。这也是鸡肋的一个点。

四、最终POC

 这里以执行curl命令为例。

 

五、修复方案

目前Cacti官方已发布安全补丁,但暂未发布版本更新,建议受影响用户关注官方更新或参考官方补丁代码进行修复:

https://github.com/Cacti/cacti/commit/7f0e16312dd5ce20f93744ef8b9c3b0f1ece2216

https://github.com/Cacti/cacti/commit/b43f13ae7f1e6bfe4e8e56a80a7cd867cf2db52b

注意:对于在 PHP < 7.0 下运行的 1.2.x 实例,还需要进一步更改:

https://github.com/Cacti/cacti/commit/a8d59e8fa5f0054aa9c6981b1cbe30ef0e2a0ec9

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#CactiEZ v10.1 install text cdrom mediacheck lang en_US.UTF-8 keyboard us rootpw CactiEZ firewall --service=ssh --service=snmp --service=http authconfig --enableshadow --passalgo=sha512 --enablefingerprint selinux --disabled timezone Asia/Shanghai network --bootproto=static --ip=192.168.0.32 --netmask=255.255.255.0 --gateway=192.168.0.1 --nameserver 8.8.8.8 --hostname=CactiEZ.local --noipv6 --onboot=yes bootloader --location=mbr zerombr yes clearpart --all --initlabel part /boot --fstype=ext4 --size=200 part pv.cZWdAb-3EW9-0foh-Bl0a-To6S-TJez-7moyho --grow --size=200 volgroup vg_cactiezv10 --pesize=4096 pv.cZWdAb-3EW9-0foh-Bl0a-To6S-TJez-7moyho logvol / --fstype=ext4 --name=LogVol00 --vgname=vg_cactiezv10 --grow --size=8192 logvol swap --name=LogVol01 --vgname=vg_cactiezv10 --size=1024 repo --name="CactiEZ" --baseurl=file:///mnt/source --cost=100 %packages --nobase --excludedocs @core @server-policy man file vim-enhanced openssh-clients lftp ftp wget curl elinks net-snmp-utils net-snmp httpd php mysql-server php-mysql php-gd expect ntp rsyslog-mysql pango system-config-network-tui %post --nochroot mkdir -p /mnt/sysimage/tmp/cactiez >> /tmp/ins.log 2>&1 cp /mnt/source/Packages/cactiez-i386.tgz /mnt/sysimage/tmp/cactiez >> /tmp/ins.log 2>&1 %post cd /tmp/cactiez >> /tmp/ins.log 2>&1 tar zxvf cactiez-i386.tgz >> /tmp/ins.log 2>&1 cp -rf /tmp/cactiez/var/www/html/* /var/www/html >> /tmp/ins.log 2>&1 cp -rf /tmp/cactiez/usr/* /usr >> /tmp/ins.log 2>&1 cp -rf /tmp/cactiez/etc/* /etc >> /tmp/ins.log 2>&1 service mysqld start >> /tmp/ins.log 2>&1 /usr/bin/mysqladmin --user=root create cacti >> /tmp/ins.log 2>&1 mysql -e "GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY 'cactiuser'" >> /tmp/ins.log 2>&1 mysql cacti > /tmp/ins.log 2>&1 chmod -R 777 /var/www/html/log/ chmod -R 7755 /var/www/html/rra/ chmod -R 755 /var/www/html/scripts/ chmod -R 755 /usr/local/spine/bin/ chmod -R 755 /usr/local/rrdtool/bin/ chown -R apache:apache /var/www/html/ echo '*/10 * * * * /usr/sbin/ntpdate 0.rhel.pool.ntp.org && /sbin/clock -w' > /tmp/crontab2.tmp echo '*/5 * * * * php /var/www/html/poller.php > /dev/null 2>&1' >> /tmp/crontab2.tmp crontab /tmp/crontab2.tmp rm /tmp/crontab2.tmp for service in httpd mysqld snmpd do chkconfig --level 235 $service on done #rm -rf /tmp/* %end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值