
Registre RMI Rogue exploitant la désérialisation Java non sécurisée via les méthodes list/lookup/bind. Génère et fournit des gadgets Ysoserial pour déclencher une exécution de code à distance sur des clients vulnérables.
Ermir est un registre RMI malveillant/espion, il exploite la désérialisation non sécurisée de tout code Java appelant les méthodes RMI standard sur celui-ci (list()/lookup()/bind()/rebind()/unbind()).
Installez Ermir depuis rubygems.org :
$ gem install ermir
ou clonez le dépôt et construisez la gemme :
$ git clone https://github.com/hakivvi/ermir.git
$ rake install
Ermir est une gemme CLI, elle est livrée avec 2 fichiers CLI ermir et gadgetmarshal ; ermir est la gemme elle-même et ce dernier est une simple interface vers le fichier GadgetMarshaller.java qui réécrit les gadgets de Ysoserial pour répondre aux exigences de MarshalInputStream. La sortie doit ensuite être redirigée vers ermir ou un fichier. En cas de gadgets personnalisés, utilisez MarshalOutputStream au lieu de ObjectOutputStream pour écrire votre objet sérialisé dans le flux de sortie.
ermir utilisation :
➜ ~ 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
gadgetmarshal utilisation :
➜ ~ gadgetmarshal
Usage: gadgetmarshal /path/to/ysoserial.jar Gadget1 cmd (optional)/path/to/output/file
java.rmi.registry.Registry propose 5 méthodes : list(), lookup(), bind(), rebind(), unbind():
public Remote lookup(String name) : lookup() recherche un objet lié dans le registre par son nom. Le registre renvoie un objet Remote qui référence l'objet distant recherché. L'objet retourné est lu en utilisant MarshalInputStream.readObject() qui est simplement une autre couche par-dessus ObjectInputStream. Fondamentalement, il s'attend à ce qu'après chaque descripteur de classe/proxy (TC_CLASSDESC/TC_PROXYCLASSDESC) une URL soit fournie pour charger cette classe ou classe proxy. C'est le même bogue sauvage qui a été corrigé dans jdk7u21. (Ermir ne spécifie pas cette URL car seules les anciennes versions de Java sont vulnérables, il écrit simplement null). Comme les gadgets de Ysoserial sont sérialisés en utilisant ObjectOutputStream, Ermir utilise gadgetmarshal - un wrapper autour de - pour sérialiser le gadget spécifié afin de répondre aux exigences de .

Les rapports de bogues et les demandes de fusion sont les bienvenus sur GitHub à l'adresse https://github.com/hakivvi/ermir. Ce projet vise à être un espace sûr et accueillant pour la collaboration, et les contributeurs sont censés adhérer au code de conduite.
La gemme est disponible en open source sous les termes de la licence MIT.
Toute personne interagissant dans les bases de code, les suiveurs de problèmes, les salons de discussion et les listes de diffusion du projet Ermir est censée suivre le code de conduite.
MarshalInputStream
public String[] list() : list() demande au registre tous les noms des objets liés. Alors que le type String ne peut pas être remplacé par un gadget malveillant car il n'est pas comme n'importe quel objet ordinaire et n'est pas lu avec readObject() mais plutôt avec readUTF(), cependant comme list() renvoie String[] qui est un objet réel et qu'il est lu via readObject(), Ermir envoie le gadget à la place de ce type String[].

public void bind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2) : bind() lie un objet à un nom dans le registre. Dans le cas de bind(), le type de retour est void et rien n'est retourné. Cependant, si le registre spécifie dans le paquet de données de retour RMI que ce retour est un retour exceptionnel, le client appellera readObject() malgré que le type de retour soit void. C'est ainsi que le registre envoie des exceptions à son client (généralement java.lang.ClassNotFoundException). Encore une fois, Ermir délivrera le gadget sérialisé à la place d'un objet Exception légitime.

public void rebind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2) : rebind() remplace la liaison du nom passé par la référence distante fournie, renvoie également void. Ermir renvoie une exception comme pour bind().
public void unbind(java.lang.String $param_String_1) : unbind() dissocie un objet distant par son nom dans le registre RMI, celui-ci renvoie aussi void.