촉촉한초코칩

[Dreamhack] baby-linux 본문

Study/MISC

[Dreamhack] baby-linux

햄친구베이컨 2024. 8. 12. 17:28

 

코드

#!/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)

 

빈칸에 문자열을 입력하면 result로 출력해준다. 

 

 

공격

첫번째 try 조건문을 통과해야 flag가 보이는 것 같다. 

output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5) 해석해보았다. 

  • subprocess : 파이썬 스크립트에서 쉘 명령 등 다른 프로세스를 실행하고 출력 결과를 가져올 수 있게 하는 라이브러리 
  • check_output : 서브 프로세스를 실행하고 출력 문자열을 파이썬 로직에서 변수에 담아 사용하고 싶은 경우 사용한다. 

 

이 함수를 사용하는 줄 알았는데.. 커맨드 인젝션 문제인 것 같다. 

; 를 기준으로 이 다음에 다른 명령어를 입력하면 입력이 된다. 

 

a; ls

a; cat hint.txt

a; ls ./dream/hack/hello

여기까진 찾았는데 코드를 보면 flag가 user_input에 들어있으면 No!를 출력함

리눅스에서 폴더 안에 파일 읽는 명령어 막 이렇게 찾다가 * 발견

a; ls ./dream/hack/hello/*.txt

해결!! 

'Study > MISC' 카테고리의 다른 글

[Dreamhack] **Exercise: Docker  (0) 2024.08.20
[Dreamhack] dreamhack-tools-cyberchef  (0) 2024.08.12
[Dreamhack] SSH  (0) 2024.07.31
[Dreamhack] 64se64  (0) 2024.07.27
[Dreamhack] Welcome-Beginners  (0) 2024.07.27