Ce matin, le 1er septembre 2020, l’équipe de Wordfence Threat Intelligence a été alertée de la présence d’une vulnérabilité activement exploitée dans Gestionnaire de fichiers, un plugin WordPress avec plus de 700 000 installations actives. Cette vulnérabilité permettait aux utilisateurs non authentifiés d’exécuter des commandes et de télécharger des fichiers malveillants sur un site cible.

Un correctif a été publié ce matin le 1er septembre 2020. Nous constatons que cette vulnérabilité est activement exploitée dans la nature, par conséquent, nous exhortons les utilisateurs à mettre à jour vers la dernière version, 6.9, immédiatement car elle contient un correctif pour cette vulnérabilité et la conservera vous avez protégé.

Les utilisateurs de Wordfence Premium ainsi que ceux qui utilisent encore la version gratuite sont protégés contre cette campagne d’attaque par la protection intégrée de téléchargement de fichiers du pare-feu Wordfence, bien que le pare-feu Wordfence doive être optimisé afin de protéger votre site contre cette vulnérabilité.

Lors de l’analyse de la vulnérabilité, nous avons découvert qu’il était possible de contourner la protection intégrée contre le téléchargement de fichiers, nous avons donc déployé une règle de pare-feu supplémentaire pour une couverture maximale. Les clients Wordfence Premium ont reçu cette nouvelle règle de pare-feu aujourd’hui, 1er septembre 2020, à 14 h 56 UTC. Les utilisateurs gratuits de Wordfence recevront la règle après trente jours le 1er octobre 2020.

File Manager est un plugin conçu pour aider les administrateurs WordPress à gérer les fichiers sur leurs sites. Le plugin contient une bibliothèque supplémentaire, elFinder, qui est un gestionnaire de fichiers open-source conçu pour créer une interface de gestion de fichiers simple et fournit la fonctionnalité de base derrière le gestionnaire de fichiers. Le plugin File Manager a utilisé cette bibliothèque d’une manière qui a introduit une vulnérabilité.

Le cœur du problème a commencé avec le plugin File Manager renommant l’extension sur la bibliothèque elFinder connector.minimal.php.dist fichier en .php afin qu’il puisse être exécuté directement, même si le fichier de connecteur n’a pas été utilisé par le gestionnaire de fichiers lui-même. Ces bibliothèques incluent souvent des fichiers d’exemple qui ne sont pas destinés à être utilisés «tels quels» sans ajouter de contrôles d’accès, et ce fichier n’avait aucune restriction d’accès direct, ce qui signifie que n’importe qui pouvait accéder au fichier. Ce fichier pouvait être utilisé pour lancer une commande elFinder et était connecté au elFinderConnector.class.php fichier.

// run elFinder
$connector = new elFinderConnector(new elFinder($opts));
$connector->run();

Tous les paramètres envoyés dans une demande à connector.minimal.php serait traité par le run() fonction dans le elFinderConnector.class.php fichier, y compris la commande fournie dans le cmd paramètre.

   public function run()
    {
        $isPost = $this->reqMethod === 'POST';
        $src = $isPost ? array_merge($_GET, $_POST) : $_GET;
        $maxInputVars = (!$src || isset($src['targets'])) ? ini_get('max_input_vars') : null;
        if ((!$src || $maxInputVars) && $rawPostData = file_get_contents('php://input')) {
            // for max_input_vars and supports IE XDomainRequest()
            $parts = explode('&', $rawPostData);
            if (!$src || $maxInputVars < count($parts)) {
                $src = array();
                foreach ($parts as $part) {
                    list($key, $value) = array_pad(explode('=', $part), 2, '');
                    $key = rawurldecode($key);
                    if (preg_match('/^(.+?)[([^[]]*)]$/', $key, $m)) {
                        $key = $m[1];
                        $idx = $m[2];
                        if (!isset($src[$key])) {
                            $src[$key] = array();
                        }
                        if ($idx) {
                            $src[$key][$idx] = rawurldecode($value);
                        } else {
                            $src[$key][] = rawurldecode($value);
                        }
                    } else {
                        $src[$key] = rawurldecode($value);
                    }
                }
                $_POST = $this->input_filter($src);
                $_REQUEST = $this->input_filter(array_merge_recursive($src, $_REQUEST));
            }
        }

        if (isset($src['targets']) && $this->elFinder->maxTargets && count($src['targets']) > $this->elFinder->maxTargets) {
            $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_MAX_TARGTES)));
        }

        $cmd = isset($src['cmd']) ? $src['cmd'] : '';
        $args = array();

