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. 标准攻击流程
- 构建恶意序列化代码
- 初始化上下文实例
- 通过bind/rebind发送恶意序列化代码
2. 关键流程分析
-
初始化上下文流程:
- 通过
InitialContext(env)构建 - 最终由
InitialContextFactoryImpl.getInitialContext初始化 - 使用
ORBHelper.getORBHelper().getORBReference获取NameService - 基于NameService创建上下文实例
- 通过
-
rebind流程:
- 通过
getContext获取上下文对象 - 使用
rebind_any发送序列化代码 - 通过
_request建立Socket通信 - 通过
_invoke执行最终操作
- 通过
3. 完整执行流程
获取NameService → 创建上下文实例 → 发起request请求 → 执行rebind_any操作
四、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参数
- 修改
-
字节码修改:
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. 关键修改点
-
修改
ContextImpl.rebind方法:- 将正确IP和端口存入系统环境变量
-
修改
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. 验证方法
- 使用Wireshark抓包分析通信过程
- 观察是否成功建立两次通信(LocateRequest和Request)
- 检查命令执行结果
七、防御建议
- 限制IIOP端口的公网访问
- 及时安装Weblogic安全补丁
- 监控异常IIOP通信流量
- 使用网络防火墙限制不必要的协议
八、总结
本文详细分析了Weblogic IIOP协议在NAT环境下的通信问题,并提供了三种有效的绕过方案。在实际渗透测试中,可以根据具体环境选择最适合的技术方案。三种方案各有优劣,安全研究人员应当根据实际情况灵活选择。
九、参考资料
- Oracle GIOP协议规范文档
- Weblogic官方文档
- Javassist官方文档
- CVE-2020-2555漏洞分析资料