<summary><strong>Aprende hacking en AWS de cero a héroe con</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
Usa [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) para construir y **automatizar flujos de trabajo** fácilmente, potenciados por las herramientas comunitarias **más avanzadas**.\
_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 de un objeto 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).
Por lo general, 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 encuentras un servicio ssl desconocido en un puerto común de _RMI_, deberías investigar más a fondo.
Para ponerlo en términos simples, _Java RMI_ permite a un desarrollador hacer que un _Java object_ esté 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 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 _máquina virtual de Java_ necesita rastrear cuáles de estos recursos todavía están en uso y cuáles pueden ser recolectados como basura.
El primer desafío se resuelve con el _RMI registry_, que básicamente es un servicio de nombres para _Java RMI_. El _RMI registry_ en sí también es un _servicio RMI_, 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_ con solo conocer el puerto _TCP_ correspondiente.
Cuando los desarrolladores quieren hacer que sus _Java objects_ estén 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 de `ObjID`) y la hace disponible bajo un nombre legible por humanos (el _bound name_). Los clientes que quieren consumir el _servicio RMI_ preguntan al _RMI registry_ por el _bound name_ correspondiente y el registro devuelve toda la información requerida para conectarse. Por lo tanto, 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 es resuelto por el _Distributed Garbage Collector_ (_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 utilizar un _servicio RMI_, envía una información al _DGC_ de que el _objeto remoto_ 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 antiguas de _Java_. Desde la perspectiva de un atacante, estos componentes predeterminados son interesantes, porque implementaron clases / interfaces conocidas y es fácilmente posible interactuar con ellos. Esta situación es diferente para los _servicios RMI_ personalizados. Para llamar a un método en un _objeto remoto_, 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 _servicio RMI_.
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) es un escáner de vulnerabilidades _Java RMI_ capaz de identificar automáticamente vulnerabilidades comunes de _RMI_. 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, deberías 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 de _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 presentes. Por lo tanto, conocer las firmas de métodos válidos en 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 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 _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 del herramienta de servicios _RMI conocidos_. En estos casos, puedes usar la acción `known` 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 flujos de trabajo** fácilmente con las herramientas comunitarias **más avanzadas** del mundo.\
<summary><strong>Aprende a hackear AWS de cero a héroe con</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).