
Herramienta de enumeración y ataque de Java RMI.
BaRMIe es una herramienta para enumerar y atacar servicios Java RMI (Remote Method Invocation).
Los servicios RMI a menudo exponen funcionalidades peligrosas sin controles de seguridad adecuados; sin embargo, los servicios RMI tienden a pasar desapercibidos durante las evaluaciones de seguridad debido a la falta de herramientas de prueba efectivas. En 2008, Adam Boulton habló en AppSec USA (YouTube) y lanzó algunas herramientas de ataque RMI que desaparecieron poco después; sin embargo, incluso con esas herramientas, un ataque exitoso de conocimiento cero depende de un ataque de fuerza bruta significativo (~64 bits/9 quintillones de posibilidades) realizado a través de la red.
El objetivo de BaRMIe es permitir a los profesionales de seguridad identificar, atacar y asegurar servicios RMI inseguros. Usando interfaces RMI parciales de software existente, BaRMIe puede interactuar directamente con esos servicios sin tener que realizar primero un ataque de fuerza bruta de 64 bits a través de la red.
Descargue la última versión compilada y lista para ejecutar aquí: https://github.com/NickstaDB/BaRMIe/releases/latest
BaRMIe fue escrito para ayudar a profesionales de seguridad a identificar servicios RMI inseguros en sistemas para los cuales el usuario tiene permiso previo para atacar. El acceso no autorizado a sistemas informáticos es ilegal y BaRMIe debe usarse de acuerdo con todas las leyes aplicables. No hacerlo podría llevar a que sea procesado. Los desarrolladores de BaRMIe no asumen ninguna responsabilidad y no son responsables de ningún mal uso o daño causado por este programa.
El uso de BaRMIe es sencillo. Ejecute BaRMIe sin parámetros para obtener información de uso.
$ java -jar BaRMIe.jar
▄▄▄▄ ▄▄▄ ██▀███ ███▄ ▄███▓ ██▓▓█████
▓█████▄ ▒████▄ ▓██ ▒ ██▒▓██▒▀█▀ ██▒▓██▒▓█ ▀
▒██▒ ▄██▒██ ▀█▄ ▓██ ░▄█ ▒▓██ ▓██░▒██▒▒███
▒██░█▀ ░██▄▄▄▄██ ▒██▀▀█▄ ▒██ ▒██ ░██░▒▓█ ▄
░▓█ ▀█▓ ▓█ ▓██▒░██▓ ▒██▒▒██▒ ░██▒░██░░▒████▒
░▒▓███▀▒ ▒▒ ▓▒█░░ ▒▓ ░▒▓░░ ▒░ ░ ░░▓ ░░ ▒░ ░
▒░▒ ░ ▒ ▒▒ ░ ░▒ ░ ▒░░ ░ ░ ▒ ░ ░ ░ ░
░ ░ ░ ▒ ░░ ░ ░ ░ ▒ ░ ░
░ ░ ░ ░ ░ ░ ░ ░
░ v1.0
Java RMI enumeration tool.
Written by Nicky Bloor (@NickstaDB)
Warning: BaRMIe was written to aid security professionals in identifying the
insecure use of RMI services on systems which the user has prior
permission to attack. BaRMIe must be used in accordance with all
relevant laws. Failure to do so could lead to your prosecution.
The developers assume no liability and are not responsible for any
misuse or damage caused by this program.
Usage:
BaRMIe -enum [options] [host] [port]
Enumerate RMI services on the given endpoint(s).
Note: if -enum is not specified, this is the default mode.
BaRMIe -attack [options] [host] [port]
Enumerate and attack the given target(s).
Options:
--threads The number of threads to use for enumeration (default 10).
--timeout The timeout for blocking socket operations (default 5,000ms).
--targets A file containing targets to scan.
The file should contain a single host or space-separated
host and port pair per line.
Alternatively, all nmap output formats are supported, BaRMIe will
parse nmap output for port 1099, 'rmiregistry', or 'Java RMI'
services to target.
Note: [host] [port] not supported when --targets is used.
Reliability:
A +/- system is used to indicate attack reliability as follows:
[+ ]: Indicates an application-specific attack
[- ]: Indicates a JRE attack
[ + ]: Attack insecure methods (such as 'writeFile' without auth)
[ - ]: Attack Java deserialization (i.e. Object parameters)
[ +]: Does not require non-default dependencies
[ -]: Non-default dependencies are required
El modo de enumeración (-enum) extrae detalles de los objetos que están expuestos a través de un servicio de registro RMI y enumera cualquier ataque conocido que afecte al punto final.
El modo de ataque (-attack) primero enumera los objetivos dados, luego proporciona un sistema de menú para lanzar ataques conocidos contra servicios RMI.
Se puede especificar un único objetivo en la línea de comandos. Alternativamente, BaRMIe puede extraer objetivos de un archivo de texto simple o de la salida de nmap.
¡Genial! Esta es su oportunidad para ayudar a mejorar BaRMIe. BaRMIe depende de algún conocimiento de las clases expuestas a través de RMI, por lo que las contribuciones ayudarán enormemente a mejorar BaRMIe y la seguridad de los servicios RMI.
Si tiene acceso a archivos JAR o código fuente de la aplicación objetivo, entonces producir un ataque es tan simple como compilar código contra los archivos JAR relevantes. Recupere el objeto remoto relevante usando las clases LocateRegistry y Registry y llame a los métodos deseados. Alternativamente, busque métodos remotos que acepten objetos arbitrarios o parámetros no primitivos, ya que estos pueden usarse para entregar cargas útiles de deserialización. Se publicará más documentación sobre cómo atacar RMI y producir ataques para BaRMIe en un futuro cercano.
Alternativamente, póngase en contacto y proporcione tantos detalles como sea posible, incluida la salida de BaRMIe -enum e idealmente los archivos JAR relevantes.
BaRMIe es capaz de realizar tres tipos de ataques contra servicios RMI. A continuación se presenta una breve descripción de cada uno. Se publicarán más detalles técnicos en un futuro cercano en https://nickbloor.co.uk/. Además de esto, presenté los resultados de mi investigación en 44CON 2017 y las diapositivas se pueden encontrar aquí: BaRMIe - Poking Java's Back Door.
El primer método y el más sencillo para atacar servicios RMI inseguros es simplemente llamar a métodos remotos inseguros. A menudo, la funcionalidad peligrosa se expone a través de RMI, que puede activarse simplemente recuperando la referencia del objeto remoto y llamando al método peligroso. El siguiente código es un ejemplo de esto:
//Get a reference to the remote RMI registry service
Registry reg = LocateRegistry.getRegistry(targetHost, targetPort);
//Get a reference to the target RMI object
Foo bar = (Foo)reg.lookup(objectName);
//Call the remote executeCommand() method
bar.executeCommand(cmd);
Algunos servicios RMI no exponen funcionalidades peligrosas, o implementan controles de seguridad como autenticación y gestión de sesiones. Si el servicio RMI expone un método que acepta un Object arbitrario como parámetro, entonces el método puede usarse como punto de entrada para ataques de deserialización. Algunos ejemplos de tales métodos se pueden ver a continuación:
public void setOption(String name, Object value);
public void addAll(List values);
Debido al uso de serialización y al manejo inseguro de parámetros de método en el servidor, es posible usar cualquier método con tipos de parámetros no primitivos como punto de entrada para ataques de deserialización. BaRMIe logra esto utilizando proxies TCP para modificar los parámetros del método a nivel de red, esencialmente desencadenando invocaciones de métodos ilegales. Algunos ejemplos de métodos vulnerables se pueden ver a continuación:
public void setName(String name);
public Long add(Integer i1, Integer i2);
public void sum(int[] values);
Los parámetros de cada uno de estos métodos pueden reemplazarse con una carga útil de deserialización mientras la invocación del método pasa a través de un proxy. Este ataque es posible porque Java no intenta verificar que los parámetros del método remoto recibidos a través de la red sean compatibles con los tipos de parámetros reales antes de deserializarlos.