2FA 인증 및 우회 방법 정리

2FA(Two Factor Authentication)은 온라인 포털 등에서 사용자의 기기를 기반으로 하는 추가 인증 절차이다. 기존 ID와 Password을 이용하여 로그인하는 지식 기반 인증 과정에서 하나의 인증 수단을 추가한 것으로 OTP(One Time Password)나 지문인식 모듈을 이용한 인증 방식 등을 사용한다.
기존의 인증 우회 기법의 발전과 함께 2FA 인증 우회 기술 또한 꾸준히 연구되고 있다. 이 글은 2FA 인증 기술과 공격자의 관점에서 이를 우회하는 기법을 다룬다.

2FA의 동작 과정


2FA는 기존의 인증 절차에서 인증 로직을 추가한 것이다. 기존의 로그인 방식이 email 주소나 패스워드를 묻는 방식이었다면, 인증코드(verification code)를 추가로 요구하는 방식이다.

인증 코드는 사용자가 가지고 있는 스마트폰에서 생성할 수 있다. 잠재적인 공격자가 특정 사용자의 계정을 탈취하기 위해서 아이디와 패스워드를 알고 있다면, 2FA는 "당신이 무엇을 가지고 있는가?"에 대한 추가 인증 절차를 요구하기 위해서 스마트폰에서 생성가능한 인증코드를 가지고 있는지 확인하는 것이다.

다음은 다양한 2FA 인증 과정이다.

SMS를 이용한 인증

웹에서 생성한 인증코드를 통신사와 연계하여 사용자에게 SMS로 전달하는 방식이다. 모바일 환경에서 인터넷 연결이 필요없다는 장점이 있다.


서드파티(3rd party) 앱을 이용한 방법(PASS, Google Authenticator)

이 과정은 코드를 생성하는 모바일 환경에서도 인터넷 연결이 필요하지만 웹에서 별도의 사용자의 요청 없이 일정 시간마다 동기화되는 코드를 바로 사용할 수 있다.


인증 토큰의 유형

OTP의 유형에도 여러가지가 있다.

1. Event-based Token(HOTP)
 - 이벤트를 기반으로 동작하며, 랜덤하게 생성된 키 값을 카운터로 사용한다. 사용자에게 미리 인증 과정에서 사용할 키 값들을 발급해주고, 몇 번째 인증에 대한 키값인지에 따라서 토큰을 사용하는 것이다. IETF에서 표준으로 정의하였으며, 미리 발급한 토큰만큼만 사용할 수 있기 때문에 주기적인 갱신이 필요하다.

2. Time-Based Token(TOTP)
 - 시간을 기반으로 하여 키 생성 알고리즘에 따라 난수를 생성하는 것이다. 30초나 60초 등 주어진 시간 동안만 유효한 토큰의 발급이 가능하다. 2011년에 IETF에서 표준으로 정의하였다.(Time-based One-Time Password Algorithm)
 

2FA 인증 우회

본 게시글에서 다루는 공격 기법을 실운영중인 대상에 시도하지 않도록 주의한다. 시도할 경우 관련 법에 의거 처벌대상이 될 수 있음을 유의한다.


웹 기반 시스템에서 2FA 인증을 우회하는 방법을 다룬다. 개발된 방식에 따라 차이가 존재하므로, 파라미터 변조, 무결성 검증여부 확인, 재전송 공격, 기능 강제 해제 등 다양한 기법을 시도해볼 수 있다.

응답 조작

1. 2FA 요청 시 응답을 확인한다.
2. "Success" 필드의 값이 False, Fail, 0 등 조작 가능한 값임을 확인한다.
3. 필드의 값을 true 등으로 조작하여 우회를 시도한다.

상태코드 조작

1. 2FA 요청 시 응답에서 응답 코드를 확인한다.
2. 요청 실패 시 401, 402 등 4XX 대 에러를 200 OK로 변조하여 우회를 시도한다.

 

2FA 코드 재사용

1. 2FA 코드를 발급받아 사용한다.
2. 기존에 사용한 코드를 재사용하여 응답을 확인한다.
3. 또한 여러 개의 2FA 코드를 발급받아 이전에 성공한 코드로 인증을 시도한다.
4. 오랜 기간이 경과한 후(1일 이상) 2FA 코드로 인증을 시도한다.


2FA 인증 옵션 해제 CSRF

1. 2FA 페이지에서 인증 옵션을 해제하는 요청을 CSRF PoC로 생성한다.
2. 피해자에게 PoC를 실행하도록 하여 2FA 과정을 거치지 않고 로그인이 되도록 설정이 가능한지 확인한다.
3. 또한 2FA 인증 해제 옵션을 적용하기 전 2FA 코드를 필요로 하고 있는지 확인한다.


2FA 사용 옵션 변경에도 이전세션 만료되지 않음

1. 두 개의 다른 브라우저로 로그인하여 하나에서 2FA 옵션을 활성화한다.
2. 두 번째 세션이 만료되지 않는다면, 공격자는 세션 하이재킹을 통해 활성화된 세션을 탈취하여 2FA 인증 이후 기능을 사용할 수 있다.


2FA Referer 검증 미흡

1. URL 직접접근을 통해 2FA 인증 이후 페이지로 접근을 시도한다.
2. 접근에 실패한 경우 referer 헤더를 2FA 인증 페이지로 변조한 후 다시 시도한다. 취약하게 설계된 경우 단순 referer 변조만으로 우회가 가능하다.


응답에서의 2FA 코드 노출

1. 2FA 요청 패킷을 전송할 때 응답에서 인증가능한 2FA 코드가 포함될 수 있다.
2. 응답 패킷을 분석하여 2FA 코드가 포함되어 있는지 확인한다.


JS 파일 분석

1. 2FA 요청을 전송할 때 사용하는 JS 파일을 분석하여, 2FA 검증 로직을 우회할 수 있는지 확인한다.


무차별 대입 공격(brute force)

시스템 가용성에 영향을 줄 수 있으므로 사전 협의된 대상에만 진행한다.
1. 2FA 인증 패킷을 반복하여 전송한다.
2. 100-200회 반복하여 요청이 가능한 경우 취약
3. 2FA 검증 페이지에서 입력 가능한 문자열을 이용하여(6자리 숫자 등)무작위 대입 공격을 시도한다.


2FA 코드 무결성 검증 미흡

1. 공격자의 계정에서 2FA 코드 요청 시도
2. 피해자의 2FA응답으로 공격자에게 발급된 2FA 코드를 사용하여 인증 시도


인증 이후 페이지 직접접근

1. 2FA 인증 이후 페이지로 직접 접근 시도
2. 2FA 인증 절차 없이 접근 가능한 경우 취약


결론

2FA 인증은 웹 애플리케이션에서 발생할 수 있는 많은 인증 취약점을 보완하였다. 하지만 2FA 도입 자체만으로 안전하다고 할 수 없으며, 여전히 남아있는 다양한 우회 방법들을 시도해 볼 필요가 있다. 이 게시글에서 다룬 방법을 제외하고 기존의 공격 기법과 결합하여 다양한 공격 벡터를 찾을 수 있다.

반응형