SWLUG/μ›Ή ν•΄ν‚Ή

[Dreamhack/λ“œλ¦Όν•΅] baby-linux

waterproof 2023. 11. 16. 20:37

 

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

 

baby-linux

Description λ¦¬λˆ…μŠ€ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λŠ” μ›Ή μ„œλΉ„μŠ€κ°€ μž‘λ™ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή μ›Ή μ„œλΉ„μŠ€μ˜ μ½”λ“œκ°€ μ²¨λΆ€νŒŒμΌλ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€. flag.txt νŒŒμΌμ„ μ°Ύμ•„ 좜λ ₯ν•˜μ—¬ ν”Œλž˜κ·Έλ₯Ό νšλ“ν•˜μ„Έμš”! ν”Œλž˜κ·Έ ν˜•μ‹μ€ DH{...}

dreamhack.io

 


[1] 문제 뢄석

 

# μ›Ή νŽ˜μ΄μ§€ 뢄석

 

 

 

문제의 이름은 'Baby linux' 이고,

μ΄λ¦„μ²˜λŸΌ λ¦¬λˆ…μŠ€ λͺ…λ Ήμ–΄ 'echo$( )' κ΄„ν˜Έ μ•ˆμ— 무언가λ₯Ό μž…λ ₯ν•˜κ³  μ œμΆœν•  수 μžˆλŠ” ꡬ쑰둜 λ˜μ–΄ μžˆλ‹€.

 

 

 

<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>
</html>

 

 

문제 ν™”λ©΄μ˜ μ†ŒμŠ€ μ½”λ“œμ΄λ‹€.

POST λ°©μ‹μœΌλ‘œ 폼이 κ΅¬μ„±λ˜μ–΄ 있고, echo $() μ•ˆμ— μž…λ ₯ν•œ 값은 "user_input" μ΄λΌλŠ” νŒŒλΌλ―Έν„°λ‘œ μ €μž₯λ˜μ–΄ μ œμΆœλ˜λŠ” 것 κ°™λ‹€.

 

더 이상 μ•Œμ•„λ‚Ό 수 μžˆλŠ” 것이 μ—†μ–΄μ„œ λ‹€μš΄λ‘œλ“œν•œ 문제 νŒŒμΌμ„ μ‚΄νŽ΄λ³΄μ•˜λ‹€.

 

 

# λ‹€μš΄λ‘œλ“œν•œ 문제 파일 뢄석

  

βš™οΈ 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)

 

 

λ‚΄κ°€ ν•΄μ„ν•œ λ°”λ‘œλŠ”

 

μ›Ήμ—μ„œ λ°›μ•„μ˜¨ 'user_input'의 λ‚΄μš©μ„ cmd에 λ„£λŠ” 것 κ°™μ•˜λ‹€.

그리고 cmd에 'flag'λΌλŠ” λ¬Έμžμ—΄μ΄ μžˆλ‹€λ©΄ 'No!'λΌλŠ” κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λŠ” 것 κ°™μ•˜λ‹€.

 

κ·ΈλŸ¬λ‹ˆκΉŒ 쑰건은  'flag'λΌλŠ” λ¬Έμžμ—΄μ΄ cmd 창에 λ“€μ–΄κ°€λ©΄ μ•ˆ λ˜λŠ” 것이닀.

 

 

 

이 λΆ€λΆ„μ˜ ν˜•μ‹μ„ μ°Έκ³ ν•΄μ„œ, 폼을 μ œμΆœν•˜λŠ” 칸에 ")'&&f'echo $(ls"λ₯Ό μž…λ ₯ν•΄λ³΄μ•˜λ‹€.

μž…λ ₯ν•œ 값을 톡해 cmd = f'echo $()'&&f'echo $(ls)' κ°€ μ „λ‹¬λ˜λŠ” 것이닀.

('ls'λŠ” ν˜„μž¬ λ‚΄κ°€ μžˆλŠ” 디렉터리 μ•ˆμ— μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  디렉터리와 νŒŒμΌλ“€μ˜ λͺ©λ‘μ„ 좜λ ₯ν•˜λŠ” λͺ…령어이닀.)

 

 

ν˜„μž¬ λ‚΄κ°€ μžˆλŠ” 디렉터리 μ•ˆμ˜ 파일과 디렉터리 λͺ©λ‘μ„ 좜λ ₯ν•˜λŠ” 것을 μ„±κ³΅ν–ˆλ‹€!

 

'hint.txt' 파일이 μ˜μ‹¬μŠ€λŸ¬μš°λ‹ˆ 'cat' λͺ…λ Ήμ–΄λ₯Ό 톡해 κ·Έ λ‚΄μš©μ„ 보도둝 ν•˜κ² λ‹€.

.

.

.

)'&&f'echo $(cat hint.txt  μ„ μž…λ ₯ν•΄μ„œ

 cmd = f'echo $()'&&f'echo $(cat hint.txt)' μ΄ μ „λ‹¬λ˜λ„λ‘ ν–ˆλ‹€.

 

 

κ·Έλž¬λ”λ‹ˆ ./dream/hack/hello μ•ˆμ— Flagκ°€ μžˆλ‹€λŠ” λ‚΄μš©μ˜ 문ꡬ가 좜λ ₯λ˜μ—ˆλ‹€.

.

.

.

 

./dream/hack/hello μ•ˆμ— μ–΄λ–€ νŒŒμΌμ΄λ‚˜ 디렉토리가 μžˆλŠ”μ§€ ν™•μΈν•˜κ³  μ‹Άμ—ˆλ‹€.

 

)'&&f'echo $(ls ./dream/hack/hello 을 μž…λ ₯ν•΄μ„œ

cmd = f'echo $()'&&f'echo $(ls ./dream/hack/hello)' 이 μ „λ‹¬λ˜λ„λ‘ ν–ˆλ‹€.

 

 

κ·Έλž¬λ”λ‹ˆ ./dream/hack/hello μ•ˆμ— λ‚΄κ°€ 찾던 flag.txtκ°€ μžˆλ‹€λŠ” 문ꡬ가 좜λ ₯λ˜μ—ˆλ‹€.

.

.

.

 

이제 flag.txt의 λ‚΄μš©μ„ 열어봐야 ν•˜λŠ”λ°, μ—¬κΈ°μ„œ 'flag'λΌλŠ” λ¬Έμžμ—΄μ΄ cmd에 있으면 μ•ˆ λœλ‹€λŠ” 것이 λ¬Έμ œμ˜€λ‹€.

 

κ·Έλž˜μ„œ )'&&f'echo $(cat ./dream/hack/hello/*.txt μ„ μ‚¬μš©ν•˜μ—¬ '.txt'둜 λλ‚˜λŠ” λͺ¨λ“  파일의 λ‚΄μš©μ„ 좜λ ₯ν•˜λŠ” λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ˜€λ‹€.

 

 

 

문제 풀이 μ™„λ£Œ~~