l4rm4nd/Keycloak-Enum
GitHub: l4rm4nd/Keycloak-Enum
一个轻量级 Python 脚本,通过指纹识别 Keycloak 公开静态资源的 SHA-256 哈希来精确枚举目标实例的版本号。
Stars: 1 | Forks: 0
## 💬 描述
**无需安装。** 单个 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, 实时处理, 指纹识别, 无后门, 版本探测, 请求拦截, 逆向工具