
Laboratoire basé sur Docker démontrant l'exploitation de CVE-2017-8291 (GhostButt) via le traitement d'images EPS avec Python PIL/Pillow, avec une application web vulnérable et un exploit de preuve de concept.
Python PIL (Pillow) est une bibliothèque de traitement d'images populaire pour Python. Elle supporte divers formats d'image et offre des capacités puissantes de manipulation d'images.
Le module de traitement d'images Python PIL (Pillow) est affecté par la vulnérabilité GhostButt (CVE-2017-8291) car il appelle en interne GhostScript pour traiter les images EPS. Cette vulnérabilité permet aux attaquants d'exécuter des commandes arbitraires sur le système cible.
Lorsque PIL traite une image, il détermine le type d'image en fonction de l'en-tête du fichier (Magic Bytes). S'il identifie un fichier EPS (en-tête commençant par %!PS), il transmet le fichier à PIL/EpsImagePlugin.py pour traitement.
Dans ce module, PIL appelle la commande GhostScript du système (gs) pour traiter le fichier image :
command = ["gs",
"-q", # quiet mode
"-g%dx%d" % size, # set output geometry (pixels)
"-r%fx%f" % res, # set input DPI (dots per inch)
"-dBATCH", # exit after processing
"-dNOPAUSE", # don't pause between pages,
"-dSAFER", # safe mode
"-sDEVICE=ppmraw", # ppm driver
"-sOutputFile=%s" % outfile, # output file
"-c", "%d %d translate" % (-bbox[0], -bbox[1]),
# adjust for image origin
"-f", infile, # input file
]
# Code to check if GhostScript is installed is omitted
try:
with open(os.devnull, 'w+b') as devnull:
subprocess.check_call(command, stdin=devnull, stdout=devnull)
im = Image.open(outfile)
Bien que le drapeau -dSAFER soit défini (mode sécurisé), une vulnérabilité de contournement du sandbox dans GhostScript (GhostButt CVE-2017-8291) permet de contourner ce mécanisme de sécurité, permettant l'exécution de commandes arbitraires.
À l'heure actuelle, même la dernière version officielle de GhostScript 9.21 est encore affectée par cette vulnérabilité. Par conséquent, tant que GhostScript est installé sur le système d'exploitation, PIL est vulnérable à l'exécution de commandes.
Références :
Exécutez la commande suivante pour lancer une application web vulnérable à la faille CVE-2017-8291 :
docker compose up -d
Après le démarrage, visitez http://your-ip:8000/ pour accéder à la page de téléchargement.
La fonctionnalité normale de cette application permet aux utilisateurs de télécharger un fichier PNG. Le backend utilise PIL pour charger l'image et afficher ses dimensions. Cependant, nous pouvons exploiter cette fonctionnalité en changeant l'extension d'un fichier EPS exécutable en PNG et en le téléchargeant. Comme le backend détermine le type d'image en fonction de l'en-tête du fichier plutôt que de l'extension, la vérification de l'extension de fichier peut être contournée.
Par exemple, nous pouvons télécharger poc.png, qui exécutera la commande touch /tmp/aaaaa sur le serveur. En modifiant la commande dans le POC pour une commande de shell inversé, nous pouvons obtenir un accès shell au serveur :
