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 环境搭建

  1. 从GitHub下载受影响版本(1.2.22):https://github.com/Cacti/cacti
  2. 导入数据库:执行根目录下的cacti.sql
  3. 配置数据库:复制include/config.php.distinclude/config.php并修改数据库配置
  4. 访问http://localhost/cacti/完成安装

0x03 漏洞分析

漏洞组成

该漏洞由两部分组成:

  1. 登录绕过机制
  2. 命令注入点

登录绕过分析

关键文件remote_agent.php

  1. 该文件可直接通过Web访问,无前置认证
  2. 认证逻辑位于remote_client_authorized()函数
  3. 认证流程:
    • 通过get_client_addr()获取客户端IP
    • 原始代码从Client-IPX-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()函数

  1. 通过action=polldata参数进入漏洞代码路径
  2. 关键参数$poller_id使用get_nfilter_request_var()获取,无过滤
  3. 需要数据库poller_item表中有特定数据(通常由管理员创建)
  4. 当满足条件时,执行proc_open()导致命令注入

利用条件

  • 需要poller_item表中存在action=2的记录
  • 通过控制$local_data_ids等参数影响命令执行

0x04 漏洞修复

官方修复方案:

  1. 修改get_client_addr()函数,不再从可控HTTP头获取IP
  2. get_nfilter_request_var()改为get_filter_request_var(),增加参数过滤
  3. 建议升级到1.2.23或更高版本

修复commit参考:
https://github.com/Cacti/cacti/commit/7f0e16312dd5ce20f93744ef8b9c3b0f1ece2216

0x05 技术总结

  1. 漏洞原理:未授权访问+参数注入导致RCE
  2. 利用链
    • 通过HTTP头伪造客户端IP
    • 绕过remote_client_authorized()认证
    • 控制action参数进入漏洞代码路径
    • 通过未过滤参数实现命令注入
  3. 防护建议
    • 立即升级到最新版本
    • 限制remote_agent.php的访问权限
    • 部署WAF规则拦截可疑请求

附录:相关技术点

  1. gethostbyaddr()函数行为差异(Linux/Windows)
  2. proc_open()命令执行机制
  3. Cacti的轮询(polling)工作机制
  4. 数据库表结构分析(pollerpoller_item表)

注:本文仅用于技术研究,请勿用于非法用途。

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 表) 注:本文仅用于技术研究,请勿用于非法用途。