[DreamHack] [web] [LEVEL 1] random-test 풀이

2024. 11. 23. 15:34Information Security 정보보안/DreamHack

728x90

 

배울내용 

dreamhack,

web hacking,

개발자도구,

dreamhack 풀이,

dreamhack random-test 문제,

dreamhack web 풀이 ,

burfsuite,  

random-test,

Cluster bomb attack,

 

 

 

문제

 

 

 

이번문제는 Brute force 로 풀면된다 

그러나 Brute force 가 2개 필요하니 Cluster bomb attack 을 이용하면 된다 

 

Cluster bomb attack 이란?  

Cluster bomb attack는 군사적 공격에서 **클러스터 폭탄(cluster bomb)**을 사용하여 수행하는 공격을 의미합니다. 클러스터 폭탄은 **한 개의 주요 폭탄 케이스 안에 여러 개의 소형 폭탄(자탄, submunitions)**이 들어 있는 무기입니다.

 

해킹에서는 "Cluster bomb attack"은 광범위한 다중 공격을 통해 특정 시스템이나 네트워크를 마비시키거나, 방어 체계를 무력화하려는 사이버 공격 방식으로 물리적 클러스터 폭탄처럼 한 번의 공격으로 여러 표적을 겨냥하거나, 다양한 벡터로 무차별적인 공격을 수행하는 것을 의미한다.

 

 

 

 

조건은 사물함 번호는 4자리 | 소문자 a-z , 0-9

자물쇠 비밀번호는 3자리 | 0-9

 

 

 

Burf Suite 를 켜준뒤에 Interfere On 해주고 아까와 같은 페이지에서 아무값이나 입력후 Forward 시켜준뒤 Send to Intruder 로 보내주고 종류를 Cluster bomb attack 하고 locker_num 사이에 있는 입력했던 1번째 값을 드래그후 Add 버튼을 누루고 아래와 같은 조건으로 해주면 된다 

 

 

 

그런데 생각해보니 너무많이 걸린다. 분명 정답은 찾을수있지만 너무많기 떄문에 한참걸릴것같다

 

 

 

1679616000 가지의 수를 비교해봐야하니깐 운이가장 나빠서 제일 마지막에 정답지가 있다고 치면

1년에 365 일 이니깐 이걸 나눠도 460 만년 뒤에 정답을 풀수있다

 

그러면 다른 힌트가 있는지 코드를 보자

 

#!/usr/bin/python3
from flask import Flask, request, render_template
import string
import random

app = Flask(__name__)

try:
    FLAG = open("./flag.txt", "r").read()       # flag is here!
except:
    FLAG = "[**FLAG**]"


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

rand_num = random.randint(100, 200)


@app.route("/", methods = ["GET", "POST"])
def index():
    if request.method == "GET":
        return render_template("index.html")
    else:
        locker_num = request.form.get("locker_num", "")
        password = request.form.get("password", "")

        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!")
            
            
app.run(host="0.0.0.0", port=8000)

 

 

코드를 확인하는 눈에 가는 조건문이 있다 

 
        if locker_num != "" and rand_str[0:len(locker_num)] == locker_num:

 

바로 이부분인데 문제의 locker_num가 빈칸이 아니고 랜덤한 문자열중 1번째에  위치한것만 같으면 조건을 성사시킨다

즉, 4 가지를 a-z0-9 까지 할필요없이 1번째 자리마 a-z0-9 하면된다 

뿐만아니라 성공시 Good 이란 키워드를 출력하니 Setting - Grep-Match 에서  조건에 넣어주면 된다 

 

 

 

 

 

그러면 brute forcing 공격을 진행하면 길이가 딱 1개 다른게있다

 

이런식으로 4개를 다 찾아주고 비밀번호쪽에 3자리 100~200 돌리게 되면 정답을 찾을수있을것이다 

 

 

당연 랜덤으로 생성되는것이기에 여러분이 풀때는 locker_num 와 password 는 다를수있다 

난 정말 우연찮게 비번이 100 이 걸려서 기분좋다 ( 이게뭐라고..) 

 

 

728x90