Testando a vulnerabilidade Spring4Shell
Hoje, resolvi trazer uma vulnerabilidade que foi muito comentada no início do ano de 2022.
Para isso, iremos desenvolver uma aplicação, como também, entenderemos mais a respeito da mesma :)
Spring Boot é um framework Java open source que tem como objetivo facilitar esse processo em aplicações Java. Assim, ele fornece a maioria dos componentes baseados no Spring de maneira pré-configurada, tornando possível termos uma aplicação rodando em produção rapidamente e com o esforço mínimo de configuração e implantação.
A vulnerabilidade consistiu em utilizar o pacote .war da aplicação buildada (com todos os arquivos e dependências para rodar a aplicação) no apache Tomcat em versões 10.0.19, 9.0.61, 8.5.77 ou mais novas.
O Tomcat é um servidor web Java, mais especificamente, um container de servlets. Dessa maneira, utilizado para rodar a aplicação. Portanto, além do Tomcat vulnerável, era necessário utilizar um requisições com parâmetros (como o @ModelAttribute) e buildar utilizando o .war e não o .jar
Com esse conjunto de fatores era possível executar um código remotamente e assim, explorar o servidor onde a aplicação estava sendo hospedada! Dessa maneira, essa vulnerabilidade passou a ficar conhecida como Spring4Shell.
Ela se torna extremamente perigosa por ser facilmente explorada e executada.
Portanto, rapidamente as pessoas tiveram que fazer o downgrade da aplicação enquanto o problema estava sendo resolvido.
Aqui, faremos uma poc que utilizei como base essa aplicação:
Portanto, fiz minhas alterações onde vocês podem acompanhar aqui no meu Github e falarei dos pontos principais da PoC
Aqui na parte do controle da aplicação, quando pensamos na arquitetura MVC (Model — View- Controller). O Controller serve para intermediar as requisições fornecidas pela resposta do Model e que são vistas na View.
Podemos ver aqui no código, justamente a requisição /post , utilizando o @ModelAttribute , que é a forma utilizada no Spring Boot.
Além disso, adicionamos a aplicação vulnerável no container para rodarmos facilmente a aplicação com o Tomcat.
Após criarmos nosso formulário que é usado pelo método POST, precisamos fazer o build dessa aplicação para ser adicionado ao Tomcat, conforme imagem abaixo.
Para criarmos o build, utilizamos o seguinte comando para fazer o build e adicionamos essas informações abaixo no arquivo pom.xml:
O arquivo pom.xml é considerado o coração de um projeto Maven. Nós descrevemos as dependências de nosso projeto e a maneira como este deve ser compilado.
mvn clean package
Ao fazermos o build da nossa imagem, podemos rodá-la em nossa máquina
docker run -it --rm -p 8888:8080 vulnerable-tomcat
Podemos ver a aplicação rodando na seguinte url: http://127.0.0.1:8888/spring-form/script
E para testar a vulnerabilidade, é bem simples. Basta digitar esse comando que esta relacionado com o nome do formulário que criamos.
http://127.0.0.1:8888/tomcatwar.jsp?pwd=j&cmd=pwd
Onde passamos comando linux como parâmetro, visto que nossa aplicação está rodando em um container baseado em Linux :)
Como resposta, podemos ver o caminho do diretório e outras informações, comprovando que é uma aplicação que roda Java.
Aqui, por exemplo, vemos o usuário que a aplicação roda que é o usuário root!
http://127.0.0.1:8888/tomcatwar.jsp?pwd=j&cmd=whoami
Espero que tenham gostado 💜