Authentication - Brute forcing3

2021. 1. 13. 13:21문제연습/bs_Training

반응형

 

 

본 티스토리 블로그는 PC에 최적화되어 있습니다.

모바일 유저분들은 아래 네이버 블로그를 이용해 주세요

 

Authentication - Brute forcing3

본 네이버 블로그는 모바일에 최적화되어 있습니다.PC 유저분들은 아래 티스토리 블로그를 이용해 주세요...

blog.naver.com


Lab: Username enumeration via response timing

이번 문제도 브루트 포싱을 통한 로그인 인증 우회 문제입니다.

한번 뚜껑을 열어 보도록 하겠습니다.

 

 

1. 문제 내용

현재 주어진 계정 wiener:peter 정보와 My account 페이지의 정보를 이용해

브루트 포싱을 진행하라고 힌트를 던져 주었습니다.

 

 

접속화면)

최초 접속화면, 로그인 화면

한번 주어진 계정으로 로그인 시도해 보도록 하겠습니다.

 

이미 제가 몇 번 시도한 흔적이 나오지만... 여하튼 My Account 탭에 들어가면

다음과 같이 이메일을 업데이트할 수 있는 창이 나옵니다.

 

여기서 우리가 알 수 있는 사실 하나.

보통 일반적으로 이메일을 만들거나 자동 생성되는 경우 다음과 같은 형태로 보통 생성됩니다.
-> username(or id)@mail_server_name

이 말인즉슨, 중복된 이메일 사용을 막기 위해 username 검증이 들어가는데, 이메일 탐색을 통한 username 정보 유출이 가능하다는 것입니다.

 

물론 이 부분이 먹히지 않는다면 로그인 창을 이용한 전수조사를 진행해야 합니다...

일단 한번 계정 이름 유출을 시도해 보도록 하겠습니다.

 이 사이트의 경우, 특별한 검증 없이 이메일 폼이 input_name@input_name 꼴임을 알 수 있습니다.

이 정보를 이용해 전수조사를 진행하도록 하겠습니다.

 

 

공격 결과 어떠한 정보도 얻지 못했습니다...

아무래도 로그인 입력창을 이용한 전수 조사를 진행해야 할 것 같습니다.

 

 

로그인을 약 5~6번 진행하였더니 다음과 같은 창이 출력되었습니다.

로그인 시도 횟수마다 시간제한을 걸어 놓은 듯 한데, 보통 같은 유저가 계속 로그인을

시도하는지 안 하는지 판별하는 기준은 보통 쿠키, 세션 값이나 ip 주소를 확인하는 경우입니다.

 

문제에서 제시한 힌트를 확인해본 결과 http 헤더를 조금만 건들면 ip 기반의 필터링을 우회할 수 있답니다.

도저히 감이 잡히지 않아서 솔루션을 확인하였더니 http 헤더에 X-Forwarded-For 헤더 정보를 추가하면 ip 기반의 필터링을 우회할 수 있답니다.

 

- X-Forwared-For -

- 설명 -
XFF(X-Forwarded-For)는 HTTP 헤더 중 하나로, 원래의 IP 주소를 식별하기 위한 표준 헤더입니다.


- 구조 -
-> X-Forwarded-For: <client>, <proxy1>, <proxy2>

<client> : 클라이언트 IP 주소

<proxy1>, <proxy2> : 요청이 여러 프록시를 통과하는 경우 연속되는 각 프록시의 IP 주소가 나열됩니다. 즉, 가장 오른쪽에 있는 IP 주소는 가장 최근 프록시의 IP 주소이고 가장 왼쪽에 있는 IP 주소는 원래 클라이언트의 IP 주소입니다.

https://ko.wikipedia.org/wiki/XFF
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For

 

즉, 이 부분을 이용해 우리가 서버에 조작된 ip를 전달한다면 로그인 횟수 필터링을 bypass 할 수 있습니다.

일단 서버가 제대로 된 ip 검증이 없다는 전제를 가지고 공격을 시도해 보도록 하겠습니다.

 

 

만약 잘못된 계정 정보로 로그인을 시도할 경우 서버에서 다음과 같은 응답을 반환합니다.

Invalid username or password.

이 부분을 grep match 하도록 하겠습니다.

바로 payload를 짜보도록 하겠습니다.

 

 

아래와 같이 번위를 지정해 주고 payload1, 2를 각각 설정하면 됩니다.

이제 공격을 진행해 보도록 하겠습니다.

 

 

 

막상 공격을 진행하였더니 나오는 정보가 없습니다.

뭔가 제가 놓치고 있는 부분이 있는 것 같습니다.

 

문제 제목이 Username enumeration via response timing이라는 것을 힌트로 보겠습니다.

 

우리가 올바른 정보를 서버에 보낼 때와 잘못된 정보를 서버에 보낼 경우

응답 시간이 달라지는데 문제에서는 이 부분을 활용하라고 하는 것 같습니다.

 

비밀번호를 굉장히 길게 주고 username을 전수조사하면 어떻게 될까요?

올바른 계정을 입력하면 서버에서는 비밀번호를 대조하는 루틴이 들어갈 겁니다.

즉, 여기서 발생하는 시간차를 이용하자는 겁니다.

 

 

다시 한 번 더 수정하여 시도해 보도록 하겠습니다.

 아까와 같은 pay, grep match 값을 주었습니다.

 

 

확인해보니 응답시간이 비정상 적으로 큰 계정을 찾았습니다.

 비밀번호도 동일하게 아까와 같은 방식으로 공격을 시도하도록 하겠습니다.

우리가 원하는 비밀번호 정보를 찾아냈습니다.

 

 

username : asterix
password : zxcvbn

한번 로그인해 보도록 하겠습니다. 

 

 유출된 계정 정보를 이용해 로그인을 성공하였습니다.

 

이번 문제는 ip 기반 필터링이라는 힌트를 주었어도 http 구조에 대한 지식과

웹 운영 지식이 부족하여 푸는데 꽤 많은 시간을 소비하였습니다.

조금 더 웹 개발을 공부해야 할 것 같습니다.

 

 

반응형