728x90
[Dreamhack] File Vulnerability Advanced for linux
필요한 코드만 가져와 봤다.
@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파라미터를 통해서 ./files/경로로 파일을 읽어온다. 그러나 path파라미터에서 아무런 필터링이 없기 때문에 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에서 cmd를 통해서 명령어를 실행한다. 그러나 @key_required로 인해 API_KEY를 아는 이용자만 사용이 가능하다.
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
key_required 데코레이터 함수는 GET인자로 전달받은 API_KEY파라미터가 환경 변수에 설정되어 있는 API_KEY와 동일한지 확인한다.
우선 Path Traversal취약점을 이용해 /etc/passwd을 추출해봤다.
../../etc/passwd 볼 수 있었다. ../../ 디렉토리부터 시작함을 알 수 있었다.
위에서 말했듯이 환경 변수에 설정되어 있는 API_KEY와 동일한지 확인하기 때문에 환경 변수에 API_KEY가 있음을 알 수 있다. 따라서 /proc/self/environ 파일을 읽어오면 API_KEY를 알 수 있고 그것을 통해 /admin에 접근할 수 있다.
../../proc/self/environ으로 파일을 읽어왔고 API_KEY를 획득했다.
처음에 API_KEY만 넣었더니 Error가 떠서 당황했었다.
cmd를 통해 flag라는 파일이 존재함을 확인했다.
cmd=../../flag 를 통해 flag값을 획득할 수 있다.
728x90
'Webhacking-Write-Up > Dreamhack' 카테고리의 다른 글
[Dreamhack] Tomcat Manager (0) | 2023.01.22 |
---|---|
[Dreamhack] Apache htaccess (0) | 2023.01.11 |
[Dreamhack] Command Injection Advanced (0) | 2023.01.11 |
[Dreamhack] phpMyRedis (0) | 2023.01.11 |
[Dreamhack] csrf-2 (0) | 2023.01.11 |