본문 바로가기
정보보안/Dreamhack

[Dreamhack Wargame] Beginner - baby linux 문제 풀이

by 용오동 2024. 11. 12.
반응형

☆ Beginner - baby linux ☆


[1] 문제

♣ baye linux 문제는 Dreamhack CTF Season 3 Round #2에 출제된 문제이다.

♣ flag.txt 파일을 찾는 리눅스 문제인 것으로 확인된다.

드림핵 워게임 - baby linux / 출처 : Dreamhack


[2] 풀이

♣ 서버를 생성하고 생성된 URL을 클릭해 웹 서버에 접속한다.

드림핵 워게임 - baby linux / 출처 : Dreamhack

 

♣ 접속한 웹 서버의 모습을 확인할 수 있다.

접속한 웹 서버(http://host1.dreamhack.games:14455/)

 

♣ 'echo $(          )' 명령 안에 'ls -l'를 집어 넣어 작업 공간을 확인한다.

'ls -l' 명령어로 작업공간 확인

 

♣ Result에 출력된 결과에는 다음과 같은 파일과 디렉터리 목록이 확인된다.

total 24K
-rwxr-xr-x 1 root root 884 Apr 21 2023 app.py 
drwxr-xr-x 3 root root 4.0K Apr 21 2023 dream 
-rw-r--r-- 1 root root 34 Apr 21 2023 hint.txt 
-rw-r--r-- 1 root root 5 Apr 21 2023 requirements.txt 
drwxr-xr-x 5 root root 4.0K Apr 21 2023 static 
drwxr-xr-x 2 root root 4.0K Apr 21 2023 templates

 

♣ 목록들 중 hint.txt 파일을 확인한다.

'cat hint.txt' 명령으로 텍스트 파일 출력

 

♣ flag.txt에 대한 힌트가 출력되었다. 해당 경로는 상대 경로로 되어 있고, 해당 경로에 flag.txt 파일이 있다는 것을 알려준다.

Where is Flag? ./dream/hack/hello

 

♣ 'pwd' 명령을 통해 현재 작업중인 디렉터리의 경로를 확인한다.

'pwd' 명령으로 작업중인 현재 경로 확인

 

♣ '/app'에서 작업중인 것을 확인할 수 있다.

/app

 

♣ 'ls -l' 명령으로 'hint.txt'에서 확인했던 '/app/dream/hack/hello' 경로에 flag.txt가 있는지 확인한다.

'ls -l' 명령으로 /app/dream/hack/hello 경로의 내용을 출력

# 사용한 명령어

ls -l /app/dream/hack/hello

 

♣ flag.txt 파일이 존재하는 것을 확인하였다.

total 4 -rw-r--r-- 1 root root 68 Apr 21 2023 flag.txt

 

♣ 'cat' 명령을 통해 flag.txt 파일의 내용을 출력한다.

'cat' 명령으로 /app/dream/hack/hello/flag.txt 텍스트 파일 출력

# 사용한 명령어

cat /app/dream/hack/hello/flag.txt

 

♣ 'No!'가 출력된다. 문제의 답 형식인 DH { ... } 형식이 아니기 때문에 이는 정답이 아니다.

No!

 

♣ 'No!'가 출력된 이유를 확인하기 위해 문제 파일 소스코드를 다운받는다.

♣ 또는 처음 'ls -l' 명령으로 확인했던 파일 중 'app.py'를 'cat' 명령을 통해 확인한다.

baby linux 문제 파일 받기 / 출처 : Dreamhack
'cat' 명령으로 app.py 텍스트 파일 출력

 

♣ 다운받은 app.py 파이썬 소스코드의 내용은 다음과 같다.

다운받은 app.py 소스코드 확인

 

#!/usr/bin/env python3
import subprocess
from flask import Flask, request, render_template

APP = Flask(__name__)

@APP.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        user_input = request.form.get('user_input')
        cmd = f'echo $({user_input})'
        if 'flag' in cmd:
            return render_template('index.html', result='No!')

        try:
            output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)
            return render_template('index.html', result=output.decode('utf-8'))
        except subprocess.TimeoutExpired:
            return render_template('index.html', result='Timeout')
        except subprocess.CalledProcessError:
            return render_template('index.html', result='Error')

    return render_template('index.html')

if __name__ == '__main__':
    APP.run(host='0.0.0.0', port=8000)

 

♣ if문에 'flag'가 입력되면 'No!'를 출력한다는 부분을 확인할 수 있다.

 if 'flag' in cmd:
     return render_template('index.html', result='No!')

 

♣ 'cat' 명령을 사용하여 flag.txt 텍스트 파일을 출력하되, flag 문자열이 모두 입력되지 않도록 와일드카드 문자를 사용하여 'fla*' 또는 'fla?.txt ' 등과 같이 입력한다.

'cat' 명령으로 flag.txt 파일을 출력(와일드 카드 이용)

# 사용한 명령어

cat /app/dream/hack/hello/flg?.txt

 

♣ 플래그 값을 얻어냈다. 문제의 답을 제출한다.

DH{671ce26c70829e716fae26c7c71a33823feb479f2562891f64605bf68f60ae54}

 

♣ 제출 결과

Flag 제출 결과


[Wild Card(와일드카드)]

♣ * : 모든 문자를 찾아주는 리눅스 명령어, a-z, 0-9 범위 내 임의의 0개 이상의 문자를 대체한다.

♣ ? : 문자 하나를 찾아주는 리눅스 명령어, a-z, 0-9 범위 내 임의의1개의 문자를 대체한다.

♣ {} : 중괄호 안에 있는 문자열 중 하나와 일치하는 것을 찾아주는 리눅스 명령

♣ [] : 대괄호 안에 있는 문자로 대체된다. [문자1 - 문자2] 또는 [문자1, 문자5, ...] 형태로 범위를 지정한다.


반응형