BECL 利用链使用条件及原理
1. BECL 利用链核心原理
BECL 利用链的核心原理可以概括为:利用一个看似无害的内部类,间接调用受限的命令执行函数
它主要利用了 com.bea.core.event.JmsEvent
类及其相关类的反序列化过程。当一个 JmsEvent
对象被反序列化时,它会触发一系列的事件监听器,其中一个监听器会调用 execute()
方法来执行一个命令
BECL 的攻击链通常如下:
- 构造恶意对象: 攻击者首先构造一个恶意的 Java 对象,该对象包含一个指向目标命令执行函数的引用。这个对象通常会利用 Java 的反射机制,指向
java.lang.Runtime
类的exec()
方法 - 触发点:
com.bea.core.events.JmsEvent
: 攻击者将上述恶意对象封装在一个JmsEvent
对象中。当这个JmsEvent
对象被反序列化时,它会触发readObject()
方法 - 事件监听:
com.bea.core.events.SerializableEventListener
:JmsEvent
的反序列化会调用com.bea.core.events.SerializableEventListener
的handleEvent()
方法 - 命令执行:
java.lang.Runtime.exec()
:SerializableEventListener
的handleEvent()
方法会进一步调用攻击者预设的恶意对象,最终导致java.lang.Runtime.exec()
方法被执行,从而在服务器上执行任意系统命令
简单来说,BECL 利用链就像一个接力赛:
- 第一棒(攻击者): 构造恶意序列化数据
- 第二棒(
JmsEvent
): 接收并开始反序列化 - 第三棒(
SerializableEventListener
): 自动被触发,并调用下一步 - 第四棒(反射调用): 恶意代码被执行,如
Runtime.exec("your_command")
这个过程巧妙地绕过了黑名单,因为被直接反序列化的 JmsEvent
类本身是 WebLogic 内部的合法组件,并不在黑名单上
3. BECL 利用链的使用条件
要成功利用 BECL 攻击链,必须满足以下几个关键条件:
- 存在反序列化漏洞: 这是所有反序列化漏洞利用的前提。目标服务器必须存在一个可被攻击者控制的、未经验证的反序列化入口点。例如,
t3
、IIOP
等协议都是常见的反序列化入口点 - 目标为 WebLogic Server: BECL 利用链的 Gadget Chain 是WebLogic 独有的。因为它依赖于
com.bea.core.event
这个特定于 WebLogic 的类库。因此,这个利用链不适用于 JBoss、Tomcat 或其他应用服务器 - 未修补的 WebLogic 版本: 漏洞利用链通常依赖于特定版本的软件。BECL 链主要影响较早版本的 WebLogic Server,特别是那些已经部署了黑名单,但仍未修复此漏洞的版本
- 可被利用的 JRE 类库: 尽管 BECL 的核心 Gadget 在 WebLogic 中,但它通常还需要依赖 Java 环境中的其他类,比如
java.lang.reflect
等,来完成反射调用