
Углубленный технический анализ CVE-2022-22965 (Spring4Shell) с настройкой среды, пошаговым прохождением отладки и разбором цепочки эксплойта для образовательной лабораторной практики.
Spring4Shell — это название CVE, существующего в Spring Core фреймворка Spring Framework.
С оценкой CVSS 3.x 9.8 уязвимость классифицируется как имеющая наивысший уровень риска (critical). Эта уязвимость позволяет злоумышленнику удаленно выполнять эксплойт-код и контролировать уязвимый сервер.
Учитывая распространенность Spring Core в интернете и серьезность влияния Spring4Shell, эксперты оценивают эту уязвимость как не менее значительную, чем Log4shell.
Spring4Shell затрагивает не все веб-приложения, использующие Spring Framework в интернете, а требует, чтобы веб-приложение обладало следующими характеристиками:
Моя среда настройки имеет следующие параметры:
Установка Apache Tomcat
Как указано выше, я использую Kali 2021.4a и Apache Tomcat 9.0.45. Если вы не знаете, как установить Apache Tomcat, и хотите установить его на Kali Linux, можете обратиться к этой ссылке.
Примечание: Замените ссылку https://mirror.kiu.ac.ug/apache/tomcat/tomcat-9/v9.0.45/bin/apache-tomcat-9.0.45.tar.gz на https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.45/bin/apache-tomcat-9.0.45.tar.gz
Выбор IDE
Нам нужна IDE для написания кода проекта, упаковки проекта в файл .war и, что очень важно, для отладки. Я использую Intellij, вы можете использовать Eclipse или Netbeans и т.д. Главное, чтобы IDE поддерживала Java.
Создание простого проекта, содержащего уязвимость
Мой проект очень простой, состоит из:
модели HelloWorld.java

контроллера HelloWorldController.java

представления hello.jsp

Сборка файла .war
Чтобы упаковать проект, выполните: Build -> Build Artifacts -> helloworld:war -> Build.
Дождитесь успешного завершения сборки. После этого в проекте появится папка out. Зайдите в ./out/artifacts/your_war_name/ и увидите файл your_war_name.war. Этот файл .war и есть скомпилированный и упакованный веб-проект, который можно развернуть на Java Servlet, таких как Apache Tomcat.
Если Build Artifacts неактивен (не удается выполнить Build Artifacts), значит, для этого проекта еще не настроены Build Artifacts. Зайдите: File -> Project Structure -> Artifacts -> Удалите все существующие artifacts -> Add (знак +) -> Web Application: Exploded -> From Modules... -> OK (завершение создания Exploded) -> Add (знак +) -> Web Application: Archive -> For 'helloworld:war exploded' -> OK. Затем повторите Build Artifacts.
Развертывание и настройка отладки
Развертывание
Чтобы развернуть файл .war на Apache Tomcat, просто скопируйте его в папку /webapps внутри каталога Apache Tomcat (например, я копирую файл helloworld.war (переименовал для удобства) в /opt/tomcat/apache-tomcat-9.0.45/webapps/). Затем запустите сервер Tomcat одним из двух способов (для Linux):
После развертывания перейдите по адресу http://localhost:8080/helloworld
Настройка отладки
Чтобы настроить удаленную отладку Tomcat, выполните следующие действия:
На сервере:
Откройте файл catalina.sh и замените значение localhost на IP-адрес виртуальной машины в параметре JPDA_ADDRESS

Перезапустите сервер Tomcat командой: /opt/tomcat/apache-tomcat-9.0.45/bin/catalina.sh jpda start. Теперь, помимо порта 8080 для HTTP-сервера, Tomcat откроет порт 8000 для подключения и отладки
Примечание: В данном разделе отладки я выполняю запуск Intellij на Windows 10, а Tomcat — на виртуальной машине Kali, поэтому необходимо изменить JDPA_ADDRESS. Если вы настраиваете и Intellij, и Tomcat на одной машине, изменять не нужно.
На стороне Intellij:
Перейдите в Run -> Edit Configurations... -> Add (знак +) -> Remote JVM Debug
Задайте имя -> измените Host и Port на IP и порт, которые вы указали в файле catalina.sh -> OK -> Shift + F9 (запуск отладки)

Сначала проанализирую проект, который использую для отладки. Как уже говорилось, этот проект состоит просто из:
Приведу пример:

Приложение извлекает информацию из параметров POST-запроса и создает объект helloWorld{"person":"Leo", "message":"Hi there"}. Этот объект helloWorld является входным параметром для метода helloPost. Приложение выполняет описанные выше действия, чтобы вернуть пользователю указанный ответ.