Exploit/CVE-2010-0738
打开JBoss的潘多拉魔盒:JBoss高危漏洞分析
*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。
前言
JBoss是一个基于J2EE的开放源代码应用服务器,代码遵循LGPL许可,可以在任何商业应用中免费使用;JBoss也是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3规范。但JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。在J2EE应用服务器领域,JBoss是发展最为迅速的应用服务器。由于JBoss遵循商业友好的LGPL授权分发,并且由开源社区开发,这使得JBoss广为流行。
0x01 JBoss优点
JBoss有许多优点。
其一,将具有革命性的JMX微内核服务作为其总线结构;
其二,本身就是面向服务架构(Service-Oriented Architecture,SOA);
其三,具有统一的类装载器,从而能够实现应用的热部署和热卸载能力。
因此,高度模块化的和松耦合。JBoss应用服务器是健壮的、高质量的,而且还具有良好的性能。
JBoss AS作为Redhat公司的商业产品JBoss Enterprise Application Platform的上游基础,为了避免用户混淆,该公司在去年10月份就为JBoss AS拟定一个新名字——WildFly。

由此看来,国内使用JBoss服务的用户很广泛,因此防范JBoss漏洞就显得尤为重要了。一旦JBoss的潘多拉魔盒被打开,必将在当今网络中掀起腥风血雨。
0x02 高危漏洞介绍
近几年JBoss爆发的漏洞数量与其他著名的中间件(Weblogic,Jenkins,WebSphere等)相比,数量相对较少。然而,由于最近几年Java反序列化漏洞的肆虐,JBoss也深受其害,相继爆发了三个著名的高危漏洞。
下面介绍一下JBoss“潘多拉魔盒”中的高危漏洞。
JBoss高危漏洞主要涉及到两种。
第一种是利用未授权访问进入JBoss后台进行文件上传的漏洞,例如:CVE-2007-1036,CVE-2010-0738,CVE-2005-5750以及JBoss jmx-consoleHtmlAdaptor addURL() File Upload Vulnerability。
另一种是利用Java反序列化进行远程代码执行的漏洞,例如:CVE-2015-7501,CVE-2017-7504,CVE-2017-12149,CVE-2013-4810。
除此之外,还要额外介绍一下JBoss seam2的模板注入CVE-2010-1871漏洞。
Java反序列化RCE漏洞
关于Java反序列化漏洞的利用思路此前已经介绍过,详情请看缝缝补补的WebLogic:绕过的艺术 - FreeBuf网络安全行业门户。
1. CVE-2015-7501漏洞
此漏洞主要是由于JBoss中invoker/JMXInvokerServlet路径对外开放,由于JBoss的jmx组件支持Java反序列化,并且在反序列化过程中没有加入有效的安全检测机制,导致攻击者可以传入精心构造好的恶意序列化数据,在jmx对其进行反序列化处理时,导致传入的携带恶意代码的序列化数据执行,造成反序列化漏洞,下面是传入的序列化结构。

从图中我们可以看到,此漏洞的payload和weblogic Java反序列化CVE-2015-4852原理相同,都是利用了Apache Commons Collections的基础库进行Java反序列化漏洞的利用。
CVE-2015-7501 POC
首先我们进入到/invoker/JMXInvokerServlet路径下,post传入我们构造好的payload,下面的序列化POC需要将16进制解码。
在上面的POC中,cmd是我们想要执行的代码,这里大家注意一下,binascii.b2a_hex(cmd)前面的两位(标红的部分)是代表cmd转换为16进制的长度。所以需要根据我们具体传入的代码而进行调整。
这个漏洞的修补方法很简单,因为ysoserial工具生成的payload都依赖于InvokerTransformer类。如果用户在正常业务中不使用此类,可以将此类移除,方法为使用Winzip打开jar文件,在org/apache/commons/collections/functors/InvokerTransformer.class删除该文件。
2. CVE-2017-7504漏洞
CVE-2017-7504漏洞与CVE-2015-7501的漏洞如出一辙,只是利用的路径稍微出现了变化,CVE-2017-7504出现在/jbossmq-httpil/HTTPServerILServlet路径下,一般出现如图所示的界面,绝大多数存在此漏洞。

漏洞的利用方式也和CVE-2105-7501相同,只需要在存在漏洞的路径下post传入我们构造的payload,即可对存在漏洞的服务器进行远程代码攻击。Payload使用上面提到的CVE-2015-7501的POC即可。
3. CVE-2017-12149漏洞
此漏洞主要是由于jboss\server\all\deploy\httpha-invoker.sar\invoker.war\WEB-INF\classes\org\jboss\invocation\http\servlet目录下的ReadOnlyAccessFilter.class文件中的doFilter方法,再将序列化传入ois中,并没有进行过滤便调用了readObject()进行反序列化,导致传入的携带恶意代码的序列化数据执行,造成了反序列化的漏洞,下面粘出doFilter方法。

看到代码中的MarshalledInvocation,也许熟悉weblogic Java反序列化漏洞的同学可能会想到CVE-2016-3510漏洞。没错,这个漏洞也是利用了MarshalledInvocation类进行的Java反序列化攻击。首先我们进入到/invoker/readonly路径下,post传入我们构造好的payload,下面的序列化POC需要将16进制解码。
CVE-2017-12149的POC(序列化)
这里我们在cmd_hex所在位置,必须要插入类似于
bash -c {echo,bmMgLW52IDE5Mi4xNjguMTYuMSA0MDQw}|{base64,-d}|{bash,-i}
这种形式的命令才可以达到攻击效果,这是因为使用了“Java.lang.Runtime.exec(String)”语句而导致的一些限制。首先是不支持shell操作符,如输出重定向以及管道。其次是传递给payload命令的参数中不能包含空格。同样前面标红的那两位(b1)也需要和我们插入的指令长度相符,这是Java序列化中的结构规定。
如果进入到漏洞所在路径看见如下图的界面,很可能存在CVE-2017-12149漏洞。

4. CVE-2013-4810漏洞
此漏洞和CVE-2015-7501漏洞原理相同,这里详细介绍一下两者的区别,其区别就在于两个漏洞选择的进行其中JMXInvokerServlet和EJBInvokerServlet利用的是org.jboss.invocation.MarshalledValue进行的反序列化操作,而web-console/Invoker利用的是org.jboss.console.remote.RemoteMBeanInvocation进行反序列化并上传构造的文件。
首先我们进入到/invoker/JMXInvokerServlet,/invoker/EJBInvokerServlet路径下,post传入我们构造好的payload,并在头部传入。
下面的序列化POC需要将16进制解码。
CVE-2013-4810的POC(序列化)
POC的序列化结构如下图:

图中红框位置就是我们执行上传文件功能(jboss.admin中的DeploymentFileRepository)的代码和上传文件的内容。
另外如果是检测web-console/Invoker路径下的漏洞,则传入http头部如下:
post传入的payload如下:
POC的序列化结构如下图:

图中红框位置就是我们上传文件内容。
JBoss后台文件上传的漏洞
1.CVE-2007-1036漏洞
此漏洞主要是由于JBoss中/jmx-console/HtmlAdaptor路径对外开放,并且没有任何身份验证机制,导致攻击者可以进入到jmx控制台,并在其中执行任何功能。该漏洞利用的是后台中jboss.admin -> DeploymentFileRepository -> store()方法,通过向四个参数传入信息,达到上传shell的目的,其中arg0传入的是部署的war包名字,arg1传入的是上传的文件的文件名,arg2传入的是上传文件的文件格式,arg3传入的是上传文件中的内容。通过控制这四个参数即可上传shell,控制整台服务器。但是通过实验发现,arg1和arg2可以进行文件的拼接,例如arg1=she,arg2=ll.jsp。这个时候服务器还是会进行拼接,将shell.jsp传入到指定路径下。后面的CVE-2010-0738和CVE-2005-5750漏洞也存在这一特性。
CVE-2007-1036 POC
其中war_name是部署war包的名称,filename是我们想要上传的文件名。漏洞利用过程就是将POC以GET或POST方式在/jmx-console/HtmlAdaptor路径下进行传入即可。
下图是利用此payload进行shell上传:

这个是存在漏洞的后台路径:

图中的store()函数便是文件上传使用的方法,通过构造内部的4的参数,将我们构造好的文件传到任何我们指定的位置。
2. CVE-2010-0738漏洞
此漏洞利用原理和CVE-2007-1036漏洞相同,唯一的区别是CVE-2010-0738漏洞利用了HTTP中HEAD请求方法,绕过了对GET和POST请求的限制,成功地再次利用jboss.admin -> DeploymentFileRepository -> store()方法上传文件。
CVE-2010-0738 POC
其中war_name是部署war包的名称,filename是我们想要上传的文件名。漏洞利用过程就是将POC以HEAD方式在/jmx-console/HtmlAdaptor路径下进行传入即可。
下图是成功上传shell的截图。

3. CVE-2005-5750漏洞
此漏洞利用原理和CVE-2007-1036漏洞相同,唯一的区别是CVE-2006-5750漏洞利用methodIndex进行store()方法的调用。其中methodIndex是通过方法的编号进行调用。
CVE-2005-5750 POC
其中war_name是部署war包的名称,filename是我们想要上传的文件名。在/jmx-console/HtmlAdaptor路径下,使用HEAD方法传入上面构造好的payload,即可对此漏洞进行利用。
下图是成功上传shell的截图。

4. JBoss jmx-consoleHtmlAdaptor addURL() 文件上传漏洞
此漏洞是由于JBoss中/jmx-console/HtmlAdaptor路径对外开放,并且没有任何身份验证机制,导致攻击者可以进入到jmx控制台,并在其中执行任何功能。该漏洞利用的是后台jboss.deployment -> DeploymentScanner -> Java.net.URL类型 addURL()
方法,通过向一个参数传入url进行访问,在要访问的url中构造带有shell的war包,当服务器访问时便会上传shell。但是,上传shell的文件只是一个映射文件,当url一旦无法访问或者内部资源丢失,则服务器上的文件也会相应消失。
JBoss jmx-consoleHtmlAdaptor addURL() File Upload Vulnerability POC
其中arg0传入的是我们可以控制服务器访问的url。在/jmx-console/HtmlAdaptor路径下GET传入我们构造好的payload,即可对此漏洞进行漏洞利用。
下图是漏洞利用所选择的函数:

防御以上漏洞,其实只需要将JBoss后台添加权限,控制访问者对敏感路径访问即可。
JBoss seam2模板注入
在介绍漏洞之前,首先介绍一下Java反射机制。
很多POC都是利用Java的反射机制来调用需要的方法进行远程代码执行。在Java中,一切皆为对象,包括Class对象。Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。
在下面的漏洞中,我们可以利用一些函数去反射需要的类,以及类的方法。例如,利用getClass()函数获取类,并利用getMethod()获取我们想要反射的方法。在CVE-2010-1871,就是通过反射出Java.lang.Runtime.getRuntime().exec()方法,进行远程代码执行。
1.CVE-2010-1871漏洞
此漏洞是通过seam组件中插入#{payload}进行模板注入,我们可以在/admin-console/login.seam?actionOutcome=/success.xhtml?user%3d%23{}的#{}中插入我们要执行的方法,我们可以通过Java反射机制来获取到Java.lang.Runtime.getRuntime().exec()方法,从而可以传入任何想要执行的指令。
CVE-2010-1871 POC
其中cmd代表传入的远程命令。在/admin-console/login.seam路径下,POST传入我们构造好的payload,即可对此漏洞利用。
0x03 结语
目前,JBoss未授权访问的漏洞已经得到了很好的修复,一些对外组件都添加了权限访问控制,想继续利用
JBoss的潘多拉魔盒已经开启,每一个JBoss高危漏洞都会给使用JBoss的用户造成巨大的灾难。传言,潘多拉在开启魔盒的瞬间,由于害怕和紧张,在智慧女神雅典娜放在盒子中的“希望”还没有飞出,就关上了盒子,导致了人类饱受疾病与灾难的痛苦。那么作为一个安全研究员,放飞盒子中的“希望”就是我们现在需要努力的方向。及时的在漏洞爆发期间完成对漏洞的分析,并完成对漏洞的预防,防止漏洞攻击在网络环境中肆虐,保护大家的网络环境,这便是安全研究员的职责所在。
目前,JBoss未授权访问的漏洞已经得到了很好的修复,一些管理后台都添加了权限访问控制,想继续通过JBoss后台进行文件上传在现在的JBoss版本已经很少能实现了。目前JBoss的攻击趋势随着2015年FoxGlove Security 安全团队的 @breenmachine 博客的发布而渐渐偏向于Java反序列化攻击。因为这种攻击的特点是,危险等级高,影响范围广,一个Java反序列化漏洞造成的影响是巨大的。所以对于JBoss,我们需要做的防护措施就是,在各个对外开放组件进行输入验证,确保传入的信息中没有对服务器产生危害的内容。
漏洞挖掘者和漏洞防御者之间的博弈从未停止过,而且这种博弈在今后的生活中也将会愈演愈烈,安全研究员时刻准备迎接挑战。
*本文作者:千里目安全实验室,转载请注明来自FreeBuf.COM
相关文章:
Exploit/CVE-2010-0738
打开JBoss的潘多拉魔盒:JBoss高危漏洞分析 *本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。 前言 JBoss是一个基于J2EE的开放源代码应用服务器࿰…...
Go单元测试及框架使用
Go自带测试框架 单元测试 建议Go 语言推荐测试文件和源代码文件放在一块,测试文件以 _test.go 结尾。函数名必须以 Test 开头,后面一般跟待测试的函数名参数为 t *testing.T 简单测试用例定义如下: func TestXXXX(t *testing.T) {// ...}…...
TreeMap类型实体类数据进行排序
实体类Student类代码如下所示: package com.test.Test11;public class Student implements Comparable<Student>{private int age;private String name;private Double height;public int getAge() {return age;}public void setAge(int age) {this.age age…...
HOOPS助力AVEVA数字化转型:支持多种3D模型格式转换!
行业: 电力和公用事业、化工、造船、能源、采矿业 挑战: 创建大规模复杂资产的客户需要汇集多种类型的数据,以支持初始设计和创建强大的数字双胞胎;现有版本的产品只支持半打CAD格式;有限的内部开发资源限制了增加对新…...
(转载)基于遗传模拟退火的聚类算法(matlab实现)
1 理论基础 1.1 模糊聚类分析 模糊聚类是目前知识发现以及模式识别等诸多领域中的重要研究分支之一。随着研究范围的拓展,不管是科学研究还是实际应用,都对聚类的结果从多方面提出了更高的要求。模糊C-均值聚类(FCM)是目前比较流行的一种聚类方法。该…...
【C++】struct 和 class 的区别
欢迎来到博主 Apeiron 的博客,祝您旅程愉快。时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、示例代码 3、总结 1、缘起 在 C 中,struct 和 class 唯一的区别就在于 默认的访问权限不同。区别如下: …...
活动笔记丨物业行业人效提升与灵活用工新路径
近日,盖雅工场成功举办物业行业人效提升专场交流,来自广深地区央企和民营的领先物业企业和现场服务业的多位代表齐聚深圳招商积余大厦,共同研讨行业人效提升的挑战和实践。 本次闭门交流会聚焦于人效提升,讨论话题包括各自企业在人…...
学习笔记:吴恩达ChatGPT提示工程
以下为个人笔记,原课程网址Short Courses | Learn Generative AI from DeepLearning.AI 01 Introduction 1.1 基础LLM 输入 从前有一只独角兽,输出 它和其他独角兽朋友一起住在森林里输入 法国的首都在哪?输出 法国的首都在哪…...
POI in Action
POI 组件依赖 按需引入对应依赖 (给出官方的指引) 组件作用Maven依赖POIFSOLE2 FilesystempoiHPSFOLE2 Property SetspoiHSSFExcel XLSpoiHSLFPowerPoint PPTpoi-scratchpadHWPFWord DOCpoi-scratchpadHDGFVisio VSDpoi-scratchpadHPBFPublisher PUBpoi-scratchpadHSMFOutloo…...
苹果Vision Pro将引爆人机交互的重大变革
2023年6月6日,苹果发布了大家期待已久的Vision Pro,Vision Pro是一款专业级MR设备,融合了虚拟现实(VR)和增强现实(AR)技术,可以让用户完全沉浸在高分辨率显示内容中。允许用户以一种全新的方式在其周围的空间中查看APP。用户可以用…...
MMDetection学习记录(二)之配置文件
文件结构 config文件 在 config_base_ 文件夹下有 4 个基本组件类型,分别是:数据集(dataset),模型(model),训练策略(schedule)和运行时的默认设置(default runtime)。 命名风格 {model}_[model setting]_{backbone}_{neck}_[no…...
Python数据分析:NumPy、Pandas和Matplotlib的使用和实践
在现代数据分析领域中,Python已成为最受欢迎的编程语言之一。Python通过庞大的社区和出色的库支持,成为了数据科学家和分析师的首选语言。在Python的库中,NumPy、Pandas和Matplotlib是三个最为重要的库,它们分别用于处理数值数组、…...
实习生面试问题及回答记录
文章目录 文章简介技术类1、DFS和BFS算法的区别是什么?2、解释一下什么是快速排序?3、 如果让你写一个排序算法?你会怎么写?(大概说出代码的思路)4、解释一下二分查找的具体逻辑?5、在代码的数据…...
设计模式(十):结构型之外观模式
设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式…...
买法拍房需要注意什么
法拍房,由于其价格亲民、房屋信息透明度高、竞拍过程公平公正而受到越来越多的人开始关注。但是其中又有着许多的风险及相关的注意事项。那么,如何做到成功“捡漏”,买法拍房需要注意什么呢? 买法拍房需要注意什么 1、隐藏的各种收费 税费&a…...
linux命令输出结果但不显示在屏幕上的通用办法
linux命令输出结果但不显示在屏幕上的通用办法 这个针对于我这种小白马大哈很简单的一个命令,记给自己备用 举个例子:unzip命令不输出结果 unzip xx.zip > /dev/null 2>&1 unzip xx.zip > /dev/null 前半部分是将标准输出重定向到空设备&a…...
【Linux系统进阶详解】Linux字符权限rwx-权限组合原理,对应类型ugo,user,group,other,+-=详解及权限管理实战
在Linux系统中,每个文件和目录都有三种权限:读权限(r)、写权限(w)和执行权限(x)。这些权限可以被分配给三个不同的用户组:用户(user)、组(group)和其他人(other)。此外,权限可以使用“+”、“-”和“=”符号进行修改。 权限组合原理 Linux系统中的权限由字母…...
凡人修C传——专栏从凡人到成仙系列目录
这里先感谢博主THUNDER王给我提出来的一个创作建议,让我有了创作的灵感来创建这一篇博客以及凡人修C传这一个系列的文章。 本文最主要的目的就是给大家一个凡人修C传的一个目录,让大家更加容易学到自己想学的地方。 📝【个人主页】࿱…...
隐藏python代码,售卖并保护源代码
我写了一个基于pytorch框架的特殊卷积,他的使用方式和其他的卷积一样,但是我想把它卖出去,希望隐藏特殊卷积的代码 1、如果您希望隐藏特殊卷积的代码并将其作为一个可售卖的产品,可以考虑以下几种方法来保护您的代码:…...
Material—— VAT(Houdini To UE)
目录 一,介绍 二,柔体 二,刚体 一,介绍 VAT是将动画数据存储在纹理中,通过GPU运算来实现动画的技术;VAT纹理包含每个顶点在不同帧的位置信息,而每个像素代表一个顶点在某个时间点的位置&…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