La liste des commandes disponibles dans elFinder est la suivante.

   /**
     * Commands and required arguments list
     *
     * @var array
     **/
    protected $commands = array(
        'abort' => array('id' => true),
        'archive' => array('targets' => true, 'type' => true, 'mimes' => false, 'name' => false),
        'callback' => array('node' => true, 'json' => false, 'bind' => false, 'done' => false),
        'chmod' => array('targets' => true, 'mode' => true),
        'dim' => array('target' => true, 'substitute' => false),
        'duplicate' => array('targets' => true, 'suffix' => false),
        'editor' => array('name' => true, 'method' => true, 'args' => false),
        'extract' => array('target' => true, 'mimes' => false, 'makedir' => false),
        'file' => array('target' => true, 'download' => false, 'cpath' => false, 'onetime' => false),
        'get' => array('target' => true, 'conv' => false),
        'info' => array('targets' => true, 'compare' => false),
        'ls' => array('target' => true, 'mimes' => false, 'intersect' => false),
        'mkdir' => array('target' => true, 'name' => false, 'dirs' => false),
        'mkfile' => array('target' => true, 'name' => true, 'mimes' => false),
        'netmount' => array('protocol' => true, 'host' => true, 'path' => false, 'port' => false, 'user' => false, 'pass' => false, 'alias' => false, 'options' => false),
        'open' => array('target' => false, 'tree' => false, 'init' => false, 'mimes' => false, 'compare' => false),
        'parents' => array('target' => true, 'until' => false),
        'paste' => array('dst' => true, 'targets' => true, 'cut' => false, 'mimes' => false, 'renames' => false, 'hashes' => false, 'suffix' => false),
        'put' => array('target' => true, 'content' => '', 'mimes' => false, 'encoding' => false),
        'rename' => array('target' => true, 'name' => true, 'mimes' => false, 'targets' => false, 'q' => false),
        'resize' => array('target' => true, 'width' => false, 'height' => false, 'mode' => false, 'x' => false, 'y' => false, 'degree' => false, 'quality' => false, 'bg' => false),
        'rm' => array('targets' => true),
        'search' => array('q' => true, 'mimes' => false, 'target' => false, 'type' => false),
        'size' => array('targets' => true),
        'subdirs' => array('targets' => true),
        'tmb' => array('targets' => true),
        'tree' => array('target' => true),
        'upload' => array('target' => true, 'FILES' => true, 'mimes' => false, 'html' => false, 'upload' => false, 'name' => false, 'upload_path' => false, 'chunk' => false, 'cid' => false, 'node' => false, 'renames' => false, 'hashes' => false, 'suffix' => false, 'mtime' => false, 'overwrite' => false, 'contentSaveId' => false),
        'url' => array('target' => true, 'options' => false),
        'zipdl' => array('targets' => true, 'download' => false)
    );

La bonne nouvelle est qu’elFinder a une protection intégrée contre la traversée de répertoires, de sorte qu’un attaquant ne pourrait pas utiliser l’une de ces commandes sur des fichiers en dehors du plugins/wp-file-manager/lib/files/ annuaire.

Les attaques que nous voyons dans la nature utilisent le upload commande pour télécharger des fichiers PHP contenant des webshells cachés dans une image vers le wp-content/plugins/wp-file-manager/lib/files/ annuaire.

Heureusement, Wordfence Premium et les utilisateurs gratuits ont été protégés contre la campagne ciblant cette vulnérabilité. Cependant, pour une protection optimale, nous avons créé une règle de pare-feu supplémentaire.

Pourquoi nous avons créé une règle de pare-feu supplémentaire

Alors que la protection intégrée de notre pare-feu empêchait le téléchargement direct de fichiers, nous avons déterminé qu’il était possible d’envoyer une requête spécialement conçue pour créer un fichier PHP vide en utilisant le mkfile commande dans le cmd paramètre. Un attaquant pourrait alors envoyer une demande distincte pour enregistrer le code malveillant dans ce fichier en envoyant une demande avec le cmd paramètre défini sur put. De plus, d’autres contournements peuvent être possibles, nous avons donc créé une règle de pare-feu pour bloquer complètement tout accès au connector.minimal.php fichier.

Le plugin File Manager a corrigé le problème en supprimant le lib/php/connector.minimal.php complètement à partir du plugin, et la suppression manuelle de ce fichier devrait également empêcher les attaquants d’exploiter cette vulnérabilité sans affecter les fonctionnalités normales. Ce contournement n’a pas été ciblé dans la nature.

Un petit mot de l’équipe de Wordfence

Lorsque vous utilisez des plugins utilitaires comme ce plugin de gestionnaire de fichiers, nous vous recommandons de prendre la plus grande précaution. Des plugins comme celui-ci contiennent plusieurs fonctionnalités qui, si elles sont exposées dans la zone d’administration de votre installation WordPress, pourraient causer de graves problèmes.

Un plugin de gestionnaire de fichiers comme celui-ci permettrait à un attaquant de manipuler ou de télécharger les fichiers de son choix directement à partir du tableau de bord WordPress, lui permettant potentiellement d’élever les privilèges une fois dans la zone d’administration du site. Par exemple, un attaquant pourrait accéder à la zone d’administration du site en utilisant un mot de passe compromis, puis accéder à ce plugin et télécharger un webshell pour faire une énumération plus poussée du serveur et potentiellement intensifier son attaque à l’aide d’un autre exploit.

Pour cette raison, nous vous recommandons de désinstaller les plug-ins utilitaires, comme les plug-ins de gestion de fichiers, lorsqu’ils ne sont pas utilisés, afin qu’ils ne créent pas un vecteur d’intrusion facile pour que les attaquants augmentent leurs privilèges.

Indicateurs de compromis

Le pare-feu Wordfence a bloqué plus de 450 000 tentatives d’exploitation ciblant cette vulnérabilité au cours des derniers jours. Nous voyons des attaquants tenter d’injecter des fichiers aléatoires, qui semblent tous commencer par le mot «hard» ou «x». D’après nos données d’attaque de pare-feu, il semble que les attaquants puissent rechercher la vulnérabilité avec des fichiers vides et, en cas de succès, tenter d’injecter un fichier malveillant.

Voici une liste de certains des fichiers que nous voyons téléchargés:

  • hardfork.php
  • hardfind.php
  • x.php

Veuillez rechercher ces fichiers dans le /wp-content/plugins/wp-file-manager/lib/php/files répertoire de votre site.

Les 6 principales adresses IP attaquantes que nous voyons sont les suivantes.

  • 185.222.57.183
  • 185.81.157.132
  • 185.81.157.112
  • 185.222.57.93
  • 185.81.157.177
  • 185.81.157.133

Veuillez rechercher ces adresses IP incriminées dans les fichiers journaux de votre site.

Chronologie de la réponse

1 septembre 2020 07h00 UTC – Gonzalo Cruz d’Arsys nous contacte, nous faisant savoir qu’une adresse IP incriminée 185.81.157.0 tentait de télécharger des fichiers PHP sur leurs sites en envoyant des requêtes POST à wp-file-manager/lib/php/connector.minimal.php
1 septembre 2020 11h52 UTC – Cruz a pu reproduire la vulnérabilité et nous a fourni une preuve de concept fonctionnelle.
1 septembre 2020 12h00 UTC – L’équipe Wordfence commence la journée.
1 septembre 2020 12h28 UTC – Colette Chamberland, directrice de la sécurité de l’information de Wordfence, répond à Cruz en accusant réception de son rapport et en informe l’équipe de Wordfence Threat Intelligence.
1 septembre 2020 12h33 UTC – Le gestionnaire de fichiers publie un correctif.
1 septembre 2020 12h48 UTC – L’équipe de renseignement sur les menaces de Wordfence commence à examiner le problème.
1 septembre 2020 12h58 UTC – L’équipe Wordfence Threat Intelligence vérifie le problème. Nous commençons à tester la vulnérabilité en utilisant la preuve de concept, vérifions les hits bloqués par le pare-feu Wordfence et analysons le code pour tout contournement de pare-feu.
1 septembre 2020 14:24 UTC – L’équipe Wordfence Threat Intelligence découvre un contournement.
1 septembre 2020 14h42 UTC – Une règle de pare-feu est créée pour le contournement.
1 septembre 2020 14h56 UTC – La règle de pare-feu est déployée pour les clients premium.
1 octobre 2020 – Les utilisateurs gratuits de Wordfence reçoivent une règle supplémentaire.

Conclusion

Dans l’article d’aujourd’hui, nous avons détaillé une vulnérabilité zero-day activement exploitée dans le plugin File Manager qui permet à des attaquants non authentifiés d’exécuter du code arbitraire sur un site WordPress. Cette vulnérabilité a été corrigée ce matin et nous vous recommandons vivement de mettre à jour vers la dernière version du plugin File Manager, actuellement la version 6.9, dès maintenant.

Tous les deux Wordfence Premium les utilisateurs et les sites exécutant toujours la version gratuite de Wordfence ont été protégés contre les attaques ciblant cette vulnérabilité grâce à la protection intégrée de téléchargement de fichiers du pare-feu Wordfence. Les utilisateurs de Wordfence Premium ont également reçu une règle de pare-feu supplémentaire protégeant contre tout contournement potentiel aujourd’hui, le 1er septembre 2020. Les sites utilisant toujours la version gratuite de Wordfence recevront cette règle dans 30 jours le 1er octobre 2020.

Si vous connaissez un ami ou un collègue qui utilise ce plugin sur son site, veuillez lui transmettre cet avis pour aider à protéger ses sites.

Un merci spécial à Ramuel Gall pour ses contributions à la recherche dans l’analyse de la portée et de l’impact de la vulnérabilité, ainsi que pour tester la règle de pare-feu et contribuer à ce billet de blog. Aussi, un merci spécial à Gonzalo Cruz d’Arsys pour nous avoir signalé cette vulnérabilité.


Source link