
CVE-2017-8291 (PIL/GhostScript RCE)를 시연하는 교육용 실습 환경으로, PNG 확장자를 가진 조작된 EPS 파일 업로드, Docker 설정 및 PoC 실행을 포함합니다.
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin를 통해 V2로 업그레이드sudo apt remove docker docker-engine docker.io containerd runc -ysudo apt updatesudo apt install -y ca-certificates curl gnupg lsb-releasesudo mkdir -p /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpgecho "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullsudo apt updatesudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugindocker compose versiongit clone https://github.com/vulhub/vulhub.git
clone 후 진행하고자 하는 취약점 경로로 진입
여기선 /vulhub/python/PIL-CVE-2017-8291
다음과 같은 yml 파일을 참고하여 실습 진행
docker compose up -d : 컨테이너를 생성하고 백그라운드에서 진행하는 명령
그 후 localhost:8000/ 에 접속하여 파일 업로드 가능한 웹 페이지를 확인

동일한 경로에 있는 조작된 poc.png 업로드 진행
업로드를 진행하면 다음과 같이 뜨는 것을 확인할 수 있음

정상 기능이라면 png 파일 업로드 후 이미지의 가로, 세로 길이를 출력, 하지만 백엔드는 파일 헤더를 통해 이미지 유형을 분류하기 때문에, 확장자를 무시하고 실행 가능한 명령이 포함된 EPS 파일은 PNG 확장자로 변경하여 업로드 할 수 있음
이를 이용하면 poc.png 파일을 업로드할 때 'tocuh /tmp/aaaaa' 명령 실행이 가능해질 것이고 POC 파일 내의 명령을 리버스 쉘 명령으로 변경하면 쉘 획득이 가능
해당 파일을 업로드한 후, docker에 접속하여 /tmp에 가보면 명령어에 의해 aaaaa파일이 생성된 것을 확인 가
command = ["gs",
"-q", # 조용한 모드(출력 최소화)
"-g%dx%d" % size, # 출력 이미지 크기 설정 (픽셀 단위)
"-r%fx%f" % res, # 입력 이미지 해상도(DPI) 설정
"-dBATCH", # 작업 완료 후 자동 종료
"-dNOPAUSE", # 페이지 간 일시 정지 없이 연속 실행
"-dSAFER", # 안전 모드 활성화
"-sDEVICE=ppmraw", # 출력 디바이스를 ppmraw로 설정
"-sOutputFile=%s" % outfile, # 출력 파일 경로 지정
"-c", "%d %d translate" % (-bbox[0], -bbox[1]),
# 이미지 원점을 보정 (이동)
"-f", infile, # 입력 파일 지정
]
try:
with open(os.devnull, 'w+b') as devnull:
subprocess.check_call(command, stdin=devnull, stdout=devnull)
im = Image.open(outfile)

해당 취약점은 Python Imaging Library(PIL)에서 발생한 취약점으로 CVE-2017-8291을 대상으로 진행되었다. 취약점은 PIL이 파일 확장자가 아닌 파일 헤더를 기반으로 이미지 유형을 판별하는 특성 때문에 발생하며, 이를 통해 실제로는 EPS 포맷 파일임에도 불구하고 확장자만 PNG로 변경하여 업로드 하면, 서버 측에서 GhostScript를 호출하면서 파일 내에 삽입된 임의 명령어가 실행될 수 있는 문제를 확인할 수 있었다.
프로젝트 과정에서 조작된 poc.png 파일을 업로드하여 서버 내부의 /tmp/aaaaa 파일 생성을 확인 함으로써, 취약점이 실제로 명령어 실행(RCE, Remote Code Execution)으로 이어질 수 있음을 재현하였다. 또한, 해당 ㅊ ㅟ약점은 원래 의도된 이미지 처리 기능을 악용해 리버스 쉘과 같은 고급 공격으로 확장될 수 있는 가능성을 내포하고 있는 것을 확인할 수 있다.