홈으로 돌아가기

은행 2FA 우회: 무차별 대입 공격

은행 펜테스트에서 시도 제한 없는 4자리 코드 무차별 대입을 통한 SMS-2FA 우회가 발견됨. 개인 계좌 접근으로 사기 가능. API 분석, JS 익스플로잇, CVSS 9.1 및 수정 권장 사항.

은행 2FA 무차별 대입 해킹: 전체 분석
Advertisement 728x90

SMS-2FA 무력화: 은행 펜테스트 분석 보고서

4,000대의 서버와 4,500명의 사용자를 보유한 주요 금융 인프라에 대한 정당한 블랙박스 펜테스트 중, 금융 애플리케이션 개인 계정 포털에서 SMS 기반 양자인증(2FA)의 심각한 취약점이 발견되었습니다. 공격자가 피해자의 전화번호에 접근할 경우, 3분 간의 제한 없이 4자리 코드를 자동으로 브루트포스 공격할 수 있었으며, 이로 인해 여권 정보, 신청 내역, 사기 거래 도구까지 완전히 접근 가능했습니다.

이 권한을 통해 고객 지원을 통해 대출 신청, 프로젝트 자금 승인, 결제 확인이 이루어졌으며, 추가 검증 없이도 실행 가능했습니다. 1만 가지 조합이 가능한 4자리 코드는 단 35초 만에 해독될 수 있었습니다.

API 및 인증 로직 분석

로그인 과정은 두 개의 엔드포인트에 의존했습니다:

Google AdInline article slot
  • SMS 요청: POST 요청 시 "repeat":180 반환 → 3분간 재시도 차단.
  • 코드 검증: POST /api/*****/login"{code":"0548","phone":"+7(111)222-22-22"} 본문 포함.

잘못된 코드 입력 시 HTTP 400 오류와 함께 "전화번호 또는 코드가 잘못되었습니다." 메시지 반환. 올바른 코드는 HTTP 200과 세션 쿠키(JSESSIONID, PHPSESSID)를 반환합니다. 시도 횟수 카운터, CAPTCHA, IP 또는 세션 차단 정책은 전혀 존재하지 않았습니다. 각 요청은 독립적으로 처리되었습니다.

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

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

JavaScript로 구현한 악성 공격 코드

PoC(PoC: Proof of Concept)는 브라우저 세션 컨텍스트를 활용해 CORS 및 SameSite 제한을 우회했습니다. 핵심 루프는 20개 스레드를 병렬로 활용해 브루트포스 공격을 수행했습니다.

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); // 코드 범위 지정
}

if (response.status === 200) {
    foundCode = codeStr;
    // 자동 입력 필드 채우기
}

성공 여부는 200 상태 코드로 판단했습니다. 유사한 스크립트는 파이썬에서도 작동했으며, 1만 건의 요청을 처리하는 데 35초가 소요되었습니다.

Google AdInline article slot

취약점 분류 및 근본 원인

이 문제는 CWE-307(과도한 인증 시도의 부적절한 제한)에 해당하며, CVSS 3.1 점수는 9.1(심각)입니다. 네트워크 영향, 낮은 복잡도, 권한 없음, 사용자 상호작용 필요 없음.

심각한 설계 결함:

  • 사용성 우선: 오타로 인한 불만을 피하기 위해 시도 제한 없음.
  • 자동화 감시 누락: 4자리 숫자는 인간에게는 어렵지만 스크립트에는 매우 쉬움.
  • 브루트포스 테스트 미실시: 보안 가정이 실제 검증되지 않음.

수정 권고사항

다층 방어를 위해 다음 조치를 시행하세요:

Google AdInline article slot
  • 시도 제한: 코드당 3~5회 시도 후 SMS 재발송.
  • 2~3회 실패 후 CAPTCHA 활성화.
  • 6자리 코드 사용 (100만 가지 조합, 브루트포스는 수시간 소요).
  • 이상 탐지 모니터링: 요청 빈도, IP 신뢰도 점검.
  • 전화번호 및 세션 기반 레이트 제한.
// 예시 백엔드 레이트 제한 (가상 코드)
if (attempts[phone] > 5) {
    invalidateCode(phone);
    requireCaptcha();
}

핵심 교훈

  • 2FA를 우회하면 계정 전체에 접근 가능: 여권 정보, 신청 내역, 은행 데이터, 결제 확인까지.
  • 제한 없는 4자리 코드 = 1만 가지 조합, 35초 내 해독 가능.
  • CWE-307 (CVSS 9.1): 자동화된 브루트포스 공격에 대한 보호 부재.
  • 권고: 시도 제한 + CAPTCHA + 6자리 코드 + 실시간 모니터링 강제 적용.
  • 이 취약점은 실제 공격 전에 펜테스트 과정에서 발견되었으며, 모든 문제는 이미 패치 완료됨.

— Editorial Team

Advertisement 728x90

다음 읽기