Weblogic IIOP 协议NAT 网络绕过
字数 2447 2025-08-19 12:41:14

Weblogic IIOP协议NAT网络绕过技术深度解析

一、背景与概述

Weblogic服务器在企业环境中广泛使用,但在渗透测试过程中,通过IIOP协议发送序列化恶意代码包时,经常会遇到由于NAT网络环境导致的通信失败问题。本文深入分析Weblogic IIOP协议在NAT环境下的绕过技术,提供三种有效的解决方案。

二、核心协议解析

1. 相关协议定义

  • RMI:远程方法调用,Java实现的RPC服务,底层使用JRMP协议
  • CORBA:跨语言通信体系结构,支持C++、Java等
  • GIOP:通用ORB间协议,定义传输语法和通信格式标准
  • IIOP:基于TCP/IP的GIOP实现,CORBA对象间通信协议
  • RMI-IIOP:整合RMI和CORBA/IIOP的技术方案
  • Weblogic IIOP:Weblogic自实现的RMI-IIOP协议
  • T3:Weblogic特有的RMI数据传输协议

2. 协议关系

在Weblogic中,T3协议和IIOP协议都可以用于序列化攻击。由于RMI-IIOP可以兼容RMI和IIOP,因此所有可以通过T3协议发起的序列化攻击都可以通过IIOP协议实现。

三、IIOP序列化攻击流程

1. 标准攻击流程

  1. 构建恶意序列化代码
  2. 初始化上下文实例
  3. 通过bind/rebind发送恶意序列化代码

2. 关键流程分析

  1. 初始化上下文流程

    • 通过InitialContext(env)构建
    • 最终由InitialContextFactoryImpl.getInitialContext初始化
    • 使用ORBHelper.getORBHelper().getORBReference获取NameService
    • 基于NameService创建上下文实例
  2. rebind流程

    • 通过getContext获取上下文对象
    • 使用rebind_any发送序列化代码
    • 通过_request建立Socket通信
    • 通过_invoke执行最终操作

3. 完整执行流程

获取NameService → 创建上下文实例 → 发起request请求 → 执行rebind_any操作

四、NAT环境问题分析

1. 问题现象

在NAT环境下,当尝试与公网Weblogic服务器建立IIOP连接时,会出现"Operation time out"异常。

2. 根本原因

  1. createEndPoint方法中,Weblogic使用内网IP和端口建立Socket连接
  2. 该方法通过MuxableSocketIIOP.createConnection建立连接
  3. Weblogic启动时默认监听内网网卡IP和端口(即使同时监听0.0.0.0)

3. 问题定位

  1. 通过Wireshark抓包分析:
    • 第一次通信:LocateRequest类型,获取NameService
    • 第二次通信:Request类型,执行rebind_any操作
  2. 在NAT环境中,第二次通信尝试连接内网IP导致失败

五、NAT绕过解决方案

方案1:GIOP协议极简实现

1. 原理

直接实现GIOP协议,避免依赖Weblogic的客户端实现:

  • 手动构造LocateRequest获取NameService
  • 手动构造Request执行rebind_any操作

2. 实现步骤

  1. 构造LocateRequest

    • 构建GIOP Header(Magic+Version+Message Type+Message Size)
    • 设置Message Type为LocateRequest(0x0A)
  2. 构造Request

    • 构建GIOP Header
    • 设置Message Type为Request(0x00)
    • 包含序列化payload

3. 优缺点

优点

  • 原始Socket发包,效率高
  • 不依赖Weblogic客户端实现

缺点

  • 构造难度高
  • 需要深入理解GIOP协议细节

方案2:Javassist字节码修改

1. 原理

使用Javassist在运行时修改关键方法,将内网IP和端口替换为公网地址。

2. 实现步骤

  1. 定位关键方法

    • 修改newSocket方法,替换host和port参数
  2. 字节码修改

    ClassPool pool = ClassPool.getDefault();
    CtClass cc = pool.get("weblogic.iiop.EndPoint");
    CtMethod m = cc.getDeclaredMethod("newSocket");
    m.setBody("{...替换逻辑...}");
    cc.toClass();
    

3. 优缺点

优点

  • 修改难度相对较低
  • 不需要修改原始代码

缺点

  • 需要程序重启或动态加载
  • 可能造成资源占用过高

方案3:源代码修改

1. 原理

直接修改Weblogic相关类的源代码,修正IOR获取逻辑。

2. 关键修改点

  1. 修改ContextImpl.rebind方法

    • 将正确IP和端口存入系统环境变量
  2. 修改IIOPRemoteRef.locateIORForRequest方法

    • 从环境变量读取正确IP和端口
    • 修改ior对象的连接信息

3. 具体实现

// 在rebind方法中添加
System.setProperty("weblogic.iiop.host", publicIP);
System.setProperty("weblogic.iiop.port", publicPort);

// 在locateIORForRequest中修改
String host = System.getProperty("weblogic.iiop.host");
String port = System.getProperty("weblogic.iiop.port");
ior = modifyIOR(ior, host, port);

4. 优缺点

优点

  • 原生代码兼容性最好
  • 稳定性高

缺点

  • 需要修改Weblogic源代码
  • 部署复杂度较高

六、环境搭建与验证

1. 测试环境

  • Weblogic版本:12.1.3.0
  • 漏洞编号:CVE-2020-2555
  • 内网环境:Windows 10.10.10.173:7001
  • NAT环境:Vulfocus 118.193.36.37:32769(内部IP 172.17.0.5)

2. 验证方法

  1. 使用Wireshark抓包分析通信过程
  2. 观察是否成功建立两次通信(LocateRequest和Request)
  3. 检查命令执行结果

