WebLogic是Oracle公司出品的一个基于JAVAEE架构的中间件,用于开发、集成、部署和管理大型分布式Web应用。在国内外应用广泛,由于用的多,对其进行漏洞挖掘的大佬就多了,从而动不动就报个高危漏洞,打补丁都要累死人,最近两天又报多个高危漏洞了,本文不讲最新漏洞的利用,因为我也不知道怎么利用,通过整理和分析以前公开的高危漏洞,形成一个综合利用的工具,能够快速发现和利用Weblogic相关漏洞。
0x01 测试环境
要实现WebLogic的综合利用,就要有一个好的测试环境,目前官方支持的有10.3.6.0.0, 12.1.3.0.0, 12.2.1.3.0, 12.2.1.4.0, 14.1.1.0.0等多个版本,测试POC时,需要在多个版本下进行切换测试,比较麻烦,这里推荐一个QAX-A-Team大佬搞的一个环境工具,基于docker,能够在各个版本间快速切换,下载地址:https://github.com/QAX-A-Team/WeblogicEnvironment
0x02 利用思路
整理WebLogic爆出的高危漏洞,Java反序列化漏洞比较多,同时还有XML反序列化、xxe、文件上传等等,基于T3协议、IIOP协议和Http协议的都有。由于反序列化漏洞官方采取黑名单的方式修复,意味着只要绕过黑名单限制就有新的POC,这种机制也就导致各种绕过,所以黑名单是不靠谱的。针对反序列化漏洞的利用,大佬们已经整理出了多个利用链,用得最多、最出名的利用链还是ysoserial,下载地址:
https://github.com/frohoff/ysoserial
反序列化漏洞能执行任意命令,针对目标服务器能访问互联网的情况下可以直接反弹Shell到VPS上,如果目标服务器不能访问互联网,弹shell就没用了,这时就需要回显命令执行的结果,大佬们经过分析已经有很多针对Weblogic漏洞的回显思路。总结一下:如果是T3/T3S、IIOP协议,可通过漏洞绑定一个RMIShell(JNDIShell),然后通过JNDI去调用Shell实现命令执行回显、文件上传等功能。如果是HTTP协议,则需要通过漏洞在利用Payload中获取到Weblogic服务器的Response对象,使用Response对象会显命令执行结果。
0x03 命令回显
在反序列化漏洞中,Payload分为两类,一类是能直接执行命令的,如:ysoserial的CommonsCollections1利用链,另一类是间接执行命令的(就是需要通过别的路径加载Payload才能执行),如:JRMPClient。直接执行命令Payload根据利用链的不同又可分为两种,一种是通过链式调用执行命令,另外是借助TemplatesImpl类反序列化加载恶意字节码实现执行命令。T3或IIOP协议漏洞的回显利用,网上大佬的思路是在Payload中去使用org.mozilla.classfile.DefiningClassLoader加载恶意类的字节数组,实现绑定Shell回显,参见文章:https://xz.aliyun.com/t/7228
我尝试过,在高版本的Weblogic中会提示DefiningClassLoader类无法找到,因此我找了一个功能相似的类weblogic.utils.classloaders.ClasspathClassLoader用于替代,同时所有版本的Weblogic都能用,ClasspathClassLoader类的defineCodeGenClass方法,可直接加载一个字节数组为类,代码如下:
byte[] buf = ClassFiles.classAsBytes(echoClass);final Transformer transformerChain = new ChainedTransformer(new Transformer[]{});final Transformer[] transformers = new Transformer[]{ new ConstantTransformer(ClasspathClassLoader.class), new InvokerTransformer("getDeclaredConstructor", new Class[]{Class[].class}, new Object[]{new Class[0]}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[0]}), new InvokerTransformer("defineCodeGenClass", new Class[]{String.class, byte[].class, URL.class}, new Object[]{echoClass.getName(), buf, null}), new ConstantTransformer(1)};
通过Payload链直接绑定一个weblogic.cluster.singleton.ClusterMasterRemote类的对象为RMIShell,具体代码参见项目:
https://github.com/5up3rc/weblogic_cmd
HTTP协议的回显利用,Weblogic 11g和12c的利用方式有所不同,主要是获取Response对象的方式不太一样,11g代码如下:
ExecuteThread thread= (ExecuteThread) Thread.currentThread();ServletRequestImpl req= (ServletRequestImpl) thread.getCurrentWork();ServletResponseImpl res=req.getResponse();
12c代码如下:
ExecuteThread thread= (ExecuteThread) Thread.currentThread();ContainerSupportProviderImpl.WlsRequestExecutor executor = (ContainerSupportProviderImpl.WlsRequestExecutor) thread.getCurrentWork();Field field = ContainerSupportProviderImpl.WlsRequestExecutor.class.getDeclaredField("connectionHandler");field.setAccessible(true);HttpConnectionHandler httpConn = (HttpConnectionHandler) field.get(executor);ServletRequestImpl req=httpConn.getServletRequest();ServletResponseImpl res=req.getResponse();
具体详情可参见文章:
https://xz.aliyun.com/t/5299
0x04 踩过的坑
在实现某些漏洞利用的时候碰到一些坑,这里记录一下:1)、T3协议反序列化漏洞Payload的发送有两种方式,一种是可以通过InitialContext的bind方法来发送payload,参见文章
https://paper.seebug.org/1105/#rmi-iiop_1
另一种是采用上面提到的weblogic_cmd项目中的T3ProtocolOperation类来发送Payload,由于通过bind的方法的发送payload在不同的weblogic中会遇到不同的问题,如假死的情况,最后选择了第二种方法来发送Payload。
网络环境的影响,需要手动修改IOPProfile类,指定ip和端口,具体原理参见https://paper.seebug.org/1149/#nat
为避免假死问题,需要设置超时时间,iiop的超时weblogic.jndi.requestTimeout设置必须为字符串类型,不然不会生效很奇葩的问题。
0x05 综合利用
实现了一个Weblogic漏洞利用的工具,目前支持CVE_2015_4852 、CVE_2016_0638、CVE_2016_3510、CVE_2017_10271、CVE_2017_3248、CVE_2018_2628、CVE_2018_2893、CVE_2018_2894 CVE_2018_3252、CVE_2018_3191、CVE_2018_3245、CVE_2019_2725 CVE_2019_2729、CVE_2020_2551、CVE_2020_2555这些吧,能回显的直接回显,不能回显的通过dnslog判断漏洞是否存在,源码已经放到了github上,地址:https://github.com/21superman/weblogic_exploit
效果:
CVE_2020_2551
CVE_2019_2725
CVE_2018_3252