촉촉한초코칩
[Dreamhack] baby-linux 본문
코드
#!/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 |