본문 바로가기

Web Hacking/Dreamhack

[Dreamhack] File Vulnerability Advanced for linux write up

 

드림핵 웹해킹 로드맵 마지막 문제다 .. 드디어

 

먼저, 코드를 보자

 

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)

 

각각의 엔드포인트를 간단하게 분석해보자. /file의 경우 파라미터로 경로를 입력받고 파일을 읽어 결과를 리턴한다. /admin 엔드포인트는 api_key가 일치할 경우 시스템 명령어를 실행시킬수 있다. -> 근데 api_key는 알 수가 없음

 

그러나 /file 엔드포인트에서 파라미터의 값에 대한 별도의 검사가 없으므로 path traversal이 발생하게 되고 임의 파일을 다운로드 할 수 있다. 따라서 API 키를 다운로드 받아 시스템 명령어를 실행해야된다.

 

 

익스


 

먼저 /etc/passwd에 접근해서 path traversal이 발생하는 것을 확인했다.

 

 

강의에서 알려준 환경변수가 저장된 파일에 접근하니 API_KEY를 바로 얻었다..

 

gg