Cacti 前台RCE漏洞分析
字数 1602 2025-08-06 18:07:59
Cacti 前台RCE漏洞分析 (CVE-2022-46169) 技术文档
0x00 漏洞简介
Cacti是一个基于Web的开源网络监视和绘图工具,在2022年12月被发现存在前台命令执行漏洞(CVE-2022-46169)。攻击者可通过构造恶意请求在无需登录的情况下执行任意命令。
0x01 漏洞影响
- 影响版本:Cacti < 1.2.23
- 漏洞类型:未授权远程代码执行
- CVSS评分:9.8 (Critical)
0x02 环境搭建
- 从GitHub下载受影响版本(1.2.22):
https://github.com/Cacti/cacti - 导入数据库:执行根目录下的
cacti.sql - 配置数据库:复制
include/config.php.dist为include/config.php并修改数据库配置 - 访问
http://localhost/cacti/完成安装
0x03 漏洞分析
漏洞组成
该漏洞由两部分组成:
- 登录绕过机制
- 命令注入点
登录绕过分析
关键文件:remote_agent.php
- 该文件可直接通过Web访问,无前置认证
- 认证逻辑位于
remote_client_authorized()函数 - 认证流程:
- 通过
get_client_addr()获取客户端IP - 原始代码从
Client-IP、X-Forwarded-For等可控HTTP头获取IP - 使用
gethostbyaddr()解析IP获取主机名 - 与数据库
poller表中的hostname比较(默认为localhost) - 若匹配则认证通过
- 通过
绕过方法:
- 设置
X-Forwarded-For: 127.0.0.1 - 在Linux服务器上,
127.0.0.1解析为localhost,默认匹配成功 - Windows服务器需额外处理(因默认无
localhost解析)
命令注入分析
注入点:poll_for_data()函数
- 通过
action=polldata参数进入漏洞代码路径 - 关键参数
$poller_id使用get_nfilter_request_var()获取,无过滤 - 需要数据库
poller_item表中有特定数据(通常由管理员创建) - 当满足条件时,执行
proc_open()导致命令注入
利用条件:
- 需要
poller_item表中存在action=2的记录 - 通过控制
$local_data_ids等参数影响命令执行
0x04 漏洞修复
官方修复方案:
- 修改
get_client_addr()函数,不再从可控HTTP头获取IP - 将
get_nfilter_request_var()改为get_filter_request_var(),增加参数过滤 - 建议升级到1.2.23或更高版本
修复commit参考:
https://github.com/Cacti/cacti/commit/7f0e16312dd5ce20f93744ef8b9c3b0f1ece2216
0x05 技术总结
- 漏洞原理:未授权访问+参数注入导致RCE
- 利用链:
- 通过HTTP头伪造客户端IP
- 绕过
remote_client_authorized()认证 - 控制
action参数进入漏洞代码路径 - 通过未过滤参数实现命令注入
- 防护建议:
- 立即升级到最新版本
- 限制
remote_agent.php的访问权限 - 部署WAF规则拦截可疑请求
附录:相关技术点
gethostbyaddr()函数行为差异(Linux/Windows)proc_open()命令执行机制- Cacti的轮询(polling)工作机制
- 数据库表结构分析(
poller和poller_item表)
注:本文仅用于技术研究,请勿用于非法用途。