Erreichung der Codeausführung bei Kontrolle über den Kommentartext im Python-Skript.

Ein Teilnehmer des Wettbewerbs UIUCTF 2025 hat detailliert beschrieben, wie es ihm gelungen ist, eine Aufgabe zu erfüllen, die die Ausführung seines Codes auf einem Server erforderte, wobei er nur die Möglichkeit hatte, den Inhalt eines Kommentars im Code zu ändern.

Die Teilnehmer konnten eine Netzwerkanfrage an ein Python-Skript senden, das ein neues Python-Skript mit einem zufälligen Namen erstellte, die vom Benutzer übermittelten Daten in den Kommentartext einfügte, die Zeichen «\n» und «\r» entfernte und dieses Skript mit dem Befehl «python3 name.py» ausführte. Nur durch die Kontrolle des Inhalts des Kommentars musste der Teilnehmer eine Zeile aus der Datei «/home/ctfuser/flag» extrahieren. Das Skript wurde mit folgendem Code erstellt: comment = input(«> «).replace(«\n», «»).replace(«\r», «») code = f»»»print(«hello world!») # Dies ist ein Kommentar. Hier ist ein weiterer: # {comment} print(«Danke, dass Sie mitgemacht haben!»)»»»

Statt «{comment}» wurden die vom Teilnehmer übermittelten Daten eingesetzt, und schließlich wurde folgender Code ausgeführt: print(«hello world!») # Dies ist ein Kommentar. Hier ist ein weiterer: # Die Daten, die vom Teilnehmer des Wettbewerbs eingegangen sind print(«Danke, dass Sie mitgemacht haben!»)

Die Aufgabe wurde auf der Grundlage einer Schwachstelle im CPython-Parser erstellt, der Zeichen mit dem Null-Code als Zeilenende behandelte (diese Schwachstelle konnte beispielsweise ausgenutzt werden, um schädliche Aktionen im Text eines Kommentars zu verbergen). Das Problem wurde in den Versionen CPython 3.12.0 und 3.11.4 behoben. In dem beim Wettbewerb verwendeten Parser wurden nur die Zeichen "\n" und "\r" entfernt, aber bei Verwendung der verwundbaren CPython-Version konnte der Teilnehmer das Zeichen "\0" als Trennzeichen verwenden. Dieser Trick funktionierte jedoch nicht, da im Wettbewerb bereits eine korrigierte Version von CPython verwendet wurde, in der angenommen wurde, dass im Parser möglicherweise ähnliche Fehler vorhanden sind und die Teilnehmer diese aufdecken können.

Der erfolgreiche Teilnehmer suchte nicht nach neuen Schwachstellen im Parser, die es ihm ermöglicht hätten, die Zeile in Teile zu zerlegen. Stattdessen nutzte er die Besonderheiten der Ausführung von Python-Dateien entsprechend ihrem Inhalt. Zum Beispiel kann anstelle des Quellcodes eine Datei mit der Erweiterung „.py“ den vorab kompilierten Bytecode enthalten, der in Dateien mit der Erweiterung „.pyc“ gespeichert wird, und diese Datei wird ausgeführt. In dem betrachteten Wettbewerb konnte der Teilnehmer nur den Inhalt in der Mitte der Datei steuern, weshalb er keinen eigenen Header hinzufügen konnte, um den MIME-Typ zu manipulieren.

Das Problem konnte gelöst werden, indem man die Möglichkeit nutzte, dass Python ab Version 2.6 den Inhalt von ZIP-Archiven für die Bereitstellung von Python-Paketen in komprimierter Form ausführen kann. Wie beim Bytecode-Cache wird das Vorhandensein eines ZIP-Archivs durch den Inhalt und nicht durch die Dateierweiterung bestimmt; das heißt, in eine "datei.py" kann ein ZIP-Archiv eingefügt werden, und beim Ausführen des Befehls "python datei.py" wird es als komprimiertes Python-Paket behandelt. Dabei werden ZIP-Archive in Python nicht durch den Header zu Beginn der Datei indiziert, sondern durch den EOCD-Bereich (End of Central Directory Record) am Ende der Datei. Wenn im Archiv eine Datei "__main__.py" vorhanden ist, wird diese Datei automatisch ausgeführt, wenn das Archiv direkt mit dem Befehl "python archiv" gestartet wird.

Die Wettbewerbsaufgabe wurde durch die Generierung eines ähnlichen ZIP-Archivs gelöst und dessen Einfügung in den Kommentartext. Um die Struktur der Datei korrekt zu erhalten, wurde angesichts des Vorhandenseins des Aufrufs 'print("Thanks for playing!")' am Ende der ursprünglichen Datei die EOCD-Sektion verwendet, die den Kommentarbereich am Ende des Archivs enthält.

Erreichung der Codeausführung bei Kontrolle über den Kommentartext im Python-Skript.
Erreichung der Codeausführung bei Kontrolle über den Kommentartext im Python-Skript.


Quelle: opennet.ru
Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster