해당 문제는 리눅스 환경에서 파일 확인 취약점을 사용하여 flag를 획득하는 문제이다.
소스코드
위의 코드에서 3개의 페이지를 확인할 수 있다.
/ : index 페이지
/file : 파일을 확인하는 페이지
/admin : 입력받은 명령을 실행하는 페이지
문제풀이
문제 접근 방향
해당 문제의 목표는 /admin으로 접근하여 cmd라는 파라미터를 통해 명령을 실행하여 flag 파일을 실행시키는 것이다.
하지만 /admin으로 접근을 하기 위해서는 환경변수에 저장되어 있는 api_key를 알아내야 하는데 이때 /file의 취약점을 이용하여 해당 서비스 내에서 api_key를 찾아낸 후 /admin으로 접근하여 flag를 실행하면 된다.
사이트를 접속하면 아래와 같은 화면을 확인할 수 있다.
@app.route('/', methods=['GET'])
def index():
return 'API Index'
해당 페이지는 인덱스 페이지로 화면에 API index라는 문구를 출력하며 별다른 기능은 없는 페이지이다.
아래 그림은 /file 페이지에 접근하였을 때 출력되는 화면이다.
@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은 GET 메서드를 사용하여 path라는 파라미터를 통해 값을 입력받고 입력받은 값을 ./files라는 디렉터리에서 찾아
읽어오는 동작을 한다.
만약 파라미터의 값이 없을 경우에는 위의 그림과 같이 화면에 Error ! 를 출력하게 된다.
테스트를 위해 files안에 있는 test.txt라는 파일을 읽어오게 하였다.
파일이 존재할 경우 해당 파일을 읽어와 화면에 출력을 한다.
이때 조작된 파일명을 입력할 시 해당 서비스 내의 다른 파일을 확인할 수 있게 된다.
아래 그림과 같이 디렉터리가 구성되어 있을 경우에
현재 파일이 읽히는 위치는 /app/files/ 이게 된다. 하지만 만약 path파라미터에 ../requirements.txt 라고 입력할 경우
해당 서버는 상위 디렉터리로 이동 후 requirements.txt라는 파일을 읽어 오게 된다.
우리는 해당 취약점을 이용하여 /admin에 접근할 수 있는 api_key를 확인하면 된다.
api_key를 알기 위해서는 nginx의 access_log를 활용하여 알아낼 수 있다.
access_log란 nginx에서 요청이 발생할 때 요청에 대한 로그를 기록하는 파일이며 해당 로그에는 주소, 상태코드, 요청 시간 등 여러 정보를 확인 가능하다.
access_log의 위치는 nginx.conf를 통해 확인할 수 있다.
위의 그림을 통해 access_log는 /var/log/nginx/ 에 위치함을 확인하였다.
해당 파일을 확인하면 아래 그림과 같이 로그를 확인할 수 있다.
해당 로그 내에 /admin으로 접근한 로그가 있으며 API_KEY가 함께 기입되어 있다.
이를 통해 /admin에 접근 가능한 api_key를 확인하였다.
해당 api_key를 사용하여 admin페이지에 접근한 후 간단한 명령어를 실행하였다.
성공적으로 명령어가 실행됨을 확인하였다.
이제 flag가 저장되어 있는 경로로 접근하여 해당 flag파일을 실행하게 되면
flag를 획득할 수 있다.
'Hacking > DreamHack' 카테고리의 다른 글
[DreamHack] 드림핵 Apache htaccess (0) | 2024.01.20 |
---|---|
[DreamHack] 드림핵 out of money (0) | 2024.01.19 |
[DreamHack] 드림핵 XSS Filtering Bypass (2) | 2023.11.19 |
[DreamHack] 드림핵 amocafe (0) | 2023.11.17 |
[DreamHack] 드림핵 random-test (1) | 2023.11.17 |