Vulnérabilité dans OpenSMTPD qui permet l'exécution de code à distance avec les privilèges root

Dans le serveur de messagerie développé par le projet OpenBSD OuvrirSMTPD identifié vulnérabilité critique (CVE-2020-7247), qui vous permet d'exécuter à distance des commandes shell sur le serveur avec les droits d'utilisateur root. La vulnérabilité a été identifiée lors d'un ré-audit réalisé par Qualys Security (précédent audit OpenSMTPD a été effectuée en 2015, et la nouvelle vulnérabilité est présente depuis mai 2018). Problème éliminé dans la version OpenSMTPD 6.6.2. Il est recommandé à tous les utilisateurs d'installer immédiatement la mise à jour (pour OpenBSD, le correctif peut être installé via syspatch).

Deux options d'attaque sont proposées. La première option fonctionne dans la configuration OpenSMTPD par défaut (en acceptant uniquement les requêtes de localhost) et vous permet d'exploiter le problème localement, lorsque l'attaquant est capable d'accéder à l'interface réseau locale (bouclage) sur le serveur (par exemple, sur les systèmes d'hébergement) . La deuxième option se produit lorsque OpenSMTPD est configuré pour recevoir des requêtes réseau externes (un serveur de messagerie qui accepte le courrier tiers). Les chercheurs ont préparé un prototype d'exploit qui fonctionne avec succès à la fois avec la version OpenSMTPD incluse dans OpenBSD 6.6 et avec une version portable pour d'autres systèmes d'exploitation (réalisés dans le cadre des tests Debian).

Le problème est dû à une erreur dans la fonction smtp_mailaddr(), qui est appelée pour vérifier l'exactitude des valeurs dans les champs « MAIL FROM » et « RCPT TO » qui définissent l'expéditeur/destinataire et sont transmises lors de la connexion. avec le serveur de messagerie. Pour vérifier la partie de l'adresse email qui précède le symbole « @ », la fonction smtp_mailaddr() est appelée
valid_localpart(), qui accepte (MAILADDR_ALLOWED) les caractères "!#$%&'*/?^`{|}~+-=_", comme l'exige la RFC 5322.

Dans ce cas, l'échappement direct de la chaîne est effectué dans la fonction mda_expand_token(), qui remplace uniquement les caractères « !#$%&’*?`{|}~ » (MAILADDR_ESCAPE). Par la suite, la ligne préparée dans mda_expand_token() est utilisée lors de l'appel de l'agent de livraison (MDA) à l'aide de la commande 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' . En cas de placement de lettres dans mbox via /bin/sh, la ligne « /usr/libexec/mail.local -f %%{mbox.from} %%{user.username} » est lancée, où la valeur « % {mbox.from} » inclut les données échappées du paramètre « MAIL FROM ».

L'essence de la vulnérabilité est que smtp_mailaddr() a une erreur logique, à cause de laquelle, si un domaine vide est envoyé par courrier électronique, la fonction renvoie un code de vérification réussi, même si la partie de l'adresse avant « @ » contient des caractères invalides. . De plus, lors de la préparation d'une chaîne, la fonction mda_expand_token() n'échappe pas à tous les caractères spéciaux possibles du shell, mais uniquement aux caractères spéciaux autorisés dans l'adresse e-mail. Ainsi, pour exécuter votre commande, il suffit d'utiliser le symbole « ; » dans la partie locale de l'email. et l'espace, qui ne sont pas inclus dans l'ensemble MAILADDR_ESCAPE et ne sont pas échappés. Par exemple:

$nc 127.0.0.1 25

HELO professeur.falken
MAIL DE :
RCPT À :
DONNEES
.
QUITTER

Après cette session, OpenSMTPD, une fois livré à mbox, lancera la commande via le shell

/usr/libexec/mail.local -f ;sommeil 66; racine

Dans le même temps, les possibilités d'attaque sont limitées par le fait que la partie locale de l'adresse ne peut pas dépasser 64 caractères et que les caractères spéciaux « $ » et « | » sont remplacés par « : » lors de l'échappement. Pour contourner cette limitation, nous utilisons le fait que le corps de la lettre est transmis après avoir exécuté /usr/libexec/mail.local via le flux d'entrée, c'est-à-dire En manipulant l'adresse, vous pouvez uniquement lancer l'interpréteur de commandes sh et utiliser le corps de la lettre comme ensemble d'instructions. Les en-têtes SMTP du service étant indiqués au début de la lettre, il est suggéré d'utiliser la commande read en boucle pour les ignorer. Un exploit fonctionnel ressemble à ceci :

$nc 192.168.56.143 25

HELO professeur.falken
MAIL FROM :
RCPT À :[email protected]>
DONNEES
#0
#1
...
#d
pour je dans W O P R ; faire
echo -n "($i) " && identifiant || casser
done > /root/x."`id -u`.""$$"
.
QUITTER

Source: opennet.ru

Ajouter un commentaire