Un chercheur en sécurité a enchaîné une paire de vulnérabilités dans la plate-forme d’hébergement Web populaire Control Web Panel (CWP) pour obtenir une exécution de commande à distance pré-authentifiée (RCE) en tant que root.

Paulos Yibelo a atteint RCE en utilisant une charge utile d’inclusion de fichier alimentée par un octet nul afin d’ajouter une clé API malveillante, en exploitant cette clé API pour écrire dans un fichier, puis en incluant ce fichier en abusant du bogue d’inclusion de fichier.

CWP, un panneau de contrôle Linux gratuit anciennement connu sous le nom de CentOS Web Panel, est utilisé activement par plus de 200 000 serveurs, selon Yibelo.

Contournement de stristr()

La première découverte clé du chercheur a été de savoir comment deux pages PHP non authentifiées, /user/loader.php et /user/index.php, ont déployé une protection d’inclusion de fichiers locaux (LFI) qui, lorsque le paramètre ‘scripts’ contenait ‘..’, bloquait le traitement. de l’entrée et affichait à la place « tentative de piratage » à l’utilisateur.

Cette sortie, de la GETSecurity() fonction, contenue strstr(). Yibelo a décidé de contourner strstr()qui recherche la première occurrence d’une chaîne dans une autre chaîne.

Il a d’abord cherché à tromper PHP pour qu’il traite les caractères autres que les points comme ‘.’, mais cela a échoué sur le fait que PHP ne normalise aucun de ses caractères en points.

Puis le chercheur a eu l’idée de contourner strstr()une alternative insensible à la casse à strstr()en trouvant des caractères uniques que le langage C, dans lequel PHP est écrit, traite comme un point lorsqu’il est en minuscule.

Cet itinéraire « n’a donné aucun résultat utile, mais nous avons trouvé des comportements bizarres et bizarres dignes de futurs messages », lit un article de blog publié par Yibelo pour Octagon Networks, une équipe de chercheurs qu’il a récemment cofondée.

Joindre les points

Faire croire à PHP qu’aucun point consécutif (..) n’était présent s’est avéré fructueux, cependant, avec le fuzzing faisant apparaître un contournement – /.%00./ – pour la vérification LFI (CVE-2021-45467).

« Plus [of] Les fonctions de PHP dans CWP (y compris le exiger() et inclure() fonctions) semblent traiter /.%00./ comme /../ – de la même manière, tandis que strstr() ignore les octets nuls, il compte toujours sa taille afin de contourner la vérification », a-t-il expliqué.

Le bogue d’inclusion de fichier signifiait qu’il pouvait envoyer une requête qui forçait le serveur à enregistrer n’importe quelle clé API qu’il voulait, lui permettant d’écrire dans des fichiers .txt. (CVE-2021-45466).

La chaîne RCE résultante est visualisée dans cette vidéo YouTube.

Correctifs

Yibelo a contourné un correctif initial pour le bogue d’inclusion de fichier, qui tentait de détecter si un octet nul était pris en sandwich entre des points, en ajoutant simplement d’autres octets nuls.

Le chercheur a déclaré que certains serveurs semblaient avoir été exploités via des inversions de ce patch.

Yibelo a dit La gorgée quotidienne que les mainteneurs du CWP deployé un autre patch « dans leur dernière version avec une meilleure façon de trouver et de supprimer les octets nuls : $texte = str_replace(chr(0),  », $texte);.”

Les responsables du CWP ont dit La gorgée quotidienne: « Cela a été corrigé dans certaines anciennes versions il y a quelques mois, mais nous l’avons récemment amélioré dans la version 0.9.8.1022 pour supprimer ces fichiers car ils sont anciens et n’ont pas été utilisés depuis plus de deux ans.

« Comme toujours, les mises à jour automatiques résolvent tous les problèmes, donc la mise à jour du serveur sera entièrement résolue. »

Ils ont ajouté que « CWP ne fonctionne que pendant six mois sans mise à jour, et cela nous permet de désactiver CWP sur les serveurs non mis à jour pendant six mois afin qu’ils ne soient pas compromis ».

Problèmes de réplication ont été signalés sur Reddit. Yibelo a déclaré que, jusqu’à présent, les problèmes de sécurité semblent être spécifiques au CWP.

Le chercheur a déclaré qu’il publierait une preuve de concept complète « une fois que suffisamment de serveurs auront migré vers la dernière version ».