* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
Utiliza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** con las herramientas comunitarias más avanzadas del mundo.\
_La Invocación Remota de Métodos de Java_, o _Java RMI_, es un mecanismo de _RPC_ orientado a objetos que permite que un objeto ubicado en una _máquina virtual de Java_ llame a métodos en un objeto ubicado en otra _máquina virtual de 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).
Por lo general, solo los componentes predeterminados de _Java RMI_ (el _Registro RMI_ y el _Sistema de Activación_) están vinculados a puertos comunes. Los objetos remotos que implementan la aplicación _RMI_ real suelen estar vinculados a puertos aleatorios, como se muestra en la salida anterior.
A veces, _nmap_ tiene problemas para identificar servicios _RMI_ protegidos por _SSL_. Si encuentras un servicio _ssl_ desconocido en un puerto _RMI_ común, debes investigar más a fondo.
En términos sencillos, _Java RMI_ permite que un desarrollador ponga un objeto _Java_ 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 de 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 pone disponible en la red. Se requiere 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 máquina virtual de Java necesita rastrear qué recursos siguen en uso y cuáles pueden ser recolectados por el recolector de basura.
El primer desafío se resuelve mediante el _registro RMI_, que es básicamente un servicio de nombres para _Java RMI_. El _registro RMI_ en sí mismo también es un servicio _RMI_, pero la interfaz implementada y el `ObjID` son fijos y conocidos por todos los clientes _RMI_. Esto permite que los clientes _RMI_ consuman el registro _RMI_ solo conociendo el puerto _TCP_ correspondiente.
Cuando los desarrolladores quieren hacer que sus objetos _Java_ estén disponibles en la red, generalmente los vinculan a un registro _RMI_. El registro almacena toda la información necesaria para conectarse al objeto (dirección IP, puerto de escucha, clase o interfaz implementada y el valor `ObjID`) y lo pone disponible bajo un nombre legible para los humanos (el "nombre vinculado"). Los clientes que desean consumir el servicio _RMI_ solicitan al registro _RMI_ el nombre vinculado correspondiente y el registro devuelve toda la información necesaria para conectarse. Por lo tanto, la situación es básicamente la misma que con un servicio _DNS_ ordinario. El siguiente ejemplo muestra un pequeño ejemplo:
El segundo de los desafíos mencionados se resuelve mediante el _Distributed Garbage Collector_ (_DGC_). Este es otro servicio _RMI_ con un valor de `ObjID` conocido y está disponible en prácticamente cada punto final de _RMI_. Cuando un cliente _RMI_ comienza a usar un servicio _RMI_, envía una información al _DGC_ de que el objeto remoto correspondiente está en uso. El _DGC_ puede entonces realizar un seguimiento del recuento de referencias y es capaz de limpiar los 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 desactualizadas de _Java_. Desde la perspectiva de un atacante, estos componentes predeterminados son interesantes porque implementan clases/interfaces conocidas y es fácil interactuar con ellos. Esta situación es diferente para los servicios _RMI_ personalizados. Para llamar a un método en un objeto remoto, es necesario conocer de antemano la firma del método correspondiente. Sin conocer una firma de método existente, no hay forma de comunicarse con un servicio _RMI_.
[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 punto final de _RMI_, deberías probarlo:
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, debes intentar verificar las vulnerabilidades identificadas.
Los valores `ObjID` mostrados por _remote-method-guesser_ se pueden utilizar 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 aún podrían exponer funciones peligrosas. Además, a pesar de que la comunicación _RMI_ a componentes predeterminados de _RMI_ está protegida por filtros de deserialización, cuando se trata de servicios _RMI_ personalizados, generalmente no se aplican dichos filtros. Conocer las firmas de métodos válidos en los servicios _RMI_ es, por lo tanto, valioso.
Desafortunadamente, _Java RMI_ no admite la enumeración de métodos en _objetos remotos_. Dicho esto, es posible forzar 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):
Además de adivinar, también debes buscar en motores de búsqueda o en _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 las 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 servicio _RMI_ correspondiente:
Utiliza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y automatizar fácilmente flujos de trabajo impulsados por las herramientas comunitarias más avanzadas del mundo.\
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).