


# main.py
import os, subprocess
from functools import wraps
from flask import Flask, request
app = Flask(__name__)
API_KEY = os.environ.get('API_KEY', None)
def key_required(view):
@wraps(view)
def wrapped_view(**kwargs):
apikey = request.args.get('API_KEY', None)
if API_KEY and apikey:
if apikey == API_KEY:
return view(**kwargs)
return 'Access Denied !'
return wrapped_view
@app.route('/', methods=['GET'])
def index():
return 'API Index'
@app.route('/file', methods=['GET'])
def file():
path = request.args.get('path', None)
if path:
data = open('./files/' + path).read()
return data
return 'Error !'
@app.route('/admin', methods=['GET'])
@key_required
def admin():
cmd = request.args.get('cmd', None)
if cmd:
result = subprocess.getoutput(cmd)
return result
else:
return 'Error !'
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
shell을 실행시켜 flag에 관련된 파일을 찾아보면 될 것 같다
admin에서 cmd를 사용하지만 @key_required라는 데코레이터에서 API_KEY를 검증하고 있다.
API_KEY는 API_KEY = os.environ.get('API_KEY', None)를 통해 알 수 있다.
#dockerfile
FROM tiangolo/uwsgi-nginx-flask:python3.10
# ENV
ENV port 80
ENV API_KEY API_KEY
# SET USER
RUN useradd -d /home/user/ -m -s /bin/bash user
# SET packages
RUN apt-get update -y
RUN apt-get install -y python3-pip
# SET challenges
ADD ./app /app
WORKDIR /app
RUN pip install -r requirements.txt
ADD ./nginx/ /etc/nginx/conf.d/
EXPOSE $port
ENV API_KEY API_KEY 로 API_KEY가 설정되어있다./proc/self/environ 에 기록되어있다.file 페이지를 통해 /proc/self/environ 읽어보자.

테스트로 ls 명령어를 해봤다.

최상위 폴더로 옮겨서 flag 파일이 있는지 확인

cat flag를 하니 error발생

./flag를 하니 플래그가 나왔다.
