
Registro RMI Rogue che sfrutta la deserializzazione Java non sicura tramite i metodi list/lookup/bind. Genera e fornisce gadget Ysoserial per attivare l'esecuzione di codice remoto su client vulnerabili.
Ermir è un Evil/Rogue RMI Registry, sfrutta la deserializzazione non sicura su qualsiasi codice Java che chiami metodi RMI standard su di esso (list()/lookup()/bind()/rebind()/unbind()).
Installa Ermir da rubygems.org:
$ gem install ermir
oppure clona il repository e costruisci la gemma:
$ git clone https://github.com/hakivvi/ermir.git
$ rake install
Ermir è una gemma CLI, include 2 file CLI: ermir e gadgetmarshal. ermir è la gemma vera e propria, mentre quest'ultimo è solo un'interfaccia grafica per il file GadgetMarshaller.java che riscrive i gadget di Ysoserial per soddisfare i requisiti di MarshalInputStream. L'output dovrebbe quindi essere reindirizzato in ermir o in un file; in caso di gadget personalizzati, usa MarshalOutputStream invece di ObjectOutputStream per scrivere l'oggetto serializzato nello stream di output.
ermir usage:
➜ ~ 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 usage:
➜ ~ gadgetmarshal
Usage: gadgetmarshal /path/to/ysoserial.jar Gadget1 cmd (optional)/path/to/output/file
java.rmi.registry.Registry offre 5 metodi: list(), lookup(), bind(), rebind(), unbind():
public Remote lookup(String name): lookup() cerca un oggetto associato nel registro tramite il suo nome, il registro restituisce un oggetto Remote che fa riferimento all'oggetto remoto cercato. L'oggetto restituito viene letto usando MarshalInputStream.readObject(), che è solo un ulteriore livello sopra ObjectInputStream. In pratica, si aspetta che dopo ogni descrittore di classe/proxy (TC_CLASSDESC/TC_PROXYCLASSDESC) venga fornito un URL che sarà usato per caricare questa classe o classe proxy. Questo è lo stesso bug selvaggio che è stato corretto in jdk7u21. (Ermir non specifica questo URL poiché solo le versioni Java più vecchie sono vulnerabili; invece scrive semplicemente null). Poiché i gadget di Ysoserial vengono serializzati usando ObjectOutputStream, Ermir utilizza gadgetmarshal - un wrapper intorno a GadgetMarshaller.java - per serializzare il gadget specificato in modo che soddisfi i requisiti di .

Le segnalazioni di bug e le richieste pull sono benvenute su GitHub all'indirizzo https://github.com/hakivvi/ermir. Questo progetto intende essere uno spazio sicuro e accogliente per la collaborazione, e ci si aspetta che i contributori seguano il codice di condotta.
La gemma è disponibile come open source secondo i termini della Licenza MIT.
Ci si aspetta che chiunque interagisca nei codebase, nei tracker delle issue, nelle chat room e nelle mailing list del progetto Ermir segua il codice di condotta.
MarshalInputStream
public String[] list(): list() chiede al registro tutti i nomi degli oggetti associati. Mentre il tipo String non può essere sostituito con un gadget dannoso perché non è come un normale oggetto e non viene letto usando readObject() ma piuttosto readUTF(), tuttavia, poiché list() restituisce String[], che è un vero oggetto e viene letto usando readObject(), Ermir invia il gadget al posto di questo tipo String[].

public void bind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2): bind() associa un oggetto a un nome nel registro. Nel caso di bind(), il tipo restituito è void e non viene restituito nulla. Tuttavia, se il registro specifica nel pacchetto di dati di ritorno RMI che questo ritorno è un ritorno eccezionale, il client/server chiamerà readObject() nonostante il tipo restituito sia void. Questo è il modo in cui il registro invia eccezioni al suo client (di solito java.lang.ClassNotFoundException). Ancora una volta, Ermir consegnerà il gadget serializzato invece di un legittimo oggetto Exception.

public void rebind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2): rebind() sostituisce l'associazione del nome passato con il riferimento remoto fornito; anche questo restituisce void. Ermir restituisce un'eccezione proprio come per bind().
public void unbind(java.lang.String $param_String_1): unbind() rimuove un oggetto remoto dal registro RMI in base al nome; anche questo restituisce void.