Authentication - 2FA.Lab(2)
Lab - 2FA broken logic )
Lab으로 들어가 로그인 정보를 입력하면
4글자 인증 코드를 입력하는 페이지가 출력된다.
메일로 전송된 코드를 입력하면
My account 페이지에서 로그인된 사용자 이름을 볼 수 있다.
이번 Lab의 목표는 carlos의 계정으로 로그인을 완료하는 것인데, 문제는 carlos의 비밀번호를 모른다. (?)
일단 위에서 본 페이지들을 정리해 보면
1) username & password를 입력하는 POST /login request
2) 1의 결과로 얻은 verify & session cookie를 포함하는 Get /login2 request
3) 2의 결과로 verify 된 사용자의 메일로는 코드가 전송되고, 코드를 입력하는 입력창 페이지가 출력된다.
4) 입력된 코드는 POST /login2 request에 mfa-code 값으로 들어가게 된다.
Lab을 해결하기 위해서는 carlos 계정으로 로그인하기 위한 2차 인증 코드가 필요하다.
그래서 Get /login request에서 verify 값을 carlos로 수정해 carlos에게 인증 코드가 전송되도록 한 다음
POST /login2 request로 Brute force 공격을 실행할 것이다.
일단은 wiener 계정으로 로그인을 한 다음에
GET /login2 request의 verify 값을 carlos로 수정해서 forward 한다.
code를 보내는 request에서
verify cookie를 carlos로 수정하고 mfa-code를 payload 처리해서
0000~9999까지 4자리 코드가 생성되는 Brute force 공격을 실행한다.
payload를 쭉 넣다 보면 response length가 다른 경우가 하나 나오는 데
이때의 payload가 2차 인증을 위한 4-digit code이다.
mfa-code에 0260을 넣고 packet을 보내면 carlos 계정으로 로그인에 성공한 걸 볼 수 있다.
:) 첫 번째 lab은 2차 인증 여부를 확인하지 않아서 2차 인증이 전체적으로 우회되는 경우였다.
:) 이번 Lab은 2차 인증까지 검증되는 건 맞지만
1차 로그인 단계를 완료한 사용자와 2차 코드 인증 단계를 완료한 사용자가 같은 사람인지를 확인하지 않았다.
:) 이 부분을 이용해 로그인은 wiener 계정으로 하고 code는 carlos 계정에 생성되도록 request를 처리해서
코드 인증은 carlos 계정으로 한 것이다.
:) 결과적으로 wiener라는 계정을 활용해 탈취하고자 한 carlos 계정을 얻은 것!
(+) security code에 대한 brute force 공격도 적절하게 방지되지 못한 부분도 문제가 될 수 있다.