Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
ermir — Rogue RMI Registry, der unsichere Java-Deserialisierung über list/lookup/bind-Methoden ausnutzt. Erzeugt und liefert Ysoserial-Gadgets, um Remote-Code-Ausführung auf verwundbaren Clients auszulösen. | Kitploit
Tools/GitHubGitHub/hakivvi/ermir
Payload-GenerierungSchwachstellenanalyseExploitationPenetrationstests
GitHubhakivvi/ermir

ermir

Rogue RMI Registry, der unsichere Java-Deserialisierung über list/lookup/bind-Methoden ausnutzt. Erzeugt und liefert Ysoserial-Gadgets, um Remote-Code-Ausführung auf verwundbaren Clients auszulösen.

Repository anzeigen
504vor 3 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Ermir

Ermir ist eine bösartige/Rogue-RMI-Registry, die unsichere Deserialisierung auf jedem Java-Code ausnutzt, der standardmäßige RMI-Methoden darauf aufruft (list()/lookup()/bind()/rebind()/unbind()).

Anforderungen

  • Ruby v3 oder neuer.

Installation

Ermir von rubygems.org installieren:

root@kitploit:~
$ gem install ermir

oder klonen Sie das Repository und erstellen Sie das Gem:

root@kitploit:~
$ git clone https://github.com/hakivvi/ermir.git
$ rake install

Verwendung

Ermir ist ein CLI-Gem und wird mit zwei CLI-Dateien ermir und gadgetmarshal ausgeliefert. ermir ist das eigentliche Gem und letzteres ist nur eine hübsche Schnittstelle zu GadgetMarshaller.java, welche die Gadgets von Ysoserial umschreibt, um den Anforderungen von MarshalInputStream zu entsprechen. Die Ausgabe sollte dann in ermir oder eine Datei weitergeleitet werden. Im Falle von benutzerdefinierten Gadgets verwenden Sie MarshalOutputStream anstelle von ObjectOutputStream, um Ihr serialisiertes Objekt in den Ausgabestrom zu schreiben.

ermir Verwendung:

root@kitploit:~
➜  ~ 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 Verwendung:

root@kitploit:~
➜  ~ gadgetmarshal
Usage: gadgetmarshal /path/to/ysoserial.jar Gadget1 cmd (optional)/path/to/output/file

Wie funktioniert es?

java.rmi.registry.Registry bietet 5 Methoden: list(), lookup(), bind(), rebind(), unbind():

  • public Remote lookup(String name): lookup() sucht nach einem gebundenen Objekt im Registry anhand seines Namens. Die Registry gibt ein Remote-Objekt zurück, das das nachgeschlagene entfernte Objekt referenziert. Das zurückgegebene Objekt wird mit MarshalInputStream.readObject() gelesen, welches nur eine weitere Schicht über ObjectInputStream ist. Grundsätzlich erwartet es nach jedem Klassen-/Proxy-Deskriptor (TC_CLASSDESC/TC_PROXYCLASSDESC) eine URL, die verwendet wird, um diese Klasse oder Proxy-Klasse zu laden. Dies ist derselbe wilde Bug, der in jdk7u21 behoben wurde. (Ermir gibt diese URL nicht an, da nur alte Java-Versionen anfällig sind; stattdessen schreibt es einfach null). Da Ysoserial Gadgets mit ObjectOutputStream serialisiert werden, verwendet Ermir gadgetmarshal - einen Wrapper um - um das angegebene Gadget zu serialisieren, um den Anforderungen von zu entsprechen.

PoC

ermir

Mitwirken

Fehlerberichte und Pull-Requests sind auf GitHub unter https://github.com/hakivvi/ermir willkommen. Dieses Projekt soll ein sicherer, einladender Raum für Zusammenarbeit sein, und Mitwirkende werden gebeten, sich an den Verhaltenskodex zu halten.

Lizenz

Das Gem ist als Open Source unter den Bedingungen der MIT-Lizenz verfügbar.

Verhaltenskodex

Jeder, der mit den Codebasen, Issue-Trackern, Chatrooms und Mailinglisten des Ermir-Projekts interagiert, wird gebeten, den Verhaltenskodex zu befolgen.

Tool herunterladen
GadgetMarshaller.java
MarshalInputStream
image
  • public String[] list(): list() fragt die Registry nach den Namen aller gebundenen Objekte. Während der Typ String nicht durch ein bösartiges Gadget ersetzt werden kann, da er nicht wie ein normales Objekt ist und nicht mit readObject(), sondern mit readUTF() gelesen wird, gibt list() jedoch String[] zurück, welches ein tatsächliches Objekt ist und mit readObject() gelesen wird. Daher sendet Ermir das Gadget anstelle dieses String[]-Typs. image

  • public void bind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2): bind() bindet ein Objekt an einen Namen in der Registry. Im Fall von bind() ist der Rückgabetyp void und es wird nichts zurückgegeben. Wenn die Registry jedoch im RMI-Rückgabedatenpaket angibt, dass diese Rückgabe eine Ausnahme-Rückgabe ist, wird der Client/Server-Client readObject() aufrufen, obwohl der Rückgabetyp void ist. Auf diese Weise sendet die Registry Ausnahmen an ihren Client (normalerweise java.lang.ClassNotFoundException). Erneut wird Ermir das serialisierte Gadget anstelle eines legitimen Exception-Objekts liefern. image

  • public void rebind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2): rebind() ersetzt die Bindung des übergebenen Namens mit der bereitgestellten entfernten Referenz, gibt ebenfalls void zurück. Ermir gibt wie bei bind() eine Ausnahme zurück.

  • public void unbind(java.lang.String $param_String_1): unbind() löst eine Bindung eines entfernten Objekts anhand des Namens in der RMI-Registry, auch diese gibt void zurück.