背景
通常在渗透的过程中会遇到很多 Weblogic 服务器,但通过 IIOP 协议进行发送序列化恶意代码包时,会面临着无法建立通讯请求发送恶意序列化失败。最近参与了一场在成都举办的《FreeTalk 2020 成都站》,有幸分享了关于 Weblogic IIOP 协议 NAT 绕过的几种方式。
PPT 下载地址:https://img.zhiiyun.com/Weblogic_IIOP_NAT.pptx
成果演示
Goby 工具中关于 Weblogic 基本都是用了 IIOP 协议绕过的方案,比较有代表性的漏洞为 CVE-2020-2551 漏洞。
内部工具 weblogic-framework
使用了多项核心技术来进行优雅的测试 Weblogic,其中也使用了 IIOP 协议的绕过方案。
协议
在开始之前,非常有比较提及一下以下这些协议相关的内容:
RMI:远程方法调用,本质上是 RPC 服务的 JAVA 实现,底层实现是 JRMP 协议,主要场景是分布式系统。
CORBA:跨语言(C ++、Java等)的通信体系结构,通常在 IIOP 协议中使用。
GIOP:主要提供标准的传输语法以及 ORB 通信的信息格式标准。
IIOP:CORBA 对象之间交流的协议,GIOP 的实现。
RMI-IIOP:解决 RMI 和 CORBA/IIOP 无法同时使用的技术方案。
Weblogic IIOP:Weblogic 自实现的 RMI-IIOP。
T3:WebLogic Server 中的 RMI 通信使用 T3 协议传输 WebLogic Server 和其他 Java 程序,包括客户端及其他 WebLogic Server 实例之间 数据。
T3 协议本质上 RMI 中传输数据使用的协议,但通过上面我们看到 RMI-IIOP 是可以兼容 RMI 和 IIOP 的,所以在 Weblogic 中只要可以通过 T3 序列化恶意代码的都可以通过 IIOP 协议进行序列化,正是因为这种情况,我进入 Weblogic 第三季度深度贡献者名单。
流程
IIOP 序列化攻击流程
一般 IIOP 序列化攻击的大致流程主要为首先构建恶意序列化代码,然后初始化上下文实例,最后通过 bind/rebind
进行发送恶意序列化代码,下图为关键代码。
IIOP 初始化上下文流程
初始化上下文通过攻击流程中的 new InitialContext(env)
进行构建,最终的入口点通过 getInitialContext
方法进行构建,最终是进行流入到 InitialContextFactoryImpl.getInitialContext
进行初始化上下文。
在流入 InitialContextFactoryImpl.getInitialContext
之后会通过 obj = ORBHelper.getORBHelper().getORBReference
来进行获取 NameService
,然后将获取到的 NameService
进行实例化创建上下文实例,提供后续的执行操作。