[WARGAME] DVWA write-up/ Brute Force / medium

jckim22·2022년 10월 26일
0

[WEBHACKING] STUDY (WARGAME)

목록 보기
31/114

/*

웹서버 환경: Window 10

공격 클라이언트 환경: Kali linux (VMware 구동)

*/

이번 과제는 저번과 달리 DVWA의 웹페이지를 security level : medium으로 모의해킹하게 된다.

그래서 이번 과제부터는 가상 머신에 칼리 리눅스를 설치하고 윈도우에 설치되어있는 DVWA서버를 원격으로 해킹하기로 했다.

아무래도 원격으로 해킹을 하는 것이 좀 더 모의해킹 같다고 생각했다.

그에 따라 low레벨에서 분석했다 서버단에 코드들은 일단 먼저 보지 않기로 하고 정말 해킹을 한다는 생각으로 문제들을 풀고 이해하기로 했다.

이번 문제는 브루트포스이다.

아래는 low레벨 풀이 링크이다.
low레벨 풀이

low레벨과 같은 점은 여전히 로그인인데도 불과하고 GET 메소드를 사용하여 로그인 입력값들을 요청하고 응답받는다는 것이다.

low레벨과 다른 점이라고 하면 일단 페이로드로 받는 param을 필터링하여 SQL_Injection이 불가능하게 되었다.
그리고 결정적으로 서버에서 로그인에 실패했을 때 sleep(2)함수를 사용하여 2초간 지연되게 하였다.
실제 해킹에서 사용되는 패스워드 리스트 파일들을 10기가가 되는 파일도 있다.
근데 2초라는 시간을 주게 되면 그 파일들을 돌리는데 걸리는 시간은 천문학적 시간이 걸리게 될 것이다.

그래서 이번 문제에서는 low와는 달리 버프슈트를 사용하지 않고 버프슈트 커뮤니티보다는 속도가 훨씬 빠른 파이썬과 칼리 리눅스의 hydra를 사용해보도록 하겠다.

먼저 아래를 보자.

이렇게 로그인에 실패하면 실패했다는 문구가 뜬다. 저 문구의 유무를 조건으로 사용해서 프로그램을 짜면 될 거 같다는 생각이 든다. 그리고 저렇게 실패했을 때 서버에서는 2초의 지연시간을 줬을 것이다.

그럼 이제 파이썬 코드를 짜기 위해 먼저 아래처럼 weakpass.txt를 만들고 그 안에 테스트 패스워드들을 넣고 저장한다.

그리고 일단 아래처럼 요청 패킷을 한번 분석은 해본다.
잘못된 패스워드를 일부로 입력하고

아래 패킷을 보게 되면 일단 GET method를 사용하고 있고 Login파람은 Login이라는 문자열로 로그인하는 것을 볼 수 있었다.

이제 그럼 내가 작성한 아래 파이썬 코드를 보자.

#!/usr/bin/python3
import requests
import sys
from urllib.parse import urljoin
from urllib import parse

url = "http://192.168.5.1/dvwa/vulnerabilities/brute/"


with open('weakpass.txt','r') as f:
    passwords=f.readlines()


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

for password in passwords:
    param={
        'username':'admin',
        'password':password,
        'Login':'Login'
    }
    cookies = {
        'PHPSESSID': '8d3jt692uqhupell4d6rubi4j9',
        'security': 'medium'
    }

    res=requests.get(url,params=param,cookies=cookies)
    print(password)
    if "Username and/or password incorrect." not in res.text:
        print(f'found password = {password} ')
        break

url에 먼저 나의 윈도우 서버의 브루트포스 페이지 주소를 담는다.
그 후 weakpass.txt를 with으로 읽기전용으로 연다.
그리고 한줄씩 리스트로 passwords에 담아준다.
하지만 여기서 중요한 점이 readlines는 공백문자인 /n까지 담아주기에 그 공백문자를 제거해줘야 한다는 것이다.
그럼 strip()함수를 이용해서 passwords의 모든 요소에 있는 /n을 없애주자.
그 후 for문으로 passwords의 크기만큼 반복하고 그 요소들은 password에 담아준다.
그래서 username은 admin으로 고정하고 password는 반복 때마다 들어오는 password로 param을 설정해준다.
그리고 아까 패킷에서 Login param은 Login으로 설정해야 했기 때문에 그렇게 해준다.
cookies까지 담고 이제 requests.get으로 요청을 보낸다.
요청을 보낸 값은 res에 담아주고 만약에 res의 바디에 Username and/or password incorrct.라는 문자열이 없으면 그 때 로그인에 성공한 것이므로 그 반복 때 password를 출력한뒤 break한다.

그렇게 아래는 실행과정이다.


12345라는 패스워드를 찾고 프로그램이 종료된 것을 볼 수 있다.
아무래도 파이썬이 버프슈트보다 빠르다보니 자체적인 처리 시간이 짧아서 대충 하나당 2초 정도 걸리는 것 같았다.
sleep(2)의 영향 때문이다.
만약 low레벨이었으면 순식간에 password를 찾았을 것이다.

아래는 칼리 리눅스에서 hydra라는 툴로 브루트포스 공격을 해본 것이다.

-l -P 는 아이디와 비밀번호를 쓰면 되고 p를 대문자로 하고 패스워드 리스트가 담긴 파일을 담았다.
그 후 get, url, cookie, 조건까지 여러 정보를 담은 후 쓰레드를 4로 하고 hydra에게 공격 요청을 하였다.

그랬더니 아래처럼 비밀번호가 12345인 것을 알아낼 수 있었다.

브루트 포스는 시간을 지연하는 것만으로 방어가 된다는 것을 알았다.
하지만 이 로그인이 계속된 실패로 지연만 된다면 그것 또한 공격이라고 할 수 있다고 한다.

profile
개발/보안

0개의 댓글