天融信关于CVE-2018-2893 WebLogic反序列化漏洞分析
一、背景介绍
WebLogic是美国Oracle公司出品的一个Application Server,确切的说是一个基于JAVA EE架构的中间件, WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。
1.1 漏洞描述
Oracle官方在2018年7月发布了关键补丁更新,其中包含了Oracle WebLogic Server的一个高危的WebLogic反序列化漏洞,通过该漏洞,攻击者可以在未授权的情况下远程执行代码。
此漏洞产生于WebLogic T3服务,当开放WebLogic控制台端口(默认为7001端口)时,T3服务会默认开启,因此会造成较大影响。结合曾经爆出的WebLogic WLS 组件漏洞,不排除会有攻击者利用漏洞挖矿的可能,因此,建议受影响企业用户尽快部署防护措施。
1.2 受影响的系统版本
WebLogic10.3.6.0
WebLogic12.1.3.0
WebLogic12.2.1.2
WebLogic12.2.1.3
1.3 漏洞编号
CVE-2018-2893
二、漏洞细节
这次的WebLogic (CVE-2018-2893)漏洞和之前的JRMP协议漏洞(CVE-2018-2628)漏洞是分不开的,他是结合了RMI机制缺陷和JDK反序列化漏洞绕过了WebLogic黑名单,所以介绍这个漏洞之前,先回顾下之前的漏洞利用链。
在CVE-2015-4852 中利用的是Commons Collections 库,主流的两大利用链是TransformedMap和Lazymap,其实他们的核心都是类似的。
先拿TransformedMap做个介绍,核心是反射机制。
反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
对应得代码是这样,下面这段代码就可以通过反射调用java.net.URLClassLoader.class,这个类可以本地或者远程拉起任意的jar文件,同时不用管文件名后缀,直接读取二进制的jar文件。下面这个是拉起了一个反弹Shell功能的jar文件。
然后再来看看核心的反射方法,InvokerTransformer中的transform方法。这个方法就是实现执行任意类的核心方法,但是必须需要通过反序列化的方式调用这个方法。那么是如何调用的呢?
在TransformedMap中有三个方法调用了transform方法
下面就是找到谁调用了这3个方法中的一个,可以看到TransformdMap继承了父类,所有的类都实现了序列化接口,不然无法反序列化,这个不再重复强调
跟进这个父类
可以看到MapEntry调用的setValue调用了其中的checkSetvalue方法。好了哪里调用了setValue呢?
那就是经典的sun.reflect.annotation.AnnotationInvocationHandler,它重写了ReadObject反序列化的方法,其中就调用了MapEntry的SetValue方法。
然后WebLogic的T3协议走的都是ReadObject方法,所以你给他通过T3协议发送WriteObject方法序列化后的二进制字节,他就自然的走上面的攻击链了,下面附上完整攻击链。
LazyMap其实也是类似的,只不过借用了动态代理的方法去实现。
可以看到Lazymap中的get方法调用了transfrom方法。
经典的sun.reflect.annotation.AnnotationInvocationHandler的invoke方法中掉用了get方法,通过动态代理方式就可以调用这个方法。
然后谈谈RMI绕过,RMI又都是走的序列化和反序列化,所以CVE-2017-3248和CVE-2018-2628 漏洞都是这么绕过的。CVE-2018-2628是因为补丁只封堵了CVE-2017-3248的接口java.rmi.registry.Registry,然而CVE-2018-2628是利用了java.rmi.activation.Activator接口绕过了黑名单。
RMI是Remote Method Invocation的简称,是J2SE的一部分,能够让程序员开发出基于Java的分布式应用。一个RMI对象是一个远程Java对象,可以从另一个Java虚拟机上(甚至跨过网络)调用它的方法,可以像调用本地Java对象的方法一样调用远程对象的方法,使分布在不同的JVM中的对象的外表和行为都像本地对象一样。
RMI传输过程都使用序列化和反序列化,如果RMI服务端端口对外开发,并且服务端使用了像Apache CommonsCollections这类库,那么会导致远程命令执行。
一、背景介绍
WebLogic是美国Oracle公司出品的一个Application Server,确切的说是一个基于JAVA EE架构的中间件, WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。
1.1 漏洞描述
Oracle官方在2018年7月发布了关键补丁更新,其中包含了Oracle WebLogic Server的一个高危的WebLogic反序列化漏洞,通过该漏洞,攻击者可以在未授权的情况下远程执行代码。
此漏洞产生于WebLogic T3服务,当开放WebLogic控制台端口(默认为7001端口)时,T3服务会默认开启,因此会造成较大影响。结合曾经爆出的WebLogic WLS 组件漏洞,不排除会有攻击者利用漏洞挖矿的可能,因此,建议受影响企业用户尽快部署防护措施。
1.2 受影响的系统版本
WebLogic10.3.6.0
WebLogic12.1.3.0
WebLogic12.2.1.2
WebLogic12.2.1.3
1.3 漏洞编号
CVE-2018-2893
二、漏洞细节
这次的WebLogic (CVE-2018-2893)漏洞和之前的JRMP协议漏洞(CVE-2018-2628)漏洞是分不开的,他是结合了RMI机制缺陷和JDK反序列化漏洞绕过了WebLogic黑名单,所以介绍这个漏洞之前,先回顾下之前的漏洞利用链。 copyright 无奈人生
在CVE-2015-4852 中利用的是Commons Collections 库,主流的两大利用链是TransformedMap和Lazymap,其实他们的核心都是类似的。
先拿TransformedMap做个介绍,核心是反射机制。
反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
对应得代码是这样,下面这段代码就可以通过反射调用java.net.URLClassLoader.class,这个类可以本地或者远程拉起任意的jar文件,同时不用管文件名后缀,直接读取二进制的jar文件。下面这个是拉起了一个反弹Shell功能的jar文件。
然后再来看看核心的反射方法,InvokerTransformer中的transform方法。这个方法就是实现执行任意类的核心方法,但是必须需要通过反序列化的方式调用这个方法。那么是如何调用的呢?
在TransformedMap中有三个方法调用了transform方法
下面就是找到谁调用了这3个方法中的一个,可以看到TransformdMap继承了父类,所有的类都实现了序列化接口,不然无法反序列化,这个不再重复强调
跟进这个父类
可以看到MapEntry调用的setValue调用了其中的checkSetvalue方法。好了哪里调用了setValue呢?
那就是经典的sun.reflect.annotation.AnnotationInvocationHandler,它重写了ReadObject反序列化的方法,其中就调用了MapEntry的SetValue方法。
www.wnhack.com
然后WebLogic的T3协议走的都是ReadObject方法,所以你给他通过T3协议发送WriteObject方法序列化后的二进制字节,他就自然的走上面的攻击链了,下面附上完整攻击链。
LazyMap其实也是类似的,只不过借用了动态代理的方法去实现。
可以看到Lazymap中的get方法调用了transfrom方法。
经典的sun.reflect.annotation.AnnotationInvocationHandler的invoke方法中掉用了get方法,通过动态代理方式就可以调用这个方法。
然后谈谈RMI绕过,RMI又都是走的序列化和反序列化,所以CVE-2017-3248和CVE-2018-2628 漏洞都是这么绕过的。CVE-2018-2628是因为补丁只封堵了CVE-2017-3248的接口java.rmi.registry.Registry,然而CVE-2018-2628是利用了java.rmi.activation.Activator接口绕过了黑名单。 无奈人生安全网
RMI是Remote Method Invocation的简称,是J2SE的一部分,能够让程序员开发出基于Java的分布式应用。一个RMI对象是一个远程Java对象,可以从另一个Java虚拟机上(甚至跨过网络)调用它的方法,可以像调用本地Java对象的方法一样调用远程对象的方法,使分布在不同的JVM中的对象的外表和行为都像本地对象一样。
RMI传输过程都使用序列化和反序列化,如果RMI服务端端口对外开发,并且服务端使用了像Apache CommonsCollections这类库,那么会导致远程命令执行。
内容来自无奈安全网