画布 1
Java RMI相关攻击面
  是什么
    Java rpc调用，client调用server上的远程方法，基于JRMP协议
    包含：RMIClient、RMIServer、RMIRegistry
    相关知识：JEP290
  攻击面
    RMIClient
      1、调用接口函数，函数直接返回序列化数据的情况，如：
Object testAttackRMIClient(String msg)
        备注：【概率低】，需要有对应的接口并且client去调用
      2、UnicastRef链/UnicastRemoteObject链，作为DGC客户端请求恶意Registry
        备注：通用反序列化链，反序列化的攻击方式之一。在攻击RMIRegistry时尝尝触发
    RMIServer
      1、接口函数被调用，函数需要Object/String等非基础数据类型时，如：
String testAttackRMIServer(Object o)，来自自己写的demo
public void setPin(String pin) ，来自RmiServerExample项目
        备注：
1）本质上是调用UnicastRef#unmarshalValue触发参数的反序列化
2）String参数也可以导致了攻击面大大增加，但是知道RMIServer 对应的接口才可以触发
    RMIRegistry
      RegistryImpl_Skel#dispatch bind/rebind/lookup流程中的readObject
        jdk < 8u121
          bind恶意Remote对象，参考ysoserial.exploit.RMIRegistryExploit
        jdk >=8u121
          UnicastRef利用链，攻击RMIRegistry转化成让其变成 DGC client
        jdk >= 8u141
          clientLookupObject (利用lookup流程无ACL限制，重写发送逻辑，发送Object) + UnicastRef链
        jdk >= 8u231
          clientLookupObject+ UnicastRemoteObject链
      DGCImpl_Skel#dispatch dirty/clean流程中的readObject
        jdk<8u121
          makeDGCCall，发送恶意对象，参考：ysoserial.exploit.JRMPClient（问题：是否有区别）
  感受与思考
    1、漏洞研究方法论：了解使用、复现漏洞、了解原理、输出（exp、笔记、检测思路等）
    2、研究成果等于公理，大部分情况知道（复现、利用、沉淀、检测思路更重要）ROI更高；完美主义交给资源足够时的漏洞研究者；
  相关工具
    ysoserial、ysomap
      ysoserial.exploit.RMIRegistryExploit（打RegistryImpl_Skel#dispatch中的bind流程）
      ysoserial.exploit.JRMPClient（打DGCImpl_Skel#dispath中的dirty流程）
      ysoserial.exploit.JRMPListener（DGC服务端攻击客户端）
      ysoserial.payloads.JRMPClient (UnicastRef利用链）
    BaRMIe
    RMITaste
    RMIScout
    RMG(remote-method-guesser) 2021年
    备注：工具可以攻击RMIRegistry，也可以被反制（常用的是UnicastRef链）
  2024.05 @thinkycx