
CVE-2017-8291 CTF mit docker und Beispielen
Das PIL-Modul (Pillow) zur Bildverarbeitung in Python ist von der GhostButt-Schwachstelle (CVE-2017-8291) betroffen, da es intern GhostScript aufruft, was zu einer Schwachstelle zur Remote-Codeausführung führt.
PIL bestimmt intern den Bildtyp anhand des Bild-Headers (Magic Bytes). Wenn festgestellt wird, dass es sich um eine EPS-Datei handelt (der Header ist %!PS), wird sie an PIL/EpsImagePlugin.py zur Verarbeitung übergeben.
In diesem Modul ruft PIL den systemeigenen gs-Befehl, also GhostScript, auf, um Bilddateien 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
]
# Omit the code to determine whether GhostScript is installed
try:
with open(os.devnull, 'w+b') as devnull:
subprocess.check_call(command, stdin=devnull, stdout=devnull)
im = Image.open(outfile)
Obwohl -dSAFER, also der sichere Modus, gesetzt ist, wird dieser sichere Modus aufgrund einer Sandbox-Bypass-Schwachstelle in GhostScript (GhostButt CVE-2017-8291) umgangen und beliebige Befehle können ausgeführt werden.
Darüber hinaus ist auch die derzeit neueste offizielle Version von GhostScript 9.21 noch von dieser Schwachstelle betroffen, sodass man sagen kann, dass unser PIL, solange GhostScript auf dem Betriebssystem installiert ist, eine Schwachstelle zur Befehlsausführung aufweist.
Betriebsumgebung:
docker-compose up -d
Nach dem Ausführen besuchen Sie http://your-ip:8000/, um eine Upload-Seite zu sehen. Die normale Funktion besteht darin, dass wir eine PNG-Datei hochladen, das Backend PIL aufruft, um das Bild zu laden, und die Länge und Breite ausgibt. Wir können jedoch die ausführbare Befehls-EPS-Dateiendung in PNG für den Upload ändern, da das Backend den Bildtyp anhand des Datei-Headers bestimmt, sodass die Endungsprüfung ignoriert wird.
Wenn wir beispielsweise poc.png hochladen, können wir touch /tmp/youhavebeenpwned ausführen. Ändern Sie den Befehl im POC in einen Reverse-Shell-Befehl, um eine Shell zu erhalten: