
Bildungs-PoC für CVE-2017-8291 (GhostButt), das die Fernausführung von Befehlen über die EPS-Bildverarbeitung von Python PIL/Pillow mit Umgehung der GhostScript-Sandbox demonstriert.
Chinesische Version (Chinese version)
Python PIL (Pillow) ist eine beliebte Bildverarbeitungsbibliothek für Python. Sie unterstützt verschiedene Bildformate und bietet leistungsstarke Bildbearbeitungsfunktionen.
Das Python-Bildverarbeitungsmodul PIL (Pillow) ist von der GhostButt-Sicherheitslücke (CVE-2017-8291) betroffen, da es intern GhostScript zur Verarbeitung von EPS-Bildern aufruft. Diese Schwachstelle ermöglicht es Angreifern, beliebige Befehle auf dem Zielsystem auszuführen.
Wenn PIL ein Bild verarbeitet, bestimmt es den Bildtyp anhand des Dateikopfes (Magic Bytes). Handelt es sich um eine EPS-Datei (Kopf beginnt mit %!PS), wird die Datei an PIL/EpsImagePlugin.py zur Verarbeitung übergeben.
In diesem Modul ruft PIL den systemeigenen GhostScript-Befehl (gs) auf, um die Bilddatei zu verarbeiten:
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)
Obwohl das Flag -dSAFER gesetzt ist (Safe Mode), ermöglicht eine Sandbox-Umgehungslücke in GhostScript (GhostButt CVE-2017-8291) die Umgehung dieser Sicherheitsmaßnahme, was die Ausführung beliebiger Befehle erlaubt.
Zum Zeitpunkt dieses Schreibens ist selbst die neueste offizielle GhostScript-Version 9.21 noch von dieser Sicherheitslücke betroffen. Daher ist PIL solang anfällig für Befehlseinschleusung, wie GhostScript auf dem Betriebssystem installiert ist.
Referenzen:
Führen Sie den folgenden Befehl aus, um eine Webanwendung zu starten, die anfällig für die CVE-2017-8291-Sicherheitslücke ist:
docker compose up -d
Nach dem Start besuchen Sie http://your-ip:8000/, um zur Upload-Seite zu gelangen.
Die normale Funktionalität dieser Anwendung erlaubt es Benutzern, eine PNG-Datei hochzuladen. Das Backend verwendet PIL, um das Bild zu laden und seine Abmessungen auszugeben. Wir können dies jedoch ausnutzen, indem wir die Erweiterung einer ausführbaren EPS-Datei in PNG ändern und sie hochladen. Da das Backend den Bildtyp anhand des Dateikopfes und nicht der Erweiterung bestimmt, kann die Dateierweiterungsprüfung umgangen werden.
Beispielsweise können wir poc.png hochladen, das auf dem Server den Befehl touch /tmp/aaaaa ausführt. Indem wir den Befehl im POC in einen Reverse-Shell-Befehl ändern, können wir Shell-Zugriff auf den Server erhalten:
