[Dreamhack] Secure Secret

https://dreamhack.io/wargame/challenges/1570

 

Secure Secret

Description (en)The flag file is placed hidden in a random directory, and concealed its directory inside the session.Find the vulnerability and get the flag!The flag format for this challenge is DH{...}.Description (ko)플래그 파일을 무작위한 디

dreamhack.io

 

서버를 생성하니 이런 웹페이지가 나왔다.

 

전체적인 코드 흐름은 secrets/ 폴더 안에 sample 파일을 생성하고,

랜덤한 디렉토리를 만들어 그 안에 flag 파일을 저장한다.

사용자가 / 경로에 GET 요청 시 세션에 flag 파일 경로를 저장하고, path 파라미터를 검증한다.

그리고 secrets/ 아래 특정 파일을 열어 내용을 출력하는 흐름이다.

 

SECRETS_PATH = 'secrets/'
ALLOWED_CHARACTERS = string.ascii_letters + string.digits + '/'

허용된 문자로는 영문자 + 숫자 + 슬래시로 입력 값 필터링이 걸려있다.

 

flag_dir = SECRETS_PATH + os.urandom(32).hex()
os.mkdir(flag_dir)
flag_path = flag_dir + '/flag'

with open('/flag', 'r') as f0, open(flag_path, 'w') as f1:
    f1.write(f0.read())

secrets/ 밑에 랜덤 이름의 서브디렉토리를 생성한다.

그 안에 flag 파일을 생성하고 /flag 파일의 내용을 읽어서 새 파일에 저장한다.

 

path = request.args.get('path')
if not isinstance(path, str) or path == '':
    return render_template('index.html', msg='input the path!')

사용자 세션에 flag 파일의 실제 경로를 저장하고,

GET 파라미터 값을 가져오는데 없거나 빈 문자열이면 정해진 메시지를 출력한다.

 

if any(ch not in ALLOWED_CHARACTERS for ch in path):
    return render_template('index.html', msg='invalid path!')

입력 문자열의 모든 문자가 ALLOWED_CHARACTERS 안에 있어야 한다.

이 로직으로 일반적인 디렉토리 트래벌 공격 방어가 가능하다.

 

flask는 기본적으로 서버에 세션 데이터를 저장하지 않는다.

대신 쿠키 안에 세션 데이터를 넣고, app.secret_key로 서명해서 클라이언트가 수정 못하도록 막는 방식이다.

 

session['secret'] = flag_path

이 코드에서는 세션에 secret 키로 플래그 파일 경로 저장한다.

서버가 경로를 세션에 넣어 브라우저에 돌려주기 떄문에 secret_key만 알면 쿠키를 해독해 JSON으로 변환 가능하다.

 

app.secret_key = os.urandom(32)

secret_key는 서버 실행 시 랜덤 생성하기 때문에 브루트포스 불가하다.

 

현재 코드에서는 session['secret'] = flag_path 로 FLAG 경로를 저장하고 있으므로, 
이 쿠키의 data 부분(Base64)을 디코딩하면 JSON 형태의 세션 데이터가 확인되고, 
그 안에서 'secret' 값(즉, FLAG 파일 경로)을 알 수 있다.

 

웹 페이지에서 얻은 쿠키 값을 디코딩한다.

 

여기서 해독된 값을 주소로 입력하면 플래그를 얻을 수 있다.

 

'해킹 스터디' 카테고리의 다른 글

[Dreamhack] I LOVE XSS!  (0) 2025.08.10
[Dreamhack] node-serialize  (0) 2025.08.10
[Dreamhack] weird lagacy  (2) 2025.08.02
[Dreamhack] Stop before stops!  (0) 2025.07.27
[DreamHack] easy-login  (2) 2025.07.24