cacti的RCE

目录

1 环境搭建

1.1 linux:

1.1.1 在ubuntu上拉取环境(docker)

1.1.2 docker环境部署

1.1.3 查看镜像端口:

1.1.4 访问

1.1.5 查看数据库配置:

1.2 windows搭建:

 1.2.1 config.php.dist

2 环境设置

2.1 登录仙人掌

 2.2 设置

3 vscode进入容器的方法

4 RCE绕过与分析

4.1 绕过鉴权函数

4.1.1 函数分析

4.1.1.1 get_client_addr

4.1.1.2 break 2:

4.1.1.3 remote_client_authorized()

4.1.1.4 remote_agent_strip_domain

4.2 用户可控参数--get

4.2.1 初步分析

4.2.2 分析函数的if

4.2.3 ACTION为什么为2?

4.3 绕过prepare_validate_result函数

函数代码:

5 漏洞复现演示

5.1进入数据库

5.2 payload抓包测试

5.3 上传payload

5.4 测试验证

6 代码回顾总结

6.1 remote_client_authorized()绕过

6.2 action  get传参

6.3   当action=2

7 AI总结图(助于思考回顾)


1 环境搭建

1.1 linux:

1.1.1 在ubuntu上拉取环境(docker)

root@yang:~/vulhub/cacti/CVE-2022-46169# wget  https://github.com/Cacti/cacti/archive/refs/tags/release/1.2.22.zip^C

1.1.2 docker环境部署

使用此命令构建docker环境镜像


root@yang:~/vulhub/cacti/CVE-2022-46169# docker compose up -d
WARN[0000] /root/vulhub/cacti/CVE-2022-46169/docker-compose.yml: the attribute `version` is obsol                                                                                        ete, it will be ignored, please remove it to avoid potential confusion
[+] Running 2/2
 ✔ Container cve-2022-46169-db-1   Started                                                  0.5s
 ✔ Container cve-2022-46169-web-1  Started  

1.1.3 查看镜像端口:

root@yang:~/vulhub/cacti/CVE-2022-46169# docker images
REPOSITORY     TAG       IMAGE ID       CREATED         SIZE
nginx          latest    9592f5595f2b   4 weeks ago     192MB
mysql          5.7       5107333e08a8   19 months ago   501MB
vulhub/cacti   1.2.22    c0a06715ff54   2 years ago     642MB
root@yang:~/vulhub/cacti/CVE-2022-46169# docker ps -a
CONTAINER ID   IMAGE                 COMMAND                   CREATED       STATUS         PORTS                                     NAMES
9b7a360a3476   vulhub/cacti:1.2.22   "bash /entrypoint.sh…"   2 weeks ago   Up 2 minutes   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   cve-2022-46169-web-1
35343a3e052e   mysql:5.7             "docker-entrypoint.s…"   2 weeks ago   Up 2 minutes   3306/tcp, 33060/tcp                       cve-2022-46169-db-1

1.1.4 访问

1.1.5 查看数据库配置:

1.2 windows搭建:

下载安装包后直接部署在小皮的WWW的目录下面,发现报错

 1.2.1 config.php.dist

这是一个备份文件,可以修改为php文件,作为mysql

修改配置文件 

无法成功!稍后再试,尝试了很多方法都不行

2 环境设置

2.1 登录仙人掌

账号:admin

密码:admin

进入后就直接一直next

 2.2 设置

3 vscode进入容器的方法

因为自己最开始不知道,所以写了

然后在这里面可以选择想进入的容器:

4 RCE绕过与分析

4.1 绕过鉴权函数

4.1.1 函数分析

function remote_client_authorized() {
	global $poller_db_cnn_id;

	/* don't allow to run from the command line */
	$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);
	}

	$pollers = db_fetch_assoc('SELECT * FROM poller', true, $poller_db_cnn_id);

	if (cacti_sizeof($pollers)) {
		foreach($pollers as $poller) {
			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;
}
4.1.1.1 get_client_addr

走到这个函数里面来,再接着走到了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',
	);
//循环获取他的http的请求头
	$client_addr = false;
	foreach ($http_addr_headers as $header) {
		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;
}

最开始这个数组就是为了循环获取他的请求头的数据

$_server:就是为了获取到X-Forwarded-For,这样就可以判断能不能获取到这个X-Forwarded-For参数,就可以判断出请求头是否伪空
 

<?php

echo'<pre>';

var_dump($_SERVER);

可以打印出全局的数组,其中它就有请求头的数据

 打印出来的数据如上:和f12里面的http-request-header里面的内容是一样的

所以说我们可以通过获取X-Forwarded-For,可以进行伪造

$header_ips = explode(',', $_SERVER[$header]);

            foreach ($header_ips as $header_ip) {

                if (!empty($header_ip)) {

                    if (!filter_var($header_ip, FILTER_VALIDATE_IP))

这里是通过全局数组获取到了header头里面的ip字段的信息,获取到后,判断是否为空,如果不是空,就用filter_var来进行过滤

FILTER_VALIDATE_IP:这是一个过滤器,用来验证IP是否合法

4.1.1.2 break 2:

跳出两层循环

break 2是 PHP 中的控制语句,用于终止多层嵌套循环的执行。在这段代码中,它的作用是:

 
  1. 内层循环:遍历由逗号分隔的 IP 列表(例如,当
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fatsheep洋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值