Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
उपकरण/GitHubGitHub/ivanesk315/cve-2026-18963
भेद्यता विश्लेषणशोषणवेब एप्लिकेशन शोषणवेब सुरक्षापेनिट्रेशन टेस्टिंगपहचान और एक्सेस प्रबंधन (IAM)प्रमाणीकरणलर्निंग और शिक्षालैब और अभ्यास
GitHubivanesk315/cve-2026-18963

CVE-2026-18963

Keycloak reset-credentials फ़्लो बायपास के लिए Docker-आधारित लैब और Python एक्सप्लॉइट, जो ईमेल सत्यापन बायपास के माध्यम से अकाउंट टेकओवर को सक्षम बनाता है।

0 दिन पहलेअभी तक समीक्षित नहीं
रिपॉजिटरी देखें

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

CVE-2026-18963 — Keycloak Reset-Credentials Flow Bypass Lab

अवलोकन

यह लैब Keycloak में CVE-2026-18963 (CVSS 9.1) कमजोरी का अनुकरण करती है, जो हमलावर को पासवर्ड रीसेट प्रवाह में ईमेल सत्यापन को बायपास करके किसी भी खाते पर कब्ज़ा करने की अनुमति देती है।

केवल सुरक्षा अनुसंधान और शैक्षिक उद्देश्यों के लिए उपयोग करें।

आवश्यकताएँ

  • Docker और Docker Compose
  • Python 3.8+
  • pip

उपयोग निर्देश

1. कमजोर Keycloak प्रारंभ करें

root@kitploit:~
docker-compose up -d

Keycloak के शुरू होने की प्रतीक्षा करें (~30-60 सेकंड)।

2. लैब सेटअप करें

root@kitploit:~
pip install -r requirements.txt
python setup-lab.py

स्क्रिप्ट निम्नलिखित बनाएगी:

  • reset-password सक्षम के साथ Realm vuln-lab
  • ईमेल भेजने के लिए SMTP (MailHog) कॉन्फ़िगरेशन
  • उपयोगकर्ता victim ([email protected] / VictimPass123!)

3. एक्सप्लॉइट चलाएँ

root@kitploit:~
python exploit.py -u http://127.0.0.1:8080 -r vuln-lab -t victim -p Pwned123!

