#!/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)
문제 소스코드이다.
문제설명에서 말했다시피 사물함번호는 숫자포함 알파벳 포함 4글자이고 , 비밀번호는 숫자만 100 이상 200 이하 라고 한다.
근데 로그인 검사를 하는 코드를 자세히 보면
if locker_num != "" and rand_str[0:len(locker_num)] == locker_num:
locker_num 이 비어있지 않고 rand_str의 첫 글자가 locker_num과 일치한다면 ~이라고 한다
그러면 Good을 출력한다고 한다.
그렇다면 만약 아이디가 'ab78'이라고 하면 앞글자인 'a'만 맞추면 Good을 출력하면 아이디도 무작위차별공격에 취약하다는 이야기가 된다 아이디를 먼저 구하고 비밀번호를 구하면 되는 문제인 거 같다.
버프스위트를 이용해서 해보자.
먼저 Target -> Sitemap에서 Request를 확인해 준다.
post -> locker_num , password를 보낼 수 있는 게 확인된다.
해당되는 Intruder로 보내준다
Intruder -> Positions로 넘어가게 되는데 그러면 Add§ 를 눌러 브루트포스를 할 자리를 지정해 준다.
앞서 이야기했듯이 사물함 번호는 앞글자만 맞다면 'Good'이라는 문자열을 출력하니 아이디부터 찾아보자.
Payload sets에서 Brute forcer로 변경한다.
아이디 앞글자를 비교했을 때 맞다면 Good을 출력한다고 했으니 Grep을 이용해서 확인해 보자
다른 Grep들이 있으니 Clear를 먼저 하고
새롭게 good을 Add 하도록 하자
Payload settings을 보면 character set에서는 어떤 문자들을 무작위로 넣을지 확인할 수 있다.
사물함 번호는 알파벳 소문자와 혹은 숫자 포함 4 자릿수 라고 했으니 설정해 주자
length 들은 한 글자씩 찾기 위해서 일부러 1로 설정했다.
시간 많은 사람들은 4자리 수로 해도 된다.
Start Attack을 눌러주면...
맨 앞글자는 q로 확인이 된다 왜냐하면 good을 응답했기 때문이다.
그럼 다른 글자를 찾기 위해서는 아까 Add§ 를 설정했을 때 맨 앞글자는 알았으니 앞에 'q'를 설정해 주고 다시 돌리면
아이디를 찾을 수 있을 거다.
아이디를 찾았으니 이제는 숫자로만 구성된 password를 찾도록 하자.
다시 돌아와서 이번에는 Numbers를 클릭하도록 하자 숫자로만 이루어져 있으니
Payload settings [Numbers]에서
Type : 순차적 , 무작위
From: 시작 숫자
To : 끝내는 숫자
Step : 증가량
를 설정해 공격하기 앞서 아까처럼 Add§ 설정에서 아이디를 대입 후에 해야 한다는 것을 알아야 한다.
참고로 ID만 맞으면 Good을 출력하고 ID, Password 가 다 맞았을 때는 Good을 출력하지 않는다.
설정을 했으면 바로 start attack을 눌러서 문제를 풀어보도록 하자.
'DreamHack > CTF' 카테고리의 다른 글
(CTF 출제) Whis-is-my-ip (0) | 2024.09.04 |
---|---|
(CTF 출제) BypassIF (0) | 2024.09.04 |
(CTF출제) mongoboard (1) | 2024.09.04 |
(CTF출제) Type c-j (0) | 2024.09.03 |
(CTF출제) baby-union (0) | 2024.09.03 |