l4rm4nd/Keycloak-Enum

GitHub: l4rm4nd/Keycloak-Enum

一个轻量级 Python 脚本,通过指纹识别 Keycloak 公开静态资源的 SHA-256 哈希来精确枚举目标实例的版本号。

Stars: 1 | Forks: 0

Keycloak-Enum

Identify the exact Keycloak version of a live instance by fingerprinting its publicly-served static assets





Buy Me A Coffee

## 💬 描述 **无需安装。** 单个 Python 3.9+ 脚本,无第三方依赖。 Keycloak 22+ 将其管理和账户控制台作为预构建的 Vite 包发布,具有稳定的 SHA-256 和内容哈希文件名。每个版本都会生成一组唯一的资源哈希。该脚本: 1. 探测目标上的任何 Keycloak HTML 页面(管理控制台、账户控制台、登录页面) 2. 从页面中提取 Vite 资源哈希 3. 并行(20 个 worker)获取 Vite manifest 以及所有 200 多个 chunk JS/CSS 文件 4. 通过资源哈希获取 vendor JS 文件(React、rfc4648、web-crypto-shim)——在所有版本上均可公开访问 5. 使用登录资源哈希直接探测账户和管理的 Vite manifest——即使控制台重定向到登录页面,也能解决补丁级别的歧义 6. 将所有观察到的 SHA-256 哈希与 `fingerprints.json` 进行交集比对,并返回匹配的版本 不使用 80/443 以外的端口。不需要凭据。不访问需要登录的页面。 ## ✨ 要求 - **Python 3.9+** —— 仅需标准库,不需要 `pip install` - **Docker** —— 仅在执行 `collect` 时需要;指纹识别时不需要 ## 🎓 用法 ### 🐳 示例 1 - Docker 运行 ``` docker run --rm -t ghcr.io/l4rm4nd/keycloak-enum:latest fingerprint https://keycloak.example.com ``` ### 🐍 示例 2 - 原生 Python ``` git clone https://github.com/l4rm4nd/Keycloak-Enum cd Keycloak-Enum python3 keycloak-fingerprint.py fingerprint https://keycloak.example.com # 自签名 / 内部证书 python3 keycloak-fingerprint.py fingerprint https://keycloak.internal --no-verify # Debug 输出(显示每个探测的 URL 和 hash) python3 keycloak-fingerprint.py fingerprint https://keycloak.example.com -v # 以 JSON 输出完整结果 python3 keycloak-fingerprint.py fingerprint https://keycloak.example.com --json ``` **示例输出:** ``` Target : https://keycloak.example.com Console : https://keycloak.example.com/realms/master/account/ Keycloak : Detected JavaScript : main-Ct94EjXz.js CSS : main-XXXXXXXX.css Match : exact_unique Confidence : high Version : 26.2.5 208/211 hashes uniquely identify Keycloak 26.2.5. ``` **匹配值:** | 匹配 | 含义 | |-------|---------| | `exact_unique` | 单个版本匹配了所有观察到的哈希 | | `exact_ambiguous` | 多个版本共享相同的资源集(相同的补丁版本) | | `partial` | 部分哈希匹配,但没有单个版本能涵盖所有哈希 | | `unknown` | 数据库中未找到哈希——该版本可能尚未被收集 | ### ➕ 为新版本添加指纹(需要 Docker) ``` # 单个 version python3 keycloak-fingerprint.py collect 26.7.1 # 内置列表中的所有 version python3 keycloak-fingerprint.py collect --all # 自定义 image reference python3 keycloak-fingerprint.py collect 26.7.1 --image myregistry/keycloak:26.7.1 # 即使已存在也重新收集 python3 keycloak-fingerprint.py collect 26.7.1 --force ``` 收集过程会拉取 Docker 镜像,创建一个停止的容器,复制 Keycloak 的 JAR 文件并在内存中对其资源进行哈希处理,然后立即删除该容器。任何容器都不会被启动。 ## 💎 覆盖版本 `fingerprints.json` 目前包含 Keycloak 24–26 的 **59 个版本**: ``` 24.0.x → 24.0.0 – 24.0.5 (6 releases) 25.0.x → 25.0.0 – 25.0.6 (6 releases; 25.0.3 skipped by upstream) 26.0.x → 26.0.0 – 26.0.8 (8 releases; 26.0.3 skipped by upstream) 26.1.x → 26.1.0 – 26.1.5 (6 releases) 26.2.x → 26.2.0 – 26.2.5 (6 releases) 26.3.x → 26.3.0 – 26.3.5 (6 releases) 26.4.x → 26.4.0 – 26.4.7 (7 releases; 26.4.3 skipped by upstream) 26.5.x → 26.5.0 – 26.5.7 (8 releases) 26.6.x → 26.6.0 – 26.6.4 (5 releases) 26.7.x → 26.7.0 (1 release) ``` 要添加新版本,请运行 `collect `——它会将结果追加到 `fingerprints.json` 中。 ## 💥 限制 - **自定义主题** —— 如果目标使用自定义的管理/账户主题,资源哈希将与上游镜像不同,并且版本将无法匹配。 - **极旧版本** —— Keycloak < 22 不提供基于 Vite 的管理 UI。该脚本可能仍会检测到登录页面并匹配 25 及以上版本的登录主题资源。 - **缺失版本** —— 如果某个版本不在 `fingerprints.json` 中,结果将为 `unknown`。运行 `collect ` 来添加它。
标签:C2日志可视化, Keycloak, Python, 实时处理, 指纹识别, 无后门, 版本探测, 请求拦截, 逆向工具