본문 바로가기
Dreamhack WarGame

[Dreamhack] baby-linux 문제 풀이

by whiteTommy 2023. 11. 19.

Dreamhack CTF Season 3 Round #2 (🌱Div2) 에 출제된 문제이다.

 

웹 해킹에 관한 문제이므로 http:// host : port로 접속한다.

 

우선, 이 웹 서비스에서 F12(관리자 모드)를 통해 정보를 확인해 보자.

<html>
<head>
  <link rel="stylesheet" href="/static/css/bootstrap.min.css">
  <link rel="stylesheet" href="/static/css/bootstrap-theme.min.css">
  <link rel="stylesheet" href="/static/css/non-responsive.css">
</head>

<body class="container">
  <form method="POST">
    <div class="row">
      <div class="col-md-6 form-group">
        <h1>Baby Linux</h1><br/>
        <div class="input_box">
          <p class="input_txt">echo $(<input type="text" name="user_input" class="input_in_txt" required>)</p>
        </div>
      </div>
    </div>
  
    <button type="submit" class="btn btn-default">Submit</button>
  </form><br/><br/>
  <h2>Result</h2>
  <pre></pre>


  <script src="/static/js/jquery.min.js"></script>
  <script src="/static/js/bootstrap.min.js"></script> 
</body>

 

하지만, 위의 index.html 코드로 딱히, 힌트가 될만한 정보를 찾지 못하였다. 

 

다시, 문제로 돌아가보자.

이 웹 서비스는 리눅스 명령어를 실행하는 사이트이다. 여기서, 우리가 찾아야 할 파일은 flag.txt이다.

 

이 파일의 위치를 찾기 전에 ls -l 명령어를 통해 작업 공간을 확인해 보자.

 

아래는 Result이다.

total 24 -rwxr-xr-x 1 root root 884 Apr 21 2023 app.py 
drwxr-xr-x 3 root root 4096 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 4096 Apr 21 2023 static 
drwxr-xr-x 2 root root 4096 Apr 21 2023 templates

 

여기서 hint.txt라는 힌트가 될만한 파일을 발견하였다. cat 명령어를 통해 이 파일에 대한 내용을 출력해 보자.

 

아래는 Result이다.

Where is Flag? ./dream/hack/hello

 

우리가 찾고자 하는 flag.txt의 파일 위치에 대한 힌트를 얻었다. 즉 현재 파일을 기준으로 상대 경로로 표기되어 있고,

./ dream / hack / hello에 flag.txt 파일이 있다는 사실을 알 수 있다.

 

마찬가지로, cat 명령어를 통해 flag.txt 파일의 내용을 확인해 보자.

 

아래는 Result이다.

No!

 

우리가 기대하는 DH { 해시 }와 같은 출력 형식이 아닌 No!라는 결과가 나왔다. 

 

여기서, 무엇이 문제인지를 확인하기 위해 처음에 문제 첨부했던 소스 코드를 확인해 보자.

 

아래는 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)

 

앞서 얻은 No!라는 결괏값에 대한 소스 코드 정보만 살펴보자.

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

 

위의 코드가 의미하는 것은 cmd(명령 프롬포트)에 flag 가 있으면 No! 를 출력한다는 것이다. 

 

즉, 우리는 cat 명령어를 사용할 때, cat./ dream / hack / hello / flag. txt에서 flag 가 포함이 되어 있어서, 우리가 원하는 결과를 얻지 못했음을 알 수 있다.

 

flag를 입력하지 않고도 flag.txt에 대한 파일 내용을 얻기 위해 와일드카드를 이용해 보자.

 

아래는 최종 Result이다.

DH{671ce26c70829e716fae26c7c71a33823feb479f2562891f64605bf68f60ae54}