
CVE-2026-18963(Keycloak 자격 증명 재설정 상태 우회)에 대한 탐지 및 검증 도구입니다. 버전 핑거프린팅, realm/client/user 열거를 수행하고, 승인된 평가를 위해 action-token 사전 조건이 적용되는지 테스트합니다.
https://github.com/user-attachments/assets/005fab89-339a-4e4e-881c-da6a626f6c9e
python3 kc-resetforge.py -h
usage: kc-resetforge.py [-h] [--target TARGET] [--targets-file TARGETS_FILE] [--port PORT] [--realm REALM]
[--client-id CLIENT_ID] [--username USERNAME] [--new-password NEW_PASSWORD] [--skip-enum]
[--enum-only] [--kc-version] [--kc-reset-link] [--corpus-dir CORPUS_DIR] [--label LABEL]
[--enum-realms] [--no-enum-realms] [--enum-clients] [--no-enum-clients] [--enum-users]
[--no-enum-users] [--realm-wordlist REALM_WORDLIST] [--client-wordlist CLIENT_WORDLIST]
[--user-wordlist USER_WORDLIST] [--enum-users-client-id ENUM_USERS_CLIENT_ID]
[--verify-login] [--no-verify-login] [--verify-client-id VERIFY_CLIENT_ID]
[--timeout TIMEOUT] [--request-delay REQUEST_DELAY] [--output-dir OUTPUT_DIR]
[--proxy PROXY] [-d] [-y] [--json-out JSON_OUT]
CVE-2026-18963 Keycloak 정찰 + 익스플로잇 프레임워크 (자체 인프라 전용)
options:
-h, --help 도움말 메시지를 표시하고 종료합니다.
--target TARGET 단일 대상: 호스트/IP만, host:port, 또는 전체 http(s)://host[:port] URL. 스킴과 포트는
생략 시 자동 감지됩니다(https 먼저 시도 후 http; 각각 443/80 기본값).
--targets-file과 상호 배타적입니다.
--targets-file TARGETS_FILE
한 줄에 대상 하나씩 있는 파일 경로, --target과 동일한 유연한 형식('#' 주석 허용).
모든 대상에 대해 순차적으로 정찰+익스플로잇을 실행합니다.
--port PORT --target의 포트를 재정의합니다(--targets-file 줄에 자체 포트가 없는 경우의 대체값).
--targets-file의 줄별 포트가 항상 우선합니다.
--realm REALM 대상 Realm. 생략 시 정찰 결과에서 자동 선택됩니다.
--client-id CLIENT_ID
사용할 OIDC client_id. 생략 시 정찰 결과에서 자동 선택됩니다.
--username USERNAME 대상 사용자 이름. 생략 시 정찰 결과에서 자동 선택됩니다.
--new-password NEW_PASSWORD
대상 사용자에게 설정할 비밀번호 (기본값: 'Test123!')
--skip-enum 정찰을 완전히 건너뜁니다; --realm/--client-id/--username이 필수가 됩니다.
--enum-only 정찰을 실행하고 결과를 출력하되, 익스플로잇을 시도하지 않습니다.
--kc-version Keycloak 버전 정찰 단계(핑거프린트 + 코퍼스 매칭 + 패치 상태)만 실행하고
종료합니다 - realm/client/user 열거 및 익스플로잇을 완전히 건너뜁니다. --target과
--targets-file 모두에서 작동합니다.
--kc-reset-link 셀프 서비스 비밀번호 재설정('비밀번호를 잊으셨나요?' /
resetPasswordAllowed) 흐름이 노출되어 있는지만 확인한 후 종료합니다 - 비파괴적 GET 한 번,
사용자 이름 불필요. --realm/--client-id가 명시적으로 주어지지 않으면 가벼운
realm+client 정찰을 통해 자동 발견합니다. 익스플로잇은 건너뜁니다. --target과
--targets-file 모두에서 작동합니다.
--corpus-dir CORPUS_DIR
정확한 버전 매칭을 위한 알려진 버전 핑거프린트 디렉터리 (기본값:
kc_version_corpus).
--label LABEL 알 수 없는 버전 매칭 대신 이 대상의 핑거프린트를 이 버전 라벨로 코퍼스에 저장합니다.
알려진 버전의 인스턴스에서 사용하세요.
--enum-realms Realm 이름 열거 (기본값: 정찰 중 켜짐).
--no-enum-realms
--enum-clients Realm별 클라이언트 ID 열거 (기본값: 정찰 중 켜짐).
--no-enum-clients
--enum-users Realm별 사용자 이름 열거 (기본값: 정찰 중 켜짐).
--no-enum-users
--realm-wordlist REALM_WORDLIST
--client-wordlist CLIENT_WORDLIST
--user-wordlist USER_WORDLIST
--enum-users-client-id ENUM_USERS_CLIENT_ID
사용자 이름 열거 direct-grant 프로브에 사용되는 클라이언트 (기본값: admin-cli).
--verify-login 비밀번호 변경 후, password-grant 토큰 요청을 통해 새 자격 증명을 확인합니다
(기본값: 켜짐).
--no-verify-login
--verify-client-id VERIFY_CLIENT_ID
검증 password grant에 사용되는 클라이언트.
--timeout TIMEOUT
--request-delay REQUEST_DELAY
익스플로잇 체인의 각 요청 전 대기 시간(초) (기본값: 0.4). Keycloak의 로그인
흐름 상태는 재설정/재시작/선택기 재생 단계에서 타이밍에 민감할 수 있습니다; 작은
지연이 체인을 더 안정적으로 만듭니다. 0이면 비활성화.
--output-dir OUTPUT_DIR
--proxy PROXY HTTP(S) 프록시를 통해 라우팅: 'burp' (127.0.0.1:8080 약어), host:port만, 또는
전체 http(s):// URL.
-d, --debug 요청/응답/열거 프로브의 상세 디버그 로깅
-y, --yes '이 대상으로 계속하시겠습니까?' 프롬프트를 건너뜁니다. 비대화형 사용(스크립트,
여러 대상이 있는 --targets-file, CI)에 필요합니다.
--json-out JSON_OUT 정찰 + 익스플로잇 결과의 JSON 보고서를 이 경로에 작성합니다.
kc-resetforge — CVE-2026-18963 Keycloak 정찰 + 익스플로잇 도구 (자체 인프라 전용)
Usage
-----
완전 자동 (정찰 -> 대상 자동 선택 -> 익스플로잇 -> 검증):
python3 kc-resetforge.py --target https://localhost:9990 --proxy burp -d
정찰만:
python3 kc-resetforge.py --target https://localhost:9990 --enum-only -d
여러 호스트에 대한 버전 + 패치 상태 확인만:
python3 kc-resetforge.py --targets-file targets.txt --kc-version
정찰 건너뛰고 직접 대상 지정:
python3 kc-resetforge.py --target https://localhost:9990 --realm master \
--client-id account --username admin --skip-enum
필요 사항: requests, beautifulsoup4, 선택적으로 rich (pip install --break-system-packages)
26.7.226.4.15-1 / 이미지 26.4-2326.6.6-1 / 이미지 26.6-12kc-resetforge는 탐지/검증 도구입니다. 대상의 reset-credentials 흐름이 action-token 전제 조건을 올바르게 적용하는지(패치됨) 또는 그렇지 않은지(취약함) 확인하여, 승인된 평가에 사용할 수 있게 합니다. 아래 링크된 분석 문서는 공개 공개에 적합한 수준으로 메커니즘과 재현 방법론을 다룹니다.
전체 분석: Forging kc-resetforge: Turning CVE-2026-18963 Into a Repeatable Check
kc-resetforge.py는 Keycloak에 "버전이 무엇입니까?"라고 물을 수 없습니다. 사전 인증으로 답변해주는 엔드포인트가 없기 때문입니다. 대신 대상의 핑거프린트(응답 필드, 정적 자산 해시, 파비콘)를 수집하여 이미 알려진 버전으로 라벨링한 코퍼스와 비교합니다. 해당 핑거프린트에 대한 코퍼스 항목이 없으면 정확한 버전을 알 수 없는 것이며, 이는 버그가 아니라 설계상 의도입니다.
접근 권한이 있는 각 버전에 대해 코퍼스를 한 번 구축하세요:
python3 kc-resetforge.py --target https://known-26.6.2-host --kc-version --label 26.6.2
python3 kc-resetforge.py --target https://known-26.7.2-host --kc-version --label 26.7.2
[snip]
My Lab:
python3 kc-resetforge.py --target https://localhost:9990 --kc-version --label 26.6.2
python3 kc-resetforge.py --target https://localhost:9991 --kc-version --label 26.6.3
python3 kc-resetforge.py --target https://localhost:9992 --kc-version --label 26.6.4
python3 kc-resetforge.py --target https://localhost:9993 --kc-version --label 26.7.0
python3 kc-resetforge.py --target https://localhost:9994 --kc-version --label 26.7.1
python3 kc-resetforge.py --target https://localhost:9995 --kc-version --label 26.7.2
Recon:
python3 kc-resetforge.py --targets-file targets.txt --kc-version --kc-reset-link --proxy 127.0.0.1:8080
[snip]
[*] Proxying through: http://127.0.0.1:8080
[+] Run Summary
Targets scanned
┏━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━┓
┃Target ┃ Keycloak Version ┃ Patch ┃ Reset Link ┃ Result ┃
┡━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━┩
│https://localhost:9990 │ 26.6.2 │ VULNERABLE │ ENABLED │ checked│
│https://localhost:9991 │ 26.6.3 │ VULNERABLE │ ENABLED │ checked│
│https://localhost:9992 │ 26.6.4 │ VULNERABLE │ ENABLED │ checked│
│https://localhost:9993 │ 26.7.0 │ VULNERABLE │ ENABLED │ checked│
│https://localhost:9994 │ 26.7.1 │ VULNERABLE │ ENABLED │ checked│
│https://localhost:9995 │ 26.7.2 │ PATCHED │ ENABLED │ checked│
└───────────────────────┴──────────────────┴────────────┴────────────┴────────┘
항목은 스크립트 옆의 kc_version_corpus/에 저장되므로, 도구를 어느 디렉터리에서 실행하든 유지됩니다. 해당 폴더를 삭제하지 마세요.
코퍼스 내용 확인:
ls kc_version_corpus/
라벨링이 완료되면 이후 모든 스캔이 자동으로 매칭됩니다:
python3 kc-resetforge.py --target https://target --kc-version
python3 kc-resetforge.py --targets-file targets.txt --kc-version
이 프로젝트는 다음 용도로만 엄격히 제공됩니다:
소유하지 않았거나 명시적인 서면 승인을 받지 않은 시스템에 대해 이 도구를 실행하지 마십시오. 제3자 인프라에 대한 무단 사용은 불법이며 이 프로젝트의 의도된 목적을 벗어납니다. 관리자는 오용에 대해 어떠한 책임도 지지 않습니다.
| 필드 | 값 |
|---|
| CVE | CVE-2026-18963 |
| 심각도 | 치명적(Critical) |
| CVSS | 9.1 |
| CWE | CWE-640 (취약한 비밀번호 복구 메커니즘) |
| 구성 요소 | Keycloak — reset-credentials 인증 흐름 |
| 영향 | 인증 없이, 상호작용 없이 계정 탈취 가능 (관리자 계정 포함) |
| 패치 버전 | Keycloak 26.7.2 (업스트림) / RHBK 26.4.15-1, 26.6.6-1 |