七、防御建议

  1. 限制IIOP端口的公网访问
  2. 及时安装Weblogic安全补丁
  3. 监控异常IIOP通信流量
  4. 使用网络防火墙限制不必要的协议

八、总结

本文详细分析了Weblogic IIOP协议在NAT环境下的通信问题,并提供了三种有效的绕过方案。在实际渗透测试中,可以根据具体环境选择最适合的技术方案。三种方案各有优劣,安全研究人员应当根据实际情况灵活选择。

九、参考资料

  1. Oracle GIOP协议规范文档
  2. Weblogic官方文档
  3. Javassist官方文档
  4. CVE-2020-2555漏洞分析资料
Weblogic IIOP协议NAT网络绕过技术深度解析 一、背景与概述 Weblogic服务器在企业环境中广泛使用,但在渗透测试过程中,通过IIOP协议发送序列化恶意代码包时,经常会遇到由于NAT网络环境导致的通信失败问题。本文深入分析Weblogic IIOP协议在NAT环境下的绕过技术,提供三种有效的解决方案。 二、核心协议解析 1. 相关协议定义 RMI :远程方法调用,Java实现的RPC服务,底层使用JRMP协议 CORBA :跨语言通信体系结构,支持C++、Java等 GIOP :通用ORB间协议,定义传输语法和通信格式标准 IIOP :基于TCP/IP的GIOP实现,CORBA对象间通信协议 RMI-IIOP :整合RMI和CORBA/IIOP的技术方案 Weblogic IIOP :Weblogic自实现的RMI-IIOP协议 T3 :Weblogic特有的RMI数据传输协议 2. 协议关系 在Weblogic中,T3协议和IIOP协议都可以用于序列化攻击。由于RMI-IIOP可以兼容RMI和IIOP,因此所有可以通过T3协议发起的序列化攻击都可以通过IIOP协议实现。 三、IIOP序列化攻击流程 1. 标准攻击流程 构建恶意序列化代码 初始化上下文实例 通过bind/rebind发送恶意序列化代码 2. 关键流程分析 初始化上下文流程 : 通过 InitialContext(env) 构建 最终由 InitialContextFactoryImpl.getInitialContext 初始化 使用 ORBHelper.getORBHelper().getORBReference 获取NameService 基于NameService创建上下文实例 rebind流程 : 通过 getContext 获取上下文对象 使用 rebind_any 发送序列化代码 通过 _request 建立Socket通信 通过 _invoke 执行最终操作 3. 完整执行流程 四、NAT环境问题分析 1. 问题现象 在NAT环境下,当尝试与公网Weblogic服务器建立IIOP连接时,会出现"Operation time out"异常。 2. 根本原因 在 createEndPoint 方法中,Weblogic使用内网IP和端口建立Socket连接 该方法通过 MuxableSocketIIOP.createConnection 建立连接 Weblogic启动时默认监听内网网卡IP和端口(即使同时监听0.0.0.0) 3. 问题定位 通过Wireshark抓包分析: 第一次通信:LocateRequest类型,获取NameService 第二次通信:Request类型,执行rebind_ any操作 在NAT环境中,第二次通信尝试连接内网IP导致失败 五、NAT绕过解决方案 方案1:GIOP协议极简实现 1. 原理 直接实现GIOP协议,避免依赖Weblogic的客户端实现: 手动构造LocateRequest获取NameService 手动构造Request执行rebind_ any操作 2. 实现步骤 构造LocateRequest : 构建GIOP Header(Magic+Version+Message Type+Message Size) 设置Message Type为LocateRequest(0x0A) 构造Request : 构建GIOP Header 设置Message Type为Request(0x00) 包含序列化payload 3. 优缺点 优点 : 原始Socket发包,效率高 不依赖Weblogic客户端实现 缺点 : 构造难度高 需要深入理解GIOP协议细节 方案2:Javassist字节码修改 1. 原理 使用Javassist在运行时修改关键方法,将内网IP和端口替换为公网地址。 2. 实现步骤 定位关键方法 : 修改 newSocket 方法,替换host和port参数 字节码修改 : 3. 优缺点 优点 : 修改难度相对较低 不需要修改原始代码 缺点 : 需要程序重启或动态加载 可能造成资源占用过高 方案3:源代码修改 1. 原理 直接修改Weblogic相关类的源代码,修正IOR获取逻辑。 2. 关键修改点 修改 ContextImpl.rebind 方法 : 将正确IP和端口存入系统环境变量 修改 IIOPRemoteRef.locateIORForRequest 方法 : 从环境变量读取正确IP和端口 修改ior对象的连接信息 3. 具体实现 4. 优缺点 优点 : 原生代码兼容性最好 稳定性高 缺点 : 需要修改Weblogic源代码 部署复杂度较高 六、环境搭建与验证 1. 测试环境 Weblogic版本:12.1.3.0 漏洞编号:CVE-2020-2555 内网环境:Windows 10.10.10.173:7001 NAT环境:Vulfocus 118.193.36.37:32769(内部IP 172.17.0.5) 2. 验证方法 使用Wireshark抓包分析通信过程 观察是否成功建立两次通信(LocateRequest和Request) 检查命令执行结果 七、防御建议 限制IIOP端口的公网访问 及时安装Weblogic安全补丁 监控异常IIOP通信流量 使用网络防火墙限制不必要的协议 八、总结 本文详细分析了Weblogic IIOP协议在NAT环境下的通信问题,并提供了三种有效的绕过方案。在实际渗透测试中,可以根据具体环境选择最适合的技术方案。三种方案各有优劣,安全研究人员应当根据实际情况灵活选择。 九、参考资料 Oracle GIOP协议规范文档 Weblogic官方文档 Javassist官方文档 CVE-2020-2555漏洞分析资料