본문 바로가기

웹해킹

드림핵 File Vulnerability Advanced for linux 롸업

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