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.\
_Java Remote Method Invocation_, o _Java RMI_, es un mecanismo _RPC_ orientado a objetos que permite a un objeto ubicado en una _máquina virtual Java_ llamar a métodos en un objeto ubicado en otra _máquina virtual Java_. Esto permite a los desarrolladores escribir aplicaciones distribuidas utilizando un paradigma orientado a objetos. Una breve introducción a _Java RMI_ desde una perspectiva ofensiva se puede encontrar en [esta charla de blackhat](https://youtu.be/t\_aw1mDNhzI?t=202).
Usualmente, solo los componentes predeterminados de _Java RMI_ (el _RMI Registry_ y el _Activation System_) están vinculados a puertos comunes. Los _remote objects_ que implementan la aplicación _RMI_ real suelen estar vinculados a puertos aleatorios, como se muestra en la salida anterior.
_nmap_ a veces tiene problemas para identificar servicios _RMI_ protegidos por _SSL_. Si te encuentras con un servicio ssl desconocido en un puerto _RMI_ común, deberías investigar más a fondo.
Para ponerlo en términos simples, _Java RMI_ permite a un desarrollador hacer un _Java object_ disponible en la red. Esto abre un puerto _TCP_ donde los clientes pueden conectarse y llamar a métodos en el objeto correspondiente. A pesar de que esto suena simple, hay varios desafíos que _Java RMI_ necesita resolver:
1. Para despachar una llamada a un método a través de _Java RMI_, los clientes necesitan conocer la dirección IP, el puerto de escucha, la clase o interfaz implementada y el `ObjID` del objeto objetivo (el `ObjID` es un identificador único y aleatorio que se crea cuando el objeto se hace disponible en la red. Es necesario porque _Java RMI_ permite que múltiples objetos escuchen en el mismo puerto _TCP_).
2. Los clientes remotos pueden asignar recursos en el servidor invocando métodos en el objeto expuesto. La _Java virtual machine_ necesita rastrear cuáles de estos recursos aún están en uso y cuáles pueden ser recolectados como basura.
El primer desafío se resuelve mediante el _RMI registry_, que es básicamente un servicio de nombres para _Java RMI_. El _RMI registry_ en sí también es un _RMI service_, pero la interfaz implementada y el `ObjID` son fijos y conocidos por todos los clientes _RMI_. Esto permite a los clientes _RMI_ consumir el _RMI registry_ solo conociendo el puerto _TCP_ correspondiente.
Cuando los desarrolladores quieren hacer sus _Java objects_ disponibles dentro de la red, generalmente los vinculan a un _RMI registry_. El _registry_ almacena toda la información requerida para conectarse al objeto (dirección IP, puerto de escucha, clase o interfaz implementada y el valor `ObjID`) y la hace disponible bajo un nombre legible por humanos (el _bound name_). Los clientes que desean consumir el _RMI service_ preguntan al _RMI registry_ por el _bound name_ correspondiente y el registro devuelve toda la información necesaria para conectarse. Así, la situación es básicamente la misma que con un servicio _DNS_ ordinario. La siguiente lista muestra un pequeño ejemplo:
El segundo de los desafíos mencionados anteriormente se resuelve mediante el _Distributed Garbage Collector_ (_DGC_). Este es otro _RMI service_ con un valor de `ObjID` bien conocido y está disponible en prácticamente cada _RMI endpoint_. Cuando un _RMI client_ comienza a usar un _RMI service_, envía una información al _DGC_ de que el _remote object_ correspondiente está en uso. El _DGC_ puede entonces rastrear el conteo de referencias y es capaz de limpiar objetos no utilizados.
Los componentes predeterminados de _Java RMI_ han sido vectores de ataque conocidos durante bastante tiempo y existen múltiples vulnerabilidades en versiones obsoletas de _Java_. Desde la perspectiva de un atacante, estos componentes predeterminados son interesantes, porque implementan clases / interfaces conocidas y es fácilmente posible interactuar con ellos. Esta situación es diferente para los _RMI services_ personalizados. Para llamar a un método en un _remote object_, necesitas conocer la firma del método correspondiente de antemano. Sin conocer una firma de método existente, no hay forma de comunicarse con un _RMI service_.
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) es un escáner de vulnerabilidades de _Java RMI_ que es capaz de identificar automáticamente vulnerabilidades comunes de _RMI_. Siempre que identifiques un _RMI endpoint_, deberías intentarlo:
La salida de la acción de enumeración se explica con más detalle en las [páginas de documentación](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/actions.md#enum-action) del proyecto. Dependiendo del resultado, deberías intentar verificar las vulnerabilidades identificadas.
Los valores `ObjID` mostrados por _remote-method-guesser_ pueden ser utilizados para determinar el tiempo de actividad del servicio. Esto puede permitir identificar otras vulnerabilidades:
Incluso cuando no se han identificado vulnerabilidades durante la enumeración, los servicios _RMI_ disponibles podrían exponer funciones peligrosas. Además, a pesar de que la comunicación _RMI_ con los componentes predeterminados de _RMI_ está protegida por filtros de deserialización, al hablar con servicios _RMI_ personalizados, dichos filtros generalmente no están en su lugar. Por lo tanto, conocer las firmas de métodos válidas en los servicios _RMI_ es valioso.
Desafortunadamente, _Java RMI_ no admite la enumeración de métodos en _objetos remotos_. Dicho esto, es posible realizar fuerza bruta en las firmas de métodos con herramientas como [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) o [rmiscout](https://github.com/BishopFox/rmiscout):
Aparte de adivinar, también deberías buscar en motores de búsqueda o _GitHub_ la interfaz o incluso la implementación de un servicio _RMI_ encontrado. El _nombre vinculado_ y el nombre de la clase o interfaz implementada pueden ser útiles aquí.
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) marca clases o interfaces como `conocidas` si están listadas en la base de datos interna de servicios _RMI_ conocidos de la herramienta. En estos casos, puedes usar la acción `conocida` para obtener más información sobre el correspondiente servicio _RMI_:
Utiliza [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=1099-pentesting-java-rmi) para construir y **automatizar flujos de trabajo** fácilmente, impulsados por las herramientas de comunidad **más avanzadas** del mundo.\
Aprende y practica Hacking en 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">\
Aprende y practica Hacking en 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)
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.