본문 바로가기

IT Security/DVWA(Damn Vulnerable Web App)

[DVWA] Brute Force Attack

안녕하세요 Retain0 입니다. 이번 시간에는 " DVWA " 라는 취약한 웹 애플리케이션을 통한 Brute Force Attack 을 해보도록 하겠습니다.

Brute Force Attack 이란

  • " 무차별 대입 공격 " 이라고도 하며 말 그대로 무작위로 값을 만들어 일치할 때까지 반복 시도를 합니다. 사람이 하나하나씩 입력해볼 수도 있지만 보통 자동화 도구를 사용하여 자동으로 대입하게끔 명령을 내립니다.

Dictionary Attack 

  • " 사전 대입 공격 " 이라고도 합니다. 부르트 포싱 과는 다르게 어느 정도 유추가 가능할만한 패스워드 리스트를 사전에 작성해두고 그것을 토대로 대입하는 방식입니다. 소문자, 대문자, 특수문자, 숫자 등 여러 가지 형태의 조합을 섞어서 작성하기도 하며 사람들이 제일 많이 사용하는 패스워드의 리스트를 기반으로 초반 탐색용으로도 사용합니다.

① Low

(사진 1) 로그인 폼

Low 레벨의 Brute Force 입니다. 로그인 시 어떤 방식으로 전송이 되는지 확인하게 위해 BurpSuite로 프록시를잡아서 확인해야 합니다.

(사진 2) 프록시로 잡은 모습

Low 레벨의 로그인폼의 경우 HTTP GET 요청을 받으며 이외에 다른 추가적이 보안설정은 없는 것을 확인할 수가 있습니다. 이럴 경우 무차별 대입 공격에 쉽게 노출이 될 수 있습니다.

(사진 3) 공격 구문

hydra 대상주소 -l admin -P /usr/share/john/password.lst http-get-form "/dvwa/vulnerabilities/brute/index.php: username=^USER^&PASS^&Login=Login: Username and/ or password incorrect. :H-Cookie: security=low; PHPSESSID=jhvvikku5tqods1h6bb9car73l"

 -l : login 이름 지정
-P : 패스워드 이름 지정 

(사진 4) 도출된 계정

사진 4를 보시다시피 hydra로 단 2초 만에 찾아낼 수가 있습니다.

 


② Medium

(사진 5) 지연되는 모습

Low 레벨에서 했던 것처럼 hydra를 해본 결과 꽤 오래 지연되고 있습니다. 소스코드를 확인해볼 필요가 있습니다.

(사진 6) Medium 소스코드

(사진 6) 소스코드를 확인해 본 결과 login failed -> sleep(2) 즉 실패 시 2초간의 지연시간을 두는 것을 확인할 수가 있습니다. 어느 정도 딜레이를 두고있기 때문에 brute force 공격의 속도를 어느정도 낮춰 줄 수는 있지만 완벽하게는 대응할 수 없는 방법입니다. 

(사진 7) 프록시 잡은모습

이번에는 BurpSuite의 " intruder " 기능을 이용해보도록 하겠습니다. 프락시 잡은 화면에서 우클릭 후 " send to intruder "를 클릭하시면 해당 값을 하나씩 타겟을 잡아서 대입해볼 수가 있습니다.

 (사진 8) 타겟 지정

(사진 8) 여기서 Attack type을 " Cluster bomb "으로 바꿔주시고 username 부분에 해당하는 " admin " 과 password 부분에 해당하는 " 1234 "를 각각 하나씩 드래그해서 ADD 해주시면 대입할 값들을 따로 설정하실 수가 있습니다.

(사진 9) 임의로 지정한 id 와 pwd 들

(사진 9) 각각 예측할 수 있는 id와 password 리스트를 만들어서 각각에 대입을 하였습니다. 지금은 실습이기에 예측이 굉장히 쉽고 간단하지만 보통 수많은 페이로드를 가지고 하나씩 대입을 하게 될 겁니다. 

(사진 10) 도출된 계정

(사진 10)을 보시면 해당 값을 여러 개 대입해본 결과 유독 값이 틀린 개 하나 보입니다. 또는 http 상태 응답 코드가 유독 틀린 경우가 있는데 그런 값이 나온다면 해당 대상에 대한 계정 값이라고 보시면 됩니다.


③ High

(사진 11) High 레벨 소스코드

(사진 11) High 레벨의 소스코드를 보시면 login failed -> sleep( rand(0,3 )); 즉 로그인 실패 시 랜덤 하게 0 ~ 3초 간의 지연시간을 두게 됩니다. medium레벨의 경우 지연시간이 고정적이였는데 만일 공격자가 제작한 스크립트 안에 로그인 시도 후 반응이 2초를 넘기면 바로 다음 값을 대입하라 라는 식으로 코드를 짜게 될 경우 무력화될 수 있기에 그러한 것을 방지하기 위한 것으로 보입니다. 하지만 이 또한 완벽할 수가 없습니다.

(사진 12) 계정 도출

(사진 12) user_token 값이 추가되어 조금 다르게 설정을 해준 상태였지만 마찬가지로 약한 문자열로 구성된 계정을 알아내는 것은 오랜 시간이 걸리지 않았습니다. 

 

◆ 대응방안

(사진 13) impossible 레벨 소스코드
(사진 14) 반복로그인시도 시 계정 잠김

(사진 13, 14)을 보시면 login failed-> sleep( rand(2,4)); 즉 2 ~ 4 초간 랜덤 한 시간을 응답을 하게 되며 추가적으로 여러 번의 로그인 시도 시 계정이 잠겨 15분 후에 다시 로그인 시도를 할 수 있는 것을 확인할 수가 있습니다. 이 정도의 보안이 잡혀있는 경우 사실상 Brute Force 공격이 굉장이 힘들어진다고 볼 수가 있습니다.

'IT Security > DVWA(Damn Vulnerable Web App)' 카테고리의 다른 글

[DVWA] insecure CAPTCHA  (0) 2020.04.23
[DVWA] File Upload Vulnerability  (0) 2020.04.21
[DVWA] File inclusion  (0) 2020.04.20
[DVWA] CSRF(Cross Site Request Forgery)  (0) 2020.04.19
[DVWA] Command Injection  (0) 2020.04.18