
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginsudo 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
Dopo il clone, entra nel percorso della vulnerabilità che intendi sfruttare
Qui: /vulhub/python/PIL-CVE-2017-8291
Procedi con l'esercitazione facendo riferimento al seguente file yml
docker compose up -d: comando per creare il container ed eseguirlo in background
Successivamente, accedi a localhost:8000/ e verifica la pagina web che consente il caricamento dei file

Carica il file poc.png manipolato presente nello stesso percorso
Una volta completato il caricamento, si può notare che appare quanto segue

In condizioni normali, dopo il caricamento di un file PNG vengono stampate le dimensioni (larghezza e altezza) dell'immagine, ma poiché il backend classifica il tipo di immagine tramite l'header del file, ignorando l'estensione, è possibile rinominare un file EPS contenente comandi eseguibili con estensione PNG e caricarlo.
Sfruttando questo, caricando il file poc.png sarà possibile eseguire il comando 'tocuh /tmp/aaaaa'; se si sostituisce il comando all'interno del file POC con un comando di reverse shell, è possibile ottenere una shell.
Dopo aver caricato il file, accedendo al container docker e andando in /tmp, è possibile verificare che il file aaaaa è stato creato dal comando.
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)

La vulnerabilità in questione si manifesta in Python Imaging Library (PIL) ed è stata analizzata in riferimento a CVE-2017-8291. La vulnerabilità si verifica perché PIL determina il tipo di immagine basandosi sull'header del file e non sull'estensione. Di conseguenza, caricando un file che in realtà è in formato EPS semplicemente rinominandolo con estensione PNG, il server chiama GhostScript e si è potuto constatare che è possibile eseguire comandi arbitrari inseriti nel file.
Durante lo svolgimento del progetto, caricando il file poc.png manipolato e verificando la creazione del file /tmp/aaaaa all'interno del server, è stato riprodotto che la vulnerabilità può effettivamente condurre all'esecuzione di comandi (RCE, Remote Code Execution). Inoltre, è stato possibile constatare che questa vulnerabilità può essere estesa ad attacchi avanzati come la reverse shell, sfruttando la funzionalità di elaborazione delle immagini originariamente prevista.