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 Denined !'
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')
main.py이다.
/file에서는 GET 방식으로 받은 path를 통해 ./files/에서부터 파일을 읽어온다.
여기에 아무런 필터링이 없기 때문에 ../를 이용해서 워하는 경로의 파일을 다운받을 수 있다.
/admin에서는 GET 방식으로 받은 cmd를 통해 시스템 명령어를 실행한다.
여기서 key_required 함수를 이용해 API_KEY를 검사한다.
flag 파일의 위치를 모르기 때문에 admin페이지에서 명령어를 실행해야 한다.
API_KEY는 os.environ.get으로 가져온다.
환경 변수가 저장된 파일의 위치가 /proc/self/environ 파일이기 때문에 이 파일을 읽어오면 API_KEY 값을 알아낼 수 있다.
이렇게 성공적으로 읽어올 수 있었다.
맨 아랫줄에 보면 API_KEY가 나와있다.
여기서 파일들을 보기 위해서 cmd=ls -al로 url에 넣어주면
이렇게 뜬다.
flag를 찾아보니 root 디렉터리에 있다는 뜻 같아서
http://host3.dreamhack.games:21945/admin?API_KEY=d22cb18e86fc9e23996650150461c9f794ad3a4f&cmd=/flag
그냥 이렇게 접속해봤더니 flag를 얻을 수 있었다.
'웹해킹' 카테고리의 다른 글
드림핵 Flying Chars 롸업 (0) | 2023.12.20 |
---|---|
드림핵 phpreg 롸업 (0) | 2023.12.19 |
드림핵 Apache htaccess 롸업 (0) | 2023.12.03 |
File Vulnerability Advanced (0) | 2023.12.03 |
드림핵 Command Injection Advanced 롸업 (0) | 2023.12.03 |