드림핵에 비기너 과정이 새로 생겼길래 구경하다가 이름부터 귀여운 baby linux 문제가 있길래 풀어보았다.
그냥 리눅스 쉘의 기능을 하는 웹 서비스에서 flag.txt 찾으면 되는 문제 ㅎㅎ
사이트에 들어가보면 위와 같이 명령어를 입력하는 부분과 출력 칸이 나온다.
ls 를 입력해보면 매우 친절하게 hint.txt 파일이 있음 ㅎ
flag 파일의 경로를 알려주고 있으니 저기로 가서 cat으로 확인하면 되겠다.
그런데 해당 경로의 flag.txt를 입력하니까 No! 문구가 뜨면서 막힌다.
이런 문구가 뜬다는건 일단 이게 flag 파일은 맞다는 소리인데 그냥 코드에서 필터링 하는 것 같으므로 코드를 확인해보자.
#!/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)
딱 "flag" 글자만 cmd에서 필터링 하고 있는 것을 확인할 수 있다.
그래서 그냥 정규표현식으로 우회했더니 다음과 같이 플래그 획득 성공
드림핵 비기너들에게 리눅스 활용법을 익힐 수 있는 좋은 문제 같다.