문제정보
Exercise: File Vulnerability Advanced for Linux에서 실습하는 문제입니다.
Keypoint
환경변수파일
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 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')
메인화면
해당 웹사이트에는 총 2개의 페이지가 있다.
1. /file : 'path' 파라미터값에 "/etc/passwd"와 같은 경로를 입력하면 해당 파일을 보여준다.
2. /admin : 이름 그대로 admin 페이지로 'cmd' 명령어를 사용할 수 있다.
코드를 살펴보면
위와 같이 admin 페이지에 접속하기 위해서는 'API_KEY'가 필요하다.
따라서 문제 진행방식은 다음과 같다.
1. /file 페이지에서 환경변수 파일을 통해 'API_KEY' 획득
2. 1번에서 얻은 'API_KEY' 를 통해 'cmd' 명령어로 FLAG 획득
먼저 문제 파일중 'nginx.conf' 파일을 통해 'access_log' 파일을 살펴보았다.
cong는 configuration의 약자로 프로그램의 구성 또는 설정 파일을 말한다.
' /file?path=../../..//var/log/nginx/nginx_access.log ' 페이지로 이동하면 다음과 같은 화면이 나온다.
위의 로그 파일에서 사용자의 접속기록을 확인할 수 있었고, 이를 이용하여 'API_KEY'를 확인할 수 있었다.
이제 /admin 페이지로 접속하여 FLAG 파일 위치 확인후 '/flag' 명령어를 통해 FLAG를 얻을 수 있었다.
' /admin?API_KEY=d22cb18e86fc9e23996650150461c9f794ad3a4f&cmd=/flag '
참고로 FLAG파일이 실행파일이므로 cat 명령어로 고생 안하시길.....
FLAG
DH{2a4ff4e94d09793c662d1bd7ec5d497d7b190c6f}
'DreamHack > web' 카테고리의 다른 글
[wargame] csrf-2 (0) | 2023.07.17 |
---|---|
[wargame] session-basic (0) | 2023.07.17 |
[wargame] Apache htaccess (0) | 2023.07.16 |
[wargame] CSRF Advanced (0) | 2023.07.16 |
[wargame] out of money (0) | 2023.07.15 |