
Registro RMI malicioso que explota la deserialización insegura de Java mediante los métodos list/lookup/bind. Genera y entrega gadgets de Ysoserial para desencadenar la ejecución remota de código en clientes vulnerables.
Ermir es un Registro RMI Malicioso/Pícaro, explota la deserialización insegura en cualquier código Java que llame a métodos RMI estándar sobre él (list()/lookup()/bind()/rebind()/unbind()).
Instala Ermir desde rubygems.org:
$ gem install ermir
o clona el repositorio y construye la gema:
$ git clone https://github.com/hakivvi/ermir.git
$ rake install
Ermir es una gema de línea de comandos, viene con 2 archivos CLI ermir y gadgetmarshal, ermir es la gema en sí y el último es solo una interfaz atractiva para el archivo GadgetMarshaller.java que reescribe los gadgets de Ysoserial para que coincidan con los requisitos de MarshalInputStream. La salida debe ser luego canalizada a ermir o a un archivo. En caso de gadgets personalizados, usa MarshalOutputStream en lugar de ObjectOutputStream para escribir tu objeto serializado en el flujo de salida.
Uso de 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 bind the RMI Registry to this ip and port (default: 0.0.0.0:1099).
-f, --file path to file containing the gadget to be deserialized.
-p, --pipe read the serialized gadget from the standard input stream.
-v, --version print Ermir version.
-h, --help print options help.
Example:
$ gadgetmarshal /path/to/ysoserial.jar Groovy1 calc.exe | ermir --listen 127.0.0.1:1099 --pipe
Uso de gadgetmarshal:
➜ ~ gadgetmarshal
Usage: gadgetmarshal /path/to/ysoserial.jar Gadget1 cmd (optional)/path/to/output/file
java.rmi.registry.Registry ofrece 5 métodos: list(), lookup(), bind(), rebind(), unbind():
public Remote lookup(String name): lookup() busca un objeto vinculado en el registro por su nombre. El registro devuelve un objeto Remote que referencia al objeto remoto buscado. El objeto devuelto se lee usando MarshalInputStream.readObject(), que es solo otra capa sobre ObjectInputStream. Básicamente, espera después de cada descriptor de clase/proxy (TC_CLASSDESC/TC_PROXYCLASSDESC) una URL que se usará para cargar esa clase o clase proxy. Este es el mismo error salvaje que fue corregido en jdk7u21. (Ermir no especifica esta URL, ya que solo las versiones antiguas de Java son vulnerables; en su lugar, escribe null). Como los gadgets de Ysoserial se serializan usando ObjectOutputStream, Ermir usa gadgetmarshal —un envoltorio alrededor de GadgetMarshaller.java— para serializar el gadget especificado de modo que coincida con los requisitos de MarshalInputStream.

public String[] list(): list() pide al registro todos los nombres de objetos vinculados. Si bien el tipo String no puede ser sustituido por un gadget malicioso porque no es como cualquier objeto común y no se lee usando readObject() sino readUTF(), sin embargo, como list() devuelve String[] que es un objeto real y se lee usando readObject(), Ermir envía el gadget en lugar de este tipo String[].

public void bind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2): bind() vincula un objeto a un nombre en el registro. En el caso de bind(), el tipo de retorno es void y no se devuelve nada. Sin embargo, si el registro especifica en el paquete de datos de retorno RMI que este retorno es un retorno excepcional, el cliente/servidor cliente llamará a readObject() a pesar de que el tipo de retorno sea void. Así es como el registro envía excepciones a su cliente (normalmente java.lang.ClassNotFoundException). Una vez más, Ermir entregará el gadget serializado en lugar de un objeto Exception legítimo.

public void rebind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2): rebind() reemplaza el enlace del nombre pasado con la referencia remota suministrada. También devuelve void. Ermir retorna una excepción como en bind().
public void unbind(java.lang.String $param_String_1): unbind() desvincula un objeto remoto por nombre en el registro RMI. Este también devuelve void.

Los informes de errores y las solicitudes de extracción son bienvenidos en GitHub en https://github.com/hakivvi/ermir. Este proyecto pretende ser un espacio seguro y acogedor para la colaboración, y se espera que los contribuyentes se adhieran al código de conducta.
La gema está disponible como código abierto bajo los términos de la Licencia MIT.
Se espera que todos los que interactúan en los códigos base, rastreadores de incidencias, salas de chat y listas de correo del proyecto Ermir sigan el código de conducta.