본문 바로가기

Security

Dreamhack 드림핵 - random-test

  • 웹사이트 형태 확인

문제 설명에서 나와있듯이 사물함 번호에는 알파벳 소문자 혹은 숫자를 포함하는 4자리 문자열을 입력해야 하고,

자물쇠 비밀번호는 100 이상 200 이하의 정수를 입력해야 합니다.

하지만 둘 다 랜덤값이라는 점이 문제가 될 것 같습니다.


  • 코드 확인

 

alphanumeric = string.ascii_lowercase + string.digits
for i in range(4):
    rand_str += str(random.choice(alphanumeric))

위 코드에서 4개의 문자열을 랜덤으로 생성하는 것을 확인할 수 있습니다.

 

if locker_num != "" and rand_str[0:len(locker_num)] == locker_num:
            if locker_num == rand_str and password == str(rand_num):
                return render_template("index.html", result = "FLAG:" + FLAG)
            return render_template("index.html", result = "Good")
        else: 
            return render_template("index.html", result = "Wrong!")

위 코드는 입력된 문자열을 비교하는 코드입니다.

첫번째 if문에서는 입력받은 값만큼 앞에서부터 하나씩 잘라서 비교한다는 것을 확인할 수 있습니다.

예를 들어 rand_num = "admin"이라면

맨 앞에서부터 검사하므로 locker_num=a 부터 확인한다는 것입니다.

따라서, Burp Suite를 활용해 응답 값이 다른 하나의 문자를 계속해서 찾아간다면 

사물함 번호와 자물쇠 비밀번호를 알아낼 수 있을 것입니다.


  • 공격 시도

일단 임의로 사물함 번호에 "asdf", 자물쇠 비밀번호에 "100"을 넣고 요청을 Intercept 합니다.

그 다음 해당 요청을 Intruder로 보냅니다.

 

위 코드에서 확인할 수 있듯이 맞는 문자열이라면 결과값으로 "good"을 반환합니다.

따라서 good 값을 반환하는 무작위 대입값을 Grep 할 수 있도록 Match 값에 good, g 키워드를 추가합니다.

 

 

무작위 문자열로 값들이 생성되기 때문에 문자열이 될 수 있는 후보들은 "a,b,c,d,e,f,g,h,i,........0,1,2,3,4,5,6,7,8,9"입니다.

따라서 Payload type은 Brute forcer 공격으로 설정한 다음, Character set을 위와 같이 설정합니다.

 

공격을 수행하면 위와 같이 'u'에서 good이 뜬 것을 확인할 수 있습니다. 문자열 길이도 다른 값들과 다릅니다.

따라서 문자열의 맨 첫번째 값은 'u'라는 것을 확인할 수 있습니다.

이를 반복해 나머지 3개의 값도 확인하여 사물함 번호의 값을 찾아냅니다.

 

자물쇠 비밀번호는 세자리 수이므로 Payload type은 Number로 설정하여 숫자 대입 공격을 수행합니다.

100부터 시작하여 1씩 늘어나게 해서 200까지 공격을 수행하도록 합니다.

 

공격 대상은 password의 100입니다.

 

공격을 수행한 결과, 106에서만 다른 결과값이 뜬 것을 확인할 수 있습니다.

따라서 자물쇠 번호는 106입니다.

 

지금까지 공격을 수행한 결과 사물함 번호는 "uqc5"였고, 자물쇠 비밀번호는 "106"이었습니다.

입력 후 제출을 누르면 FLAG가 뜨는 것을 확인할 수 있었습니다.

'Security' 카테고리의 다른 글