
Rogue RMI Registry explorando desserialização Java insegura através dos métodos list/lookup/bind. Gera e entrega gadgets do Ysoserial para desencadear execução remota de código em clientes vulneráveis.
Ermir é um Registro RMI Maligno/Rogue, que explora desserialização insegura em qualquer código Java que chame métodos RMI padrão nele (list()/lookup()/bind()/rebind()/unbind()).
Instale o Ermir a partir do rubygems.org:
$ gem install ermir
ou clone o repositório e construa a gem:
$ git clone https://github.com/hakivvi/ermir.git
$ rake install
Ermir é uma gem de CLI, vem com 2 arquivos CLI ermir e gadgetmarshal, ermir é a gem real e o último é apenas uma interface elegante para o arquivo GadgetMarshaller.java que reescreve os gadgets de Ysoserial para atender aos requisitos de MarshalInputStream, a saída deve ser então canalizada para ermir ou um arquivo; no caso de gadgets personalizados, use MarshalOutputStream em vez de ObjectOutputStream para escrever seu objeto serializado para o fluxo de saída.
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 oferece 5 métodos: list(), lookup(), bind(), rebind(), unbind():
public Remote lookup(String name): lookup() procura um objeto vinculado no registro pelo seu nome, o registro retorna um objeto Remote que referencia o objeto remoto que foi procurado, o objeto retornado é lido usando MarshalInputStream.readObject() que é apenas outra camada sobre ObjectInputStream, basicamente espera que após cada descritor de classe/proxy (TC_CLASSDESC/TC_PROXYCLASSDESC) uma URL que será usada para carregar essa classe ou classe proxy. Este é o mesmo bug selvagem que foi corrigido em jdk7u21. (Ermir não especifica esta URL, pois apenas versões antigas do Java são vulneráveis, em vez disso apenas escreve null). Como os gadgets do Ysoserial estão sendo serializados usando ObjectOutputStream, Ermir usa gadgetmarshal - um wrapper em torno de GadgetMarshaller.java - para serializar o gadget especificado para atender aos requisitos de .

Relatórios de bugs e pull requests são bem-vindos no GitHub em https://github.com/hakivvi/ermir. Este projeto é destinado a ser um espaço seguro e acolhedor para colaboração, e espera-se que os contribuidores sigam o código de conduta.
A gem está disponível como código aberto sob os termos da Licença MIT.
Todos que interagem nos codebases do projeto Ermir, rastreadores de issues, salas de bate-papo e listas de discussão devem seguir o código de conduta.
MarshalInputStream
public String[] list(): list() pergunta ao registro por todos os nomes dos objetos vinculados, enquanto o tipo String não pode ser substituído por um gadget malicioso, pois não é como qualquer objeto comum e não é lido usando readObject() mas sim readUTF(), no entanto, como list() retorna String[] que é um objeto real e é lido usando readObject(), Ermir envia o gadget em vez deste tipo String[].

public void bind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2): bind() vincula um objeto a um nome no registro, no caso de bind() o tipo de retorno é void e nada é retornado, no entanto, se o registro especificar no pacote de dados de retorno RMI que este retorno é um retorno excepcional, o cliente/servidor cliente chamará readObject() apesar do tipo de retorno ser void, é assim que o registro envia exceções para seu cliente (normalmente java.lang.ClassNotFoundException), mais uma vez Ermir entregará o gadget serializado em vez de um objeto Exception legítimo.

public void rebind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2): rebind() substitui a vinculação do nome passado pela referência remota fornecida, também retorna void, Ermir retorna uma exceção assim como bind().
public void unbind(java.lang.String $param_String_1): unbind() desvincula um objeto remoto pelo nome no registro RMI, este também retorna void.