跳到主要内容

超危

Cacti remote_agent.php命令注入漏洞

2022-12-05 08:44:03 公开 ,2026-06-30 07:11:04 更新

  • 关键漏洞
  • CISA KEV
  • 远程
  • 无需认证
  • 公开PoC
  • CWE Top 25 (2023)
  • 开源组件漏洞
  • 2024两高一弱互联网漏洞
  • CWE Top 25 (2024)
  • 2025两高一弱漏洞
CWEs:
CWE-74 (Injection) CWE-77 (Command Injection)
SSVC:
可利用状态:已被积极利用攻击自动化:否技术影响评估:全部 2024-05-14 01:39:57

风险信息

CVSS v3 向量
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CVSS v3 风险值
9.8
CVSS v3.1 向量
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CVSS v3.1 风险值
9.8

详细信息

漏洞类型
注入
漏洞描述
Cacti是Cacti团队的一套开源的网络流量监测和分析工具。该工具通过snmpget来获取数据,使用RRDtool绘画图形进行分析,并提供数据和用户管理功能。Cacti 1.2.23以前版本中,如果为任何受监控的设备选择了特定的数据源,则命令注入漏洞允许未经验证的用户在运行Cacti的服务器上执行任意代码。漏洞位于`remote_agent.php`文件中,无需验证即可访问此文件。通过get_client_addr函数检索客户端IP地址,并通过gethostbyaddr将此IP地址解析为相应的主机名。之后,验证poller表中是否存在条目,其中主机名对应于解析的主机名。如果找到了这样的条目,则函数返回true,客户端被授权。由于get_client_addr函数的实现,可以绕过此授权。 函数在文件lib/functions.php中定义,并检查几个$_SERVER变量以确定客户端的IP地址。攻击者可以任意设置以HTTP_开头的变量。由于poller表中有一个默认条目,其中包含运行Cacti的服务器的主机名,因此攻击者可以绕过身份验证,例如通过提供标题Forwarded For:<TARGETIP>。这样,函数get_client_addr返回运行Cacti的服务器的IP地址。 对gethostbyaddr的调用会将此IP地址解析为服务器的主机名,由于默认条目,服务器将通过poller主机名检查。绕过remote_agent.php文件的授权后,攻击者可以触发不同的操作。其中一个操作称为polldata。调用的函数poll_for_data检索一些请求参数,并从数据库中加载相应的poll_item条目。如果poller_item的action等于poller_action_SCRIPT_PHP,则函数proc_open用于执行PHP脚本。攻击者控制的参数$poller_id通过允许任意字符串的函数get_nfilter_request_var检索。此变量稍后被插入到传递给proc_open的字符串中,这会导致命令注入漏洞。例如,通过提供poller_id=;id`执行`id`命令。 为了到达易受攻击的调用,攻击者必须提供host_id和local_data_id,其中对应的poller_item的action设置为poller_action_SCRIPT_PHP。这两个id(host_id和local_data_id)都很容易被破坏。唯一的要求是存在具有poller_ACTION_SCRIPT_PHP操作的poller_item。这很可能发生在生产实例上,因为此操作是由一些预定义的模板添加的,如设备-运行时间或设备-轮询时间。如果配置了action类型为poller_action_SCRIPT_PHP(2)的poller_item,则此命令注入漏洞允许未经身份验证的用户执行任意命令。
修复建议
1、此漏洞已在1.2.x和1.3.x版本分支中解决,1.2.23是包含修补程序的第一个版本。 (1)1.2.x版本请访问如下链接: (2)1.3.x版本请访问如下链接: 2、临时缓解措施 (1)禁止使用get_client_addr(文件lib/functions.php)返回任意IP地址来防止绕过授权。通过不遵守HTTP_…来实现`$_SERVER变量; (2)如果出于兼容性原因而保留这些地址,则至少应防止伪造运行Cacti的服务器的IP地址; (3)更改remote_agent.php配置, 通过函数get_filter_request_var替代get_nfilter_request_var进行检索; (4)更改remote_agent.php配置, $poller_id在传递给proc_open之前使用escapeshellarg进行转义。 https://github.com/Cacti/cacti/commit/7f0e16312dd5ce20f93744ef8b9c3b0f1ece2216 https://github.com/Cacti/cacti/commit/b43f13ae7f1e6bfe4e8e56a80a7cd867cf2db52b

参考链接