<summary><strong>Aprende hacking en AWS de cero a héroe con</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**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** fácilmente con las herramientas comunitarias más avanzadas del mundo.\
_La Invocación de Método Remoto 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).
Normalmente, 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 tiene problemas para identificar servicios _RMI_ protegidos con _SSL_. Si encuentra un servicio _SSL_ desconocido en un puerto _RMI_ común, debe investigar más a fondo.
Para explicarlo de forma sencilla, _Java RMI_ permite a un desarrollador hacer que un _objeto Java_ esté disponible en la red. Esto abre un puerto _TCP_ donde los clientes pueden conectarse y llamar 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 está 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 _máquina virtual 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í también es un servicio _RMI_, pero la interfaz implementada y el `ObjID` son fijos y conocidos por todos los clientes de _RMI_. Esto permite a los clientes de _RMI_ consumir el _registro RMI_ solo conociendo el puerto _TCP_ correspondiente.
Cuando los desarrolladores quieren 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 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 listado muestra un pequeño ejemplo:
El segundo de los desafíos mencionados anteriormente se resuelve mediante el _Recolector de Basura Distribuido_ (_DGC_). Este es otro servicio _RMI_ con un valor de `ObjID` bien conocido y está disponible en prácticamente cada _punto final 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 hacer un seguimiento del recuento de referencias y 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 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 la firma del método correspondiente de antemano. 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 _Java RMI_ que es capaz de identificar automáticamente vulnerabilidades _RMI_ comunes. Siempre que identifiques un punto final _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 de `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 los componentes predeterminados de _RMI_ está protegida por filtros de deserialización, al hablar con servicios _RMI_ personalizados, generalmente no se implementan 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 deberías 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 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:
Utilice [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** fácilmente con las herramientas comunitarias **más avanzadas** del mundo.\
<summary><strong>Aprenda hacking en AWS de cero a héroe con</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
* Si desea ver su **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Obtenga el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Descubra [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Únase al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síganos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Comparta sus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).