security/웹해킹

[Dreamhack Wargame] File Vulnerability Advanced for linux

민사민서 2023. 7. 17. 13:24

문제 분석

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('/admin', methods=['GET'])
@key_required
def admin():
    cmd = request.args.get('cmd', None)
    if cmd:
        result = subprocess.getoutput(cmd)
        return result
    else:
        return 'Error !'

- /admin 페이지에 접속하려면 올바른 API_KEY를 입력해야 함

- argument로 건네준 cmd 명령어를 실행 가능

@app.route('/file', methods=['GET'])
def file():
    path = request.args.get('path', None)
    if path:
        data = open('./files/' + path).read()
        return data
    return 'Error !'

- 여기서 서버의 파일들 읽어올 수 있다

user  nginx;
worker_processes 1;
error_log  /var/log/nginx/nginx_error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections 1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/nginx_access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;
}
daemon off;

- nginx.conf 파일을 봤는데 저 접속기록(access_log)에 뭔가 데이터가 남아있지 않을

- /var/log/nginx/nginx_accesss.log 를 살펴보면 되겠다

 

문제 풀이

file?path=../../../../../var/log/nginx/nginx_access.log 에 접속했더니 API_KEY 제대로 얻을 수 있었음

관리자가 보낸 GET요청이 남아있었다

 

file?path=../../../root/.bash_history 혹은 file?path=../../home/user/.bash_history 에 접속했더니 

관리자가 사용했던 명령어들 확인 가능했다

 

file?path=../../../../../proc/self/environ 으로 환경변수를 전부 확인해도 되겠다

 

API_KEY를 획득한 후 /admin 페이지에 접속해서 적당히 서버의 플래그를 빼내면 되겠다

(file /flag 해서 플래그 바이너리의 형식을 파악하고 leak 해보자~)