CTF/웹해킹

[HeroCTF] SmallMistakeBigMistake - 웹해킹 / 쿠키변조 / Flask

SecurityMan 2022. 7. 5. 11:00

 

간단한 웹해킹 문제

 

이전에도 비슷한 문제를 다룬적이 있었다.

(https://hackingstudypad.tistory.com/95)

 

반응형

 

문제 설명을 읽어보면 

 

웹 개발자들이 코드에서 작은 실수를 했는데

 

혹시 그걸 찾아서 exploit을 해 플래그를 획득할 수 있는지 물어본다.

 

문제페이지 주소와 함께, 웹 소스코드도 같이 주어진다.

 

 

먼저 문제페이지에 접속했을때 화면이다.

 

다짜고짜 You are not admin! 이라는 문구가 출력된다.

 

대체 왜 이런 문구가 출력되는지 소스를 확인해본다.

 

#!/usr/bin/env python
from flask import Flask, session, render_template

from string import hexdigits
from random import choice
from os import getenv


app = Flask(__name__)
app.secret_key = choice(hexdigits) * 32


@app.route("/", methods=["GET"])
def index():
    flag = "You are not admin !"
    if session and session["username"] == "admin":
        flag = getenv("FLAG")

    return render_template("index.html", flag=flag)


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=int(getenv("PORT")))

 

소스코드는 그렇게 길지 않다.

 

Python Flask 를 이용해 웹페이지를 만들었고,

 

session["username"]이 admin 일 경우 플래그를 출력하고 있다.

 

admin이 아니면 아까 봤던 You are not admin! 이 출력된다.

 

session["username"] 을 admin 으로 만들기 전에

 

한가지 확인해야 할 것이 있다.

 

 

Flask에서는 session 을 만들때 secret_key를 같이 넣어서 만든다.

 

여기서도 개발자들이 secret_key 를 넣고있는데

 

choice(hexdigists) * 32 라는 값을 넣고 있다.

 

이게 대체 무슨 값인지 한번 출력을 시켜봤다.

 

from string import hexdigits
from random import choice

a = choice(hexdigits) * 32
print(a)

 

출력시키는 코드는 이렇게 간단하게 짤수있다.

 

 

출력을 시켜보면 이런 값들이 나온다.

 

hexdigits 그러니까 16진수 값들(1,2,3,4,5,6,7,8,9,A,B,C,D,E,F) 중 하나를 골라 32번 출력하는 것이다.

 

secret_key에 어떤 값이 어떤식으로 들어갈 수 있는지 알았으니

 

이제 세션값을 만들어본다.

 

 

flask에서 쿠키값을 만들때는 특별한 방법으로 만든다.

 

flask-unsign 이라는 도구를 이용해서 해볼 수 있다.

 

pip3 install flask-unsign 이라고 입력하면 다운로드가 가능하다.

 

 

다운받고나서 이렇게 flask-unsign 이라고 입력하면 실행이 된다.

 

 

이제 옵션을 줘서 생성해주면 된다.

 

--sign 옵션을 줘서 쿠키를 생성하고, -c 옵션으로 쿠키로 만들 내용을 지정한다. 

 

--secret 옵션으로 secret_key를 지정해주면 되는데

 

일단 테스트겸 2를 32번써서 만들어 봤다.

 

명령어를 입력하면 아래쪽에 base64 인코딩된 쿠키값이 생성된다.

 

 

이제 쿠키값을 수정하면 된다.

 

쿠키값을 수정할 때는 ModHeader 라는 크롬 확장프로그램을 사용했다.

 

https://chrome.google.com/webstore/search/modheader?hl=ko 이곳에서 다운로드 받을 수 있다.

 

 

Modheader에서  Request header의 Cookie를 session=만들어낸 쿠키값으로 입력해주고

 

 

문제페이지에서 새로고침하면 플래그가 출력되는것을 볼 수 있다.

 

시험삼아 2로 먼저 해봤는데 바로 성공해버렸다.

반응형