
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
Après le clone, accédez au chemin de la vulnérabilité que vous souhaitez traiter
Ici : /vulhub/python/PIL-CVE-2017-8291
Réalisez l'exercice en vous référant au fichier yml suivant
docker compose up -d : commande qui crée les conteneurs et les exécute en arrière-plan
Ensuite, accédez à localhost:8000/ et vérifiez la page web permettant le téléversement de fichiers

Téléversez le fichier poc.png falsifié situé dans le même répertoire
Après le téléversement, vous pouvez observer le résultat suivant

En fonctionnement normal, après le téléversement d'un fichier PNG, la largeur et la hauteur de l'image sont affichées. Cependant, comme le backend classe le type d'image en fonction de l'en-tête du fichier, un fichier EPS contenant des commandes exécutables peut être renommé avec l'extension PNG et téléversé, en ignorant l'extension.
Grâce à cela, lors du téléversement du fichier poc.png, l'exécution de la commande 'tocuh /tmp/aaaaa' devient possible. En remplaçant la commande contenue dans le fichier POC par une commande de reverse shell, il est possible d'obtenir un shell.
Après avoir téléversé ce fichier, connectez-vous au conteneur docker et allez dans /tmp : vous constaterez que le fichier aaaaa a été créé par la commande.
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)

Cette vulnérabilité, survenue dans la Python Imaging Library (PIL), a été exploitée dans le cadre de la CVE-2017-8291. La vulnérabilité provient du fait que PIL détermine le type d'image en se basant sur l'en-tête du fichier et non sur son extension. Ainsi, même si le fichier est en réalité au format EPS, il suffit de n'en modifier que l'extension en PNG et de le téléverser : le serveur appelle alors GhostScript, ce qui entraîne l'exécution de commandes arbitraires insérées dans le fichier.
Au cours du projet, en téléversant le fichier poc.png falsifié et en confirmant la création du fichier /tmp/aaaaa sur le serveur, nous avons reproduit le fait que cette vulnérabilité peut réellement conduire à une exécution de commandes (RCE, Remote Code Execution). De plus, nous avons constaté que cette vulnérabilité comporte la possibilité d'être étendue à des attaques avancées telles que le reverse shell, en détournant la fonctionnalité de traitement d'images prévue à l'origine.