RmiTaste源码浅析及实战运用
字数 1358 2025-08-09 15:23:15

RmiTaste工具深度解析与实战应用指南

一、工具概述

RmiTaste是一款用于检测、枚举、交互和攻击RMI服务的强大工具,主要功能包括:

  • 连接检测:验证目标RMI服务是否可达
  • 服务枚举:发现目标主机中的RMI服务
  • 漏洞攻击:利用ysoserial中的序列化链进行攻击
  • 方法调用:调用远程服务上的特定方法

二、工具架构分析

1. 目录结构

helpers/        # 辅助工具类
  |- IO读写类
  |- 命令行参数解析类
rmitaste/       # 核心代码
  |- commands/  # 四种命令的实现
  |- rmi/       # 远程连接处理类
  |- utils/     # 日志工具类
  |- Main.java  # 入口文件

2. 核心类继承关系

所有命令类都继承自BasicCommand基类,包含四个主要命令类:

  1. ConnectionCommand - 连接检测
  2. EnumerateCommand - 服务枚举
  3. AttackCommand - 漏洞攻击
  4. CallCommand - 方法调用

三、核心功能实现原理

1. 连接检测实现

Registry reg = LocateRegistry.getRegistry(host, port);

2. 服务枚举实现

核心流程:

Enumerate enumerate = new Enumerate(target, port);
enumerate.enumerate();
RmiRegistry rmiRegistry = enumerate.getRegistry();

详细执行步骤:

  1. 建立连接:获取Registry对象
  2. 加载对象
    • 调用list()获取服务名列表
    • 通过改造的lookup()方法获取服务详情
  3. 加载对象引用:获取远程对象引用

关键技术点:自定义反序列化

原生lookup()的问题:

  • 直接使用readObject()反序列化
  • 需要classpath中存在目标类

RmiTaste的解决方案:

  1. 通过反射获取输入流字节数据
  2. 使用RmiObjectParser自定义解析
  3. 将类信息保存为RmiObjectClass对象
  4. 避免直接使用Class.forName

3. 漏洞攻击实现

攻击流程:

Attack attack = new Attack(rmiRegistry, payloadGenerator);
attack.attackRegistry(methodsList);
RemoteRef.invoke();

支持多种攻击模式:

  • 调用单个方法
  • 从文件读取多个方法
  • 批量执行绑定类方法
  • 使用ysoserial所有payload或指定payload

4. 方法调用实现

Attack attack = new Attack(rmiRegistry);
Object result = attack.invokeMethod(elements.get(2), elements.get(3), elements.get(4), params);

四、实战问题与解决方案

Bug 1: 大长度字符串解析问题

现象

  • 解析classAnnotations时,长度值转为short后变为负数
  • 导致无法创建byte数组

原因分析

  • classAnnotation中字符串长度可能超过short最大值(32767)
  • 工具使用getShort()读取两字节长度

解决方案
添加getBigShort()方法直接转为int:

private Integer getBigShort() {
    Integer r = (Integer)(((this.getByte() << 8) & 0xFF00) | (this.getByte() & 0xFF));
    return r;
}

Bug 2: 无限循环问题

现象

  • parseClassAnnotation()使用while(true)循环
  • 数据读取完毕后getByte()返回-1导致异常

解决方案
在循环中添加-1判断:

while(true){
    b = this.getByte();
    if(b == -1 || b == TC_ENDBLOCKDATA){
        break;
    }
    // ...其他处理
}

五、Jira漏洞检测实战

检测流程

  1. 连接目标Jira的40001端口
  2. 枚举RMI服务
  3. 分析服务暴露的方法
  4. 构造恶意序列化payload
  5. 发起攻击

注意事项

  • 确保目标类在classpath中才能获取完整方法信息
  • 对于大型Annotation数据需要特殊处理
  • 使用SerializationDumper等工具辅助分析序列化数据

六、工具增强建议

  1. 增加对大长度字符串的完整支持
  2. 完善异常处理机制
  3. 添加对更多RMI特性的支持
  4. 优化性能,特别是处理大型Annotation时

七、参考工具

  • SerializationDumper:序列化数据流分析工具
  • ysoserial:Java反序列化漏洞利用工具集

通过深入理解RmiTaste的实现原理和实战中遇到的问题,可以更有效地利用该工具进行RMI服务安全检测和漏洞利用。

RmiTaste工具深度解析与实战应用指南 一、工具概述 RmiTaste是一款用于检测、枚举、交互和攻击RMI服务的强大工具,主要功能包括: 连接检测:验证目标RMI服务是否可达 服务枚举:发现目标主机中的RMI服务 漏洞攻击:利用ysoserial中的序列化链进行攻击 方法调用:调用远程服务上的特定方法 二、工具架构分析 1. 目录结构 2. 核心类继承关系 所有命令类都继承自 BasicCommand 基类,包含四个主要命令类: ConnectionCommand - 连接检测 EnumerateCommand - 服务枚举 AttackCommand - 漏洞攻击 CallCommand - 方法调用 三、核心功能实现原理 1. 连接检测实现 2. 服务枚举实现 核心流程: 详细执行步骤: 建立连接 :获取Registry对象 加载对象 : 调用 list() 获取服务名列表 通过改造的 lookup() 方法获取服务详情 加载对象引用 :获取远程对象引用 关键技术点:自定义反序列化 原生 lookup() 的问题: 直接使用 readObject() 反序列化 需要classpath中存在目标类 RmiTaste的解决方案: 通过反射获取输入流字节数据 使用 RmiObjectParser 自定义解析 将类信息保存为 RmiObjectClass 对象 避免直接使用 Class.forName 3. 漏洞攻击实现 攻击流程: 支持多种攻击模式: 调用单个方法 从文件读取多个方法 批量执行绑定类方法 使用ysoserial所有payload或指定payload 4. 方法调用实现 四、实战问题与解决方案 Bug 1: 大长度字符串解析问题 现象 : 解析classAnnotations时,长度值转为short后变为负数 导致无法创建byte数组 原因分析 : classAnnotation中字符串长度可能超过short最大值(32767) 工具使用 getShort() 读取两字节长度 解决方案 : 添加 getBigShort() 方法直接转为int: Bug 2: 无限循环问题 现象 : parseClassAnnotation() 使用while(true)循环 数据读取完毕后getByte()返回-1导致异常 解决方案 : 在循环中添加-1判断: 五、Jira漏洞检测实战 检测流程 连接目标Jira的40001端口 枚举RMI服务 分析服务暴露的方法 构造恶意序列化payload 发起攻击 注意事项 确保目标类在classpath中才能获取完整方法信息 对于大型Annotation数据需要特殊处理 使用SerializationDumper等工具辅助分析序列化数据 六、工具增强建议 增加对大长度字符串的完整支持 完善异常处理机制 添加对更多RMI特性的支持 优化性能,特别是处理大型Annotation时 七、参考工具 SerializationDumper:序列化数据流分析工具 ysoserial:Java反序列化漏洞利用工具集 通过深入理解RmiTaste的实现原理和实战中遇到的问题,可以更有效地利用该工具进行RMI服务安全检测和漏洞利用。