<summary><strong>Lernen Sie AWS-Hacking von Null auf Held mit</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Wenn Sie Ihr **Unternehmen in HackTricks beworben sehen möchten** oder **HackTricks im PDF-Format herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repositories senden.
Verwenden Sie [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks), um einfach Workflows zu erstellen und zu **automatisieren**, die von den weltweit **fortschrittlichsten** Community-Tools unterstützt werden.\
_Java Remote Method Invocation_ oder _Java RMI_ ist ein objektorientierter _RPC-Mechanismus_, der es einem Objekt in einer _Java Virtual Machine_ ermöglicht, Methoden auf einem Objekt in einer anderen _Java Virtual Machine_ aufzurufen. Dies ermöglicht es Entwicklern, verteilte Anwendungen unter Verwendung eines objektorientierten Paradigmas zu schreiben. Eine kurze Einführung in _Java RMI_ aus offensiver Perspektive finden Sie in [diesem Blackhat-Vortrag](https://youtu.be/t\_aw1mDNhzI?t=202).
In der Regel sind nur die Standard-_Java RMI_-Komponenten (das _RMI-Register_ und das _Aktivierungssystem_) an gängige Ports gebunden. Die _Remote-Objekte_, die die tatsächliche _RMI_-Anwendung implementieren, sind normalerweise an zufällige Ports gebunden, wie im obigen Output gezeigt.
_nmap_ hat manchmal Schwierigkeiten, geschützte _SSL_-_RMI_-Dienste zu identifizieren. Wenn Sie auf einem gängigen _RMI_-Port einen unbekannten SSL-Dienst finden, sollten Sie weitere Untersuchungen durchführen.
Um es einfach auszudrücken, ermöglicht _Java RMI_ einem Entwickler, ein _Java-Objekt_ im Netzwerk verfügbar zu machen. Dies öffnet einen _TCP_-Port, über den Clients eine Verbindung herstellen und Methoden des entsprechenden Objekts aufrufen können. Obwohl dies einfach klingt, gibt es mehrere Herausforderungen, die _Java RMI_ lösen muss:
1. Um einen Methodenaufruf über _Java RMI_ zu verteilen, müssen Clients die IP-Adresse, den empfangenden Port, die implementierte Klasse oder das Interface und die `ObjID` des Zielobjekts kennen (die `ObjID` ist ein eindeutiger und zufälliger Bezeichner, der erstellt wird, wenn das Objekt im Netzwerk verfügbar gemacht wird. Sie ist erforderlich, da _Java RMI_ es ermöglicht, dass mehrere Objekte auf demselben _TCP_-Port lauschen).
2. Remote-Clients können Ressourcen auf dem Server zuweisen, indem sie Methoden auf das freigegebene Objekt aufrufen. Die _Java Virtual Machine_ muss verfolgen, welche dieser Ressourcen noch in Verwendung sind und welche davon vom Garbage Collector entfernt werden können.
Die erste Herausforderung wird durch das _RMI-Register_ gelöst, das im Grunde ein Namensdienst für _Java RMI_ ist. Das _RMI-Register_ selbst ist auch ein _RMI-Dienst_, aber das implementierte Interface und die `ObjID` sind festgelegt und allen _RMI_-Clients bekannt. Dies ermöglicht es _RMI_-Clients, das _RMI-Register_ zu nutzen, indem sie lediglich den entsprechenden _TCP_-Port kennen.
Wenn Entwickler ihre _Java-Objekte_ im Netzwerk verfügbar machen möchten, binden sie diese normalerweise an ein _RMI-Register_. Das _Register_ speichert alle Informationen, die zum Verbinden mit dem Objekt erforderlich sind (IP-Adresse, empfangender Port, implementierte Klasse oder Interface und den Wert der `ObjID`) und macht sie unter einem menschenlesbaren Namen (dem _gebundenen Namen_) verfügbar. Clients, die den _RMI-Dienst_ nutzen möchten, fragen das _RMI-Register_ nach dem entsprechenden _gebundenen Namen_, und das Register gibt alle erforderlichen Informationen zurück, um eine Verbindung herzustellen. Somit ist die Situation im Grunde genommen die gleiche wie bei einem gewöhnlichen _DNS_-Dienst. Das folgende Listing zeigt ein kleines Beispiel:
Die zweite der oben genannten Herausforderungen wird durch den _Distributed Garbage Collector_ (_DGC_) gelöst. Dies ist ein weiterer _RMI-Dienst_ mit einem bekannten `ObjID`-Wert und ist auf praktisch jedem _RMI-Endpunkt_ verfügbar. Wenn ein _RMI-Client_ beginnt, einen _RMI-Dienst_ zu nutzen, sendet er dem _DGC_ eine Information, dass das entsprechende _Remote-Objekt_ verwendet wird. Der _DGC_ kann dann die Referenzzählung verfolgen und nicht verwendete Objekte bereinigen.
Die Standardkomponenten von _Java RMI_ sind seit geraumer Zeit bekannte Angriffsvektoren und es existieren mehrere Schwachstellen in veralteten _Java_-Versionen. Aus der Sicht eines Angreifers sind diese Standardkomponenten interessant, weil sie bekannte Klassen/Interfaces implementiert haben und es leicht möglich ist, mit ihnen zu interagieren. Diese Situation ist bei benutzerdefinierten _RMI-Diensten_ anders. Um eine Methode auf einem _Remote-Objekt_ aufzurufen, muss man im Voraus die entsprechende Methodensignatur kennen. Ohne Kenntnis einer vorhandenen Methodensignatur gibt es keine Möglichkeit, mit einem _RMI-Dienst_ zu kommunizieren.
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) ist ein _Java RMI_-Schwachstellenscanner, der in der Lage ist, gängige _RMI-Schwachstellen_ automatisch zu identifizieren. Immer wenn Sie einen _RMI_-Endpunkt identifizieren, sollten Sie es ausprobieren:
Die Ausgabe der Aufzählungsaktion wird in den [Dokumentationsseiten](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/actions.md#enum-action) des Projekts genauer erläutert. Abhängig vom Ergebnis sollten Sie versuchen, identifizierte Schwachstellen zu überprüfen.
Die von _remote-method-guesser_ angezeigten `ObjID`-Werte können verwendet werden, um die Betriebszeit des Dienstes zu bestimmen. Dies kann helfen, andere Schwachstellen zu identifizieren:
Auch wenn bei der Enumeration keine Schwachstellen identifiziert wurden, könnten die verfügbaren _RMI_-Dienste dennoch gefährliche Funktionen offenlegen. Darüber hinaus sind bei der Kommunikation mit den Standardkomponenten von _RMI_ Deserialisierungsfilter vorhanden, aber bei der Kommunikation mit benutzerdefinierten _RMI_-Diensten sind solche Filter normalerweise nicht vorhanden. Das Wissen um gültige Methodensignaturen bei _RMI_-Diensten ist daher wertvoll.
Leider unterstützt _Java RMI_ nicht das Auflisten von Methoden auf _Remote-Objekten_. Dennoch ist es möglich, Methodensignaturen mit Tools wie [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) oder [rmiscout](https://github.com/BishopFox/rmiscout) zu bruteforcen:
Neben dem Raten sollten Sie auch in Suchmaschinen oder auf _GitHub_ nach der Schnittstelle oder sogar der Implementierung eines gefundenen _RMI_-Dienstes suchen. Der _gebundene Name_ und der Name der implementierten Klasse oder Schnittstelle können hier hilfreich sein.
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) markiert Klassen oder Schnittstellen als `bekannt`, wenn sie in der internen Datenbank bekannter _RMI-Dienste_ des Tools aufgeführt sind. In diesen Fällen können Sie die `bekannt`-Aktion verwenden, um weitere Informationen zum entsprechenden _RMI-Dienst_ zu erhalten:
Verwenden Sie [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks), um mühelos **Workflows zu erstellen und zu automatisieren**, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden.\
<summary><strong>Erlernen Sie AWS-Hacking von Null auf Held mit</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Wenn Sie Ihr **Unternehmen in HackTricks beworben sehen möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) Github-Repositorys einreichen.