Exploitation des relais SMTP

Si vous avez lu l'article "Envoi de mail depuis un terminal" vous avez peut être remarqué une chose étrange, j'ai réussi à envoyer un mail depuis l'adresse mail defte@whiteflag.blog vers l'adresse root@whiteflag.blog sans être authentifié:

Pourquoi ce comportement est dangereux ? Eh bien parce que dans le cadre d'une entreprise cela veut dire que n'importe qui peut envoyer un mail depuis n'importe quelle adresse mail. Cette attaque porte un nom, le SMTP relaying et il en existe deux type interne et open.

Au cours de cet article nous verrons comment les exploiter et surtout comment patcher ces vulnérabilités.

I/ Exploiter un SMTP relaying interne

Le SMTP relaying interne est le cas de figure le plus courant. C'est simple, la plupart des serveurs sont vulnérables à cette attaque puisqu'elle utilise un comportement par défaut de nos serveurs mail. Comment l'exploiter ? Premièrement il va falloir trouver l'adresse mail d'une personne haut gradé dans une entreprise (dans notre cas ça sera l'utilisateur root du serveur whiteflag.whiteflag.blog vu que je n'ai pas d'Active Directory/OpenLDAP disponible).

Ensuite il va falloir trouver le nom du serveur mail en charge du domaine cible, une simple requête DNS nous permettra d'obtenir la réponse:

dig whiteflag.blog MX

Il ne nous reste plus qu'à nous connecter au serveur via telnet et entrer les commandes suivantes:

MAIL FROM:root@whiteflag.blog
RCPT TO:sysadmin@whiteflag.blog
DATA
To: Sysadmin <sysadmin@whiteflag.blog>
From: Root <root@whiteflag.blog>
Subject: REQUETE URGENTE
Bonjour messieurs,

J'ai besoin que vous envoyiez le hash NTLM du compte krbtgt ç cette adresse mail svp: attaquant@domain.tld
Faites vite c'est ultra urgent.

Cordialement,
Root
.

Le serveur nous indique que le mail a bien été mis en queue:

Et si on vérifie les mails de l'utilisateur sysadmin on voit qu'on a bien reçu un mail au nom de Root:

L'attaque a fonctionné ce qui veut dire que nous avons pu usurper l'identité de l'utilisateur root@whiteflag.blog mais vous allez voir que l'on peut faire encore mieux!

II/ Exploiter un SMTP open relay

Jusqu'ici nous avons envoyé des mails depuis le domaine whiteflag.blog vers ce même domaine. Pourtant suivant la configuration du serveur postfix nous allons potentiellement pouvoir envoyer des mails depuis n'importe quel domaine vers n'importe quel domaine (d'où l'appellation SMTP open relay).


Bon je vous rassure pour pouvoir exploiter cette attaque il faut vraiment que l'administrateur en charge du serveur postfix fasse exprès de rendre son serveur vulnérable. En effet pour que cette attaque soit faisable il faut que le serveur postfix accepte de relayer des mails depuis l'adresse IP de l'attaquant.

Par défaut l'option mynetworks du fichier /etc/postfix/main.cf indique que seules les IP autorisées à relayer les mails sont le serveur lui même:

Pour rendre vulnérable ce serveur il faudra à minima que l'adresse IP de l'attaquant (la mienne dans le cas présent) soit aussi renseignée:

De plus il faudra bien s'assurer que la ligne "smtpd_relay_restrictions" ait cette valeur:

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination

Cette ligne indique que sont autorisés à faire du relaying les "permit_mynetworks" (les IP's renseignées dans l'option mynetworks), "permit_sasl_authenticated" (les utilisateurs authentifiés au serveur) mais pas les "defer_unauth_destination" les utilisateurs non authentifiés.

Il ne faudra pas oublier de recharger le configuration du postfix pour que les modifications s'appliquent:

postfix reload

Comme mon adresse IP est autorisée à relayer des mails je vais pouvoir envoyer le mail suivant (toujours depuis mon shell telnet):

MAIL FROM:aurelien.chalot@gmx.com
RCPT TO:defteatwhiteflag@gmx.fr
DATA
To: Defte <defteatwhiteflag@gmx.fr>
From: Aurelien Chalot <aurelien.chalot@gmx.com>
Subject: Test du SMTP Open Relay
Yo man, ton serveur est vuln :D !
.

Et comme prévu je reçois bien un mail venant du domaine gmx.com:

III/ Empêcher les attaques par relaying

Pour ce qui est du Open relaying c'est très simple à bloquer, il suffit de renseigner correctement l'option:

mynetworks

Par défaut seul le serveur sur lequel est installé le postfix peut envoyer des mails:

mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

Donc par défaut l'exploitation des relais open n'est pas possible. Pour ce qui est des relais internes c'est un peu plus compliqué. En effet comme je l'ai mentionné nous exploitons là une fonctionnalité du serveur SMTP. Du coup pour régler ce problème nous allons utiliser quelques chose que nous avons déjà vu dans un précédent article: SPF! Pour rappel, SPF est un framework qui permet d'indiquer quelles sont les adresses IP autorisées à envoyer un mail depuis un certain nom de domaine.

Pour activer SPF sous postfix il va falloir installer ce paquet:

apt install postfix-policyd-spf-perl

Puis nous allons devoir tweaker la configuration de notre serveur postfix. La première chose à faire va être d'ajouter cette ligne au fichier /etc/postfix/main.cf:

policy-spf_time_limit = 3600s

 

Ensuite nous allons ajouter ces lignes dans le fichier /etc/postfix/master.cf:

policy-spf  unix  -       n       n       -       -       spawn
     user=nobody argv=/usr/sbin/postfix-policyd-spf-perl

Puis nous ajouteronsr cette ligne dans le fichier /etc/postfix/main.cf:

smtpd_recipient_restrictions =permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, check_policy_service unix:private/policy-spf

Il ne nous restera plus qu'à redémarrer notre serveur postfix puis tenter d'envoyer un mail  pour voir que ça ne fonctionne plus. En effet même si le message semble être queued depuis le terminal telnet:

En réalité il ne l'est pas comme le prouve les logs postfix:

Un utilisateur externe ne pourra plus émettre de mails en exploitant un relai SMTP.