Learn & practice AWS Hacking:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Learn & practice GCP Hacking: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=1099-pentesting-java-rmi) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
_L'Invocation de Méthodes à Distance Java_, ou _Java RMI_, est un mécanisme _RPC_ orienté objet qui permet à un objet situé dans une _machine virtuelle Java_ d'appeler des méthodes sur un objet situé dans une autre _machine virtuelle Java_. Cela permet aux développeurs d'écrire des applications distribuées en utilisant un paradigme orienté objet. Une brève introduction à _Java RMI_ d'un point de vue offensif peut être trouvée dans [cette conférence blackhat](https://youtu.be/t\_aw1mDNhzI?t=202).
Habituellement, seuls les composants par défaut _Java RMI_ (le _RMI Registry_ et le _Activation System_) sont liés à des ports communs. Les _objets distants_ qui implémentent l'application _RMI_ réelle sont généralement liés à des ports aléatoires comme indiqué dans la sortie ci-dessus.
_nmap_ a parfois des difficultés à identifier les services _RMI_ protégés par _SSL_. Si vous rencontrez un service ssl inconnu sur un port _RMI_ commun, vous devriez enquêter davantage.
Pour le dire simplement, _Java RMI_ permet à un développeur de rendre un _objet Java_ disponible sur le réseau. Cela ouvre un port _TCP_ où les clients peuvent se connecter et appeler des méthodes sur l'objet correspondant. Bien que cela semble simple, il y a plusieurs défis que _Java RMI_ doit résoudre :
1. Pour dispatcher un appel de méthode via _Java RMI_, les clients doivent connaître l'adresse IP, le port d'écoute, la classe ou l'interface implémentée et l'`ObjID` de l'objet ciblé (l'`ObjID` est un identifiant unique et aléatoire qui est créé lorsque l'objet est rendu disponible sur le réseau. Il est requis car _Java RMI_ permet à plusieurs objets d'écouter sur le même port _TCP_).
2. Les clients distants peuvent allouer des ressources sur le serveur en invoquant des méthodes sur l'objet exposé. La _machine virtuelle Java_ doit suivre quelles ressources sont encore utilisées et lesquelles peuvent être collectées par le ramasse-miettes.
Le premier défi est résolu par le _RMI registry_, qui est essentiellement un service de nommage pour _Java RMI_. Le _RMI registry_ lui-même est également un _service RMI_, mais l'interface implémentée et l'`ObjID` sont fixes et connus de tous les clients _RMI_. Cela permet aux clients _RMI_ de consommer le _RMI registry_ simplement en connaissant le port _TCP_ correspondant.
Lorsque les développeurs souhaitent rendre leurs _objets Java_ disponibles sur le réseau, ils les lient généralement à un _RMI registry_. Le _registry_ stocke toutes les informations nécessaires pour se connecter à l'objet (adresse IP, port d'écoute, classe ou interface implémentée et valeur de l'`ObjID`) et les rend disponibles sous un nom lisible par l'homme (le _nom lié_). Les clients qui souhaitent consommer le _service RMI_ demandent au _RMI registry_ le _nom lié_ correspondant et le registry renvoie toutes les informations nécessaires pour se connecter. Ainsi, la situation est essentiellement la même que celle d'un service _DNS_ ordinaire. La liste suivante montre un petit exemple :
Le deuxième des défis mentionnés ci-dessus est résolu par le _Distributed Garbage Collector_ (_DGC_). C'est un autre _RMI service_ avec une valeur `ObjID` bien connue et il est disponible sur pratiquement chaque _RMI endpoint_. Lorsqu'un _RMI client_ commence à utiliser un _RMI service_, il envoie une information au _DGC_ que l'objet _remote_ correspondant est en cours d'utilisation. Le _DGC_ peut alors suivre le nombre de références et est capable de nettoyer les objets inutilisés.
Les composants par défaut de _Java RMI_ sont connus pour être des vecteurs d'attaque depuis un certain temps et plusieurs vulnérabilités existent dans les versions obsolètes de _Java_. Du point de vue d'un attaquant, ces composants par défaut sont intéressants, car ils implémentent des classes / interfaces connues et il est facilement possible d'interagir avec eux. Cette situation est différente pour les _RMI services_ personnalisés. Pour appeler une méthode sur un objet _remote_, vous devez connaître la signature de méthode correspondante à l'avance. Sans connaître une signature de méthode existante, il n'y a aucun moyen de communiquer avec un _RMI service_.
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) est un scanner de vulnérabilités _Java RMI_ capable d'identifier automatiquement les vulnérabilités _RMI_ courantes. Chaque fois que vous identifiez un _RMI_ endpoint, vous devriez essayer :
L'output de l'action d'énumération est expliqué plus en détail dans les [pages de documentation](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/actions.md#enum-action) du projet. En fonction du résultat, vous devriez essayer de vérifier les vulnérabilités identifiées.
Les valeurs `ObjID` affichées par _remote-method-guesser_ peuvent être utilisées pour déterminer le temps de disponibilité du service. Cela peut permettre d'identifier d'autres vulnérabilités :
Même lorsque aucune vulnérabilité n'a été identifiée lors de l'énumération, les services _RMI_ disponibles pourraient toujours exposer des fonctions dangereuses. De plus, bien que la communication _RMI_ avec les composants par défaut _RMI_ soit protégée par des filtres de désérialisation, lorsqu'il s'agit de services _RMI_ personnalisés, de tels filtres ne sont généralement pas en place. Connaître les signatures de méthode valides sur les services _RMI_ est donc précieux.
Malheureusement, _Java RMI_ ne prend pas en charge l'énumération des méthodes sur les _objets distants_. Cela dit, il est possible de bruteforcer les signatures de méthode avec des outils comme [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) ou [rmiscout](https://github.com/BishopFox/rmiscout) :
En plus de deviner, vous devriez également chercher dans les moteurs de recherche ou _GitHub_ l'interface ou même l'implémentation d'un service _RMI_ rencontré. Le _bound name_ et le nom de la classe ou de l'interface implémentée peuvent être utiles ici.
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) marque les classes ou interfaces comme `known` si elles sont répertoriées dans la base de données interne de l'outil des _RMI services_ connus. Dans ces cas, vous pouvez utiliser l'action `known` pour obtenir plus d'informations sur le service _RMI_ correspondant :
Utilisez [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=1099-pentesting-java-rmi) pour créer et **automatiser des workflows** facilement grâce aux **outils communautaires les plus avancés** au monde.\
Apprenez et pratiquez le hacking AWS :<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Apprenez et pratiquez le hacking GCP : <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop) !
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez-nous sur****Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Partagez des astuces de hacking en soumettant des PR au** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts github.