विकल्प:

  • -u / --url: Keycloak URL (डिफ़ॉल्ट: http://127.0.0.1:8080)
  • -r / --realm: Realm नाम (डिफ़ॉल्ट: vuln-lab)
  • -t / --target: लक्ष्य उपयोगकर्ता नाम (डिफ़ॉल्ट: victim)
  • -p / --password: नया पासवर्ड (डिफ़ॉल्ट: Pwned123!)
  • -v / --verbose: डीबग आउटपुट सक्षम करें

4. ईमेल देखें (वैकल्पिक)

MailHog UI: http://127.0.0.1:8025 — एक्सप्लॉइट के दौरान भेजे गए reset-password ईमेल देखें।

5. सफ़ाई करें

root@kitploit:~
docker-compose down -v

तकनीकी विवरण

मूल कारण

Keycloak में दो दोष मिलकर हमले की श्रृंखला बनाते हैं:

दोष 1 — Selector state corruption (DefaultAuthenticationFlow.java): जब उपयोगकर्ता "Try Another Way" पर क्लिक करता है, तो auth note AUTHENTICATION_SELECTOR_SCREEN_DISPLAYED को execution model ID के बजाय "true" (बूलियन स्ट्रिंग) के रूप में सहेजा जाता है। मान "true" किसी विशिष्ट execution से बंधा नहीं होता, इसलिए यह प्रवाह के चरणों में बना रहता है, जिससे selector गलत संदर्भ में प्रदर्शित होता है।

दोष 2 — Unconditional action success (ResetCredentialEmail.java): ResetCredentialEmail की action() विधि बिना action token जाँचे बिना शर्त context.success() को कॉल करती है। सामान्यतः, action() केवल तब कॉल होती है जब उपयोगकर्ता ईमेल में लिंक पर क्लिक करता है (जिसमें action token होता है)। लेकिन जब selector भ्रष्ट हो जाता है, तो हमलावर flow processing के माध्यम से सीधे action() को ट्रिगर कर सकता है।

विस्तृत हमला प्रवाह

root@kitploit:~
Attacker                              Keycloak
   │                                     │
   │─── GET /auth (OIDC + PKCE) ────────>│  1. Khởi tạo auth session
   │<── Login page + cookies ────────────│
   │                                     │
   │─── GET /reset-credentials ─────────>│  2. Chuyển đến reset flow
   │<── Username form ──────────────────│
   │                                     │
   │─── POST tryAnotherWay=on ─────────>│  3. Corrupt selector state
   │<── Authenticator selector ─────────│     SELECTOR_DISPLAYED = "true"
   │                                     │
   │─── POST username=victim ──────────>│  4. Gửi username qua selector
   │<── "Check your email" page ────────│     Email gửi, CURRENT_EXEC = email_id
   │                                     │
   │─── GET /reset-credentials ────────>│  5. Re-enter reset flow
   │<── Corrupted selector (!!!) ───────│     processFlow() thấy SELECTOR="true"
   │                                     │     → hiển thị selector cho email step
   │                                     │
   │─── POST {} (empty body) ──────────>│  6. BYPASS: trigger action()
   │<── 302 → UPDATE_PASSWORD ─────────│     processAction() không thấy
   │                                     │     authenticationExecution trong form
   │─── GET /required-action ──────────>│     → rơi vào nhánh action()
   │<── Password update form ──────────│     ResetCredentialEmail.action()
   │                                     │     → context.success() (vô điều kiện!)
   │                                     │     → flow chuyển sang ResetPassword
   │                                     │
   │─── POST password-new=Pwned! ──────>│  7. Đặt mật khẩu mới
   │<── 302 → /account/ ──────────────│     Account takeover hoàn tất
   │                                     │
   └── Đăng nhập với mật khẩu mới ──────┘

चरण 6 क्यों काम करता है?

DefaultAuthenticationFlow.processAction() में, POST प्राप्त होने पर:

  1. form में tryAnotherWay जाँचें → नहीं (form खाली है)
  2. form में authenticationExecution जाँचें → नहीं (form खाली है)
  3. अंतिम शाखा में जाएँ: URL से model पर authenticator.action(result) कॉल करें

चूँकि URL में execution=<email_exec_id> (selector form action से) शामिल है, इसलिए ResetCredentialEmail.action() कॉल होती है → context.success() लौटाती है → flow ResetPassword पर चला जाता है → पासवर्ड सेट करने का form प्रदर्शित होता है।

प्रभावित संस्करण

उत्पादप्रभावितपैच किया गया
Keycloak (upstream)< 26.7.226.7.2+
RHBK 26.4.x< 26.4.1526.4.15+
RHBK 26.6.x< 26.6.626.6.6+

पैच (PR #51844)

DefaultAuthenticationFlow.java:

  • setAuthNote(SELECTOR_DISPLAYED, "true") → setAuthNote(SELECTOR_DISPLAYED, model.getId())
  • processFlow() Boolean.parseBoolean() के बजाय selector.equals(lastExecutionId) जाँचता है
  • यदि मेल नहीं खाता → removeAuthNote(SELECTOR_DISPLAYED)

ResetCredentialEmail.java:

  • action() context.success() कॉल करने से पहले ACTION_TOKEN_USER_ID जाँचता है
  • यदि कोई वैध action token नहीं है → context.failure(INVALID_USER)

संदर्भ

  • NVD - CVE-2026-18963
  • Red Hat CVE Page
  • Keycloak Issue #51833
  • Fix PR #51844
  • Kudelski Security Research
  • The Hacker News
टूल डाउनलोड करें