Spring Boot
Actuator
Wordlist
Environment endpoint (/env)
L'endpoint env
fournit des informations sur l’environnement de l’application.
Eureka-Client Information disclosure
Prérequis:
Endpoint /refresh actif
Dependance
Eureka-Client
Configurer les propriétés de
eureka.client.serviceUrl.defaultZone
comme ceci:
Rafraichir pour effectuer le changements de configuration (POST /actuator/refresh)
Visioner les propriétés masquées via le header
Authorization
.
Eureka-Client XStream deserialization RCE
Prérequis:
Endpoint /refresh actif
Dependance
Eureka-Client
< 1.8.7
Mettre en place un serveur permettant d'établir une connexion XStream vers le serveur attaquant.
Configurer les propriétés de
eureka.client.serviceUrl.defaultZone
pour qu'il se connecte au flux.
Rafraichir pour effectuer le changements de configuration (POST /actuator/refresh)
Logback JNDI RCE
Prérequis: endpoint /restart actif
Hoster un fichier XML contenant le code suivant sur le serveur attaquant:
Il s'agit de la configuration que la fonction reloadByURL
va utiliser pour modifier celles de l'environnement en tant que configuration de logback.
Hoster un service LDAP sur le serveur attaquant contenant l'exploit.
Configurer les propriétés de
logging.config
pour pointer ver le code XML.
Relancer l'application pour effectuer le changements de configuration (POST /actuator/restart)
ressource: https://github.com/LandGrey/SpringBootVulExploit/blob/master/codebase/springboot-realm-jndi-rce.py
Groovy RCE
Prérequis: endpoint /restart actif
Hoster un fichier
.groovy
contenant le code suivant: (exp: payload.groovy)
Configurer les propriétés de
logging.config
ouspring.main.sources
pour pointer ver le code groovy.
Ou,
Relancer l'application pour effectuer le changements de configuration (POST /actuator/restart)
Tomcat SQLi
La fonction spring.datasource.tomcat.validationQuery
permet de spécifier toute requête SQL qui sera exécutée automatiquement sur la base de données courante. Il peut s’agir de n’importe quelle déclaration, y compris insérer, mettre à jour ou supprimer des éléments.
Tomcat JDBC connection string
La fonction spring.datasource.tomcat.url
permet de modifier la chaîne de connexion JDBC actuelle.
Datasource Data RCE
Prérequis:
Endpoint /restart actif
Dépendances
h2database
etspring-boot-starter-data-jpa
Hoster un fichier
.sql
contenant la requête suivante. (exp: payload.sql)
La méthode T5
dans la charge utile doit être renommée (en T6
) après l’exécution de la commande avant de pouvoir être recréée et utilisée. Sinon, la vulnérabilité ne se déclenchera pas lors du prochain redémarrage d’une application.
Configurer les propriétés de la fonction
spring.datasource.data
pour utiliser ce fichier.
Relancer l'application pour effectuer le changements de configuration (POST /actuator/restart)
JDBC Deserialization RCE
Prérequis:
Endpoint /restart actif
Dépendance
mysql-connector-java
Utiliser le point de terminaison /actuator/env pour récupérer les valeurs suivantes :
La version de
mysql-connector-java
(si la dépendance est active) qui doit être une version 5.x ou 8.xla présence de la fonction
spring.datasource.url
pour faciliter la création ultérieure de son URL JDBC.
Créer une charge utile avec ysoserial.
utiliser l'exploit suivant pour hoster le payload créé: https://github.com/LandGrey/SpringBootVulExploit/blob/master/codebase/springboot-jdbc-deserialization-rce.py
Configurer les propriétés de la fonction
spring.datasource.url
comme ceci:Pour
mysql-connector-java
versions 5.x
Pour
mysql-connector-java
versions 8.x
Relancer l'application pour effectuer le changements de configuration (POST /actuator/restart)
Trouver un moyen de faire exécuter une requête SQL à l'application pour trigger la RCE.
Bootstrap location information disclosure
Prérequis:
Endpoint /refresh actif
Dépendance
spring-cloud-starter
version 1.3.0.RELEASE
Configurer les propriétés de la fonction
spring.cloud.bootstrap.location
comme ceci:
Rafraichir pour effectuer le changements de configuration (POST /actuator/refresh)
SnakeYML deserialization RCE
La fonction spring.cloud.bootstrap.location
permet de charger une configuration externe au format YAML. Vous pouvez obtenir l’exécution du code avec les étapes suivantes:
Hoster un fichier
.yml
avec les configurations suivantes. (exp: config.yml)
Hoster un fichier
.jar
contenant l'exploit. (exp: payload.jar)
ressource: https://github.com/artsploit/yaml-payload
Configurer les propriétés de la fonction
spring.cloud.bootstrap.location
comme ceci:
Rafraichir pour effectuer le changements de configuration (POST /actuator/refresh)
Hikari test query RCE
Configurer les propriétés de la fonction
spring.datasource.hikari.connection-test-query
comme ceci:
La méthode T5
dans la charge utile doit être renommée (en T6
) après l’exécution de la commande avant de pouvoir être recréée et utilisée. Sinon, la vulnérabilité ne se déclenchera pas lors du prochain redémarrage d’une application.
Relancer l'application pour effectuer le changements de configuration (POST /actuator/restart)
Gateway endpoint (/gateway)
SSRF via ajout d'une route
Essayer d'accéder à l'ensemble des routes via une requête
GET
vers/actuator/gateway/route
Si il est possible de lister les routes alors on a les droits pour en ajouter, pour se faire on va envoyer une requête
POST
telle que:
Rafraichir l'endpoint pour enregistrer les changements.
RCE via injection SpEL
Essayer d'accéder à l'ensemble des routes via une requête
GET
vers/actuator/gateway/route
Si il est possible de lister les routes alors on a les droits pour en ajouter, pour se faire on va envoyer une de la même manière que précédemment mais en y ajoutant un argument comprenant une injection SpEL:
Rafraichir l'endpoint pour enregistrer les changements. (POST /actuator/gateway/refresh)
Accéder à la nouvelle route via une requête
GET
et le résultat de la commande devrait se retrouver dans le parametre filters de la réponse HTTP.
Sessions endpoint (/sessions)
Permet d'avoir des informations sur les sessions d'utilisateurs ou de supprimer des sessions.
ressource: https://docs.spring.io/spring-boot/docs/2.4.0/actuator-api/htmlsingle/#sessions
h2-console endpoint (/h2-console)
RCE via JNDI dans la console h2
Prérequis:
La dépendance
com.h2database.h2
spring.h2.console.enabled=true
dans les configurations de spring boot
Accéder à la console h2
/h2-console
. L'application redirige sur/h2-console/login.jsp? jsessionid=xxxxxx
.Télécharger le payload: https://github.com/LandGrey/SpringBootVulExploit/blob/master/codebase/JNDIObject.java
Compiler le payload
$ javac -source 1.5 -target 1.5 JNDIObject.java
Mettre en place un service LDAP (exemple avec marshalsec)
Injecter le JNDI comme ceci:
Heapdump endpoint (/heapdump)
Heapdump retourne un fichier de vidage de tas hprof qui peut contenir des données sensibles, telles que les propriétés env, des identifiants, des sessions...
Exploitation: https://www.exploit-db.com/docs/50459
Jolkia endpoint (/jolkia)
Extraction de propriétés env
via org.springframework.boot
via org.springframework.cloud.context.environment
SSRF via Logback (reloadByURL)
Lister les actions MBeans via une requête
GET
vers l'endpoint/jolkia/list
Rechercher dans la réponse si l'action
reloadByURL
est utilisée par la librairieLogback
.Si oui, on peut écraser la configuration pour rediriger les logs vers le serveur attaquant comme ceci:
OOB XXE
Logback utilise des configurations XML parsées par SAXParser avec des entités externes activées. On peut donc exploiter cette fonction pour déclencher une XXE hors bande en utilisant la SSRF vue précédemment.
Fichier de configuration envoyé au serveur victime:
Fichier DTD sur le serveur attaquant:
Envoie du fichier de configuration:
Logback JNDI RCE
Une RCE peut également être exploitée via l'utilisation de la SSRF.
Fichier de configuration envoyé au serveur victime:
Ou JNDIObject correspond au payload vue dans la partie suivante: RCE via JNDI dans la console h2
De la même manière que dans cette partie, on va mettre en place un service LDAP puis une fois cela fait on va envoyer le fichier de configuration au serveur victime.
Envoie du fichier de configuration:
RCE via Tomcat (createJNDIRealm)
Checker la présence des éléments suivants dans la réponse HTTP à la requête
GET
vers/jolkia/list
type=MBeanFactoryand
createJNDIRealm
Utiliser le payload JNDIObject vu dans la partie RCE via JNDI dans la console h2 (le compiler et lancer un service LDAP)
Utiliser le script suivant pour exploiter la RCE:
ressource: https://github.com/LandGrey/SpringBootVulExploit/blob/master/codebase/springboot-realm-jndi-rce.py
Logfile endpoint (/logfile)
L'endpoint logfile permet de récupérer le contenu du fichier de log de l'actuator via une simple requête GET
directement dans la réponse HTTP .
Cela nécessite que les propriétés logging.file.name
et logging.file.path
soient activées.
Logview endpoint (/manage/log/view)
Path traversal
Prérequis: spring-boot-actuator-logview
avant version 0.2.13
Dernière mise à jour