
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
Nach dem Klonen in den Pfad der gewünschten Schwachstelle wechseln
Hier: /vulhub/python/PIL-CVE-2017-8291
Die Übung wird anhand der folgenden yml-Datei durchgeführt
docker compose up -d : Befehl zum Erstellen des Containers und Ausführen im Hintergrund
Danach localhost:8000/ aufrufen und die Webseite mit Datei-Upload-Funktion prüfen

Die manipulierte poc.png aus demselben Pfad hochladen
Nach dem Hochladen wird Folgendes angezeigt

Im Normalbetrieb würde nach dem Hochladen einer PNG-Datei die Breite und Höhe des Bildes ausgegeben werden. Da das Backend den Bildtyp jedoch anhand des Dateikopfes bestimmt, kann eine EPS-Datei mit ausführbaren Befehlen – unter Ignorieren der Dateierweiterung – in eine PNG-Datei umbenannt und hochgeladen werden.
Dadurch wird beim Hochladen der poc.png-Datei die Ausführung des Befehls 'tocuh /tmp/aaaaa' möglich; wenn der Befehl in der POC-Datei durch einen Reverse-Shell-Befehl ersetzt wird, kann eine Shell erlangt werden.
Nach dem Hochladen der Datei kann man sich in den Docker-Container begeben und in /tmp prüfen, dass die Datei aaaaa durch den Befehl erstellt wurde.
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)

Die Schwachstelle trat in der Python Imaging Library (PIL) auf und wurde unter CVE-2017-8291 behandelt. Die Schwachstelle entsteht dadurch, dass PIL den Bildtyp anhand des Dateikopfes und nicht anhand der Dateierweiterung bestimmt. Dadurch kann eine tatsächliche EPS-Datei, deren Erweiterung lediglich in PNG geändert wurde, hochgeladen werden; der Server ruft dabei GhostScript auf, wodurch in der Datei eingebettete beliebige Befehle ausgeführt werden können.
Im Projektverlauf wurde die manipulierte poc.png-Datei hochgeladen und die Erstellung der Datei /tmp/aaaaa im Server bestätigt. Damit wurde reproduziert, dass die Schwachstelle tatsächlich zu einer Befehlsausführung (RCE, Remote Code Execution) führen kann. Darüber hinaus zeigt sich, dass die Schwachstelle die ursprünglich vorgesehene Bildverarbeitungsfunktion ausnutzen und zu fortgeschrittenen Angriffen wie einer Reverse Shell ausgebaut werden kann.