SMTP – Simple Mail Transfer Protocol
🧠 Introduction
Le Simple Mail Transfer Protocol (SMTP) est le protocole standard pour l’envoi d’emails dans un réseau IP. Il permet à la fois :
La transmission de courriels d’un client de messagerie (MUA) vers un serveur SMTP (MSA/MTA).
Le relai des courriels entre plusieurs serveurs SMTP (MTA à MTA).
Il fonctionne selon un modèle client-serveur, et est souvent complété par POP3 ou IMAP pour la réception.
🔌 Ports et Connexions
Par défaut, SMTP écoute sur le port TCP 25. Cependant :
Port 587 (SMTP-Auth) : utilisé pour les clients authentifiés (avec STARTTLS).
Port 465 : utilisé pour SMTP sur SSL/TLS (ancien standard).
Exemple de séquence :
Client (MUA) → MSA → MTA → MDA → Boîte aux lettres
🔐 Sécurité
SMTP transmet les données en texte clair. Il est donc recommandé de l’utiliser avec :
STARTTLS : commande envoyée après EHLO pour chiffrer la session.
SSL/TLS : connexion sécurisée dès le départ (port 465).
AUTH PLAIN : permet l’authentification une fois la session sécurisée.
Des mécanismes comme SPF, DKIM et DMARC permettent de protéger les serveurs contre l’usurpation et le spam.
🛠️ Composants SMTP
MUA
Mail User Agent : Client utilisateur (Thunderbird, Outlook, etc.)
MSA
Mail Submission Agent : Authentifie et valide les mails
MTA
Mail Transfer Agent : Relai des mails entre serveurs SMTP
MDA
Mail Delivery Agent : Stocke le mail dans la boîte du destinataire
🗂️ Configuration par défaut
Extrait typique de configuration Postfix (/etc/postfix/main.cf
) :
smtpd_banner = ESMTP Server
myhostname = mail1.inlanefreight.htb
mydestination = $myhostname, localhost
mynetworks = 127.0.0.0/8 10.129.0.0/16
smtp_bind_address = 0.0.0.0
inet_protocols = ipv4
home_mailbox = /home/postfix
Paramètres importants :
mynetworks
: détermine quelles IP sont autorisées à utiliser le serveur.smtp_tls_session_cache_database
: active le cache TLS.smtp_bind_address
: adresse d’écoute du serveur.smtpd_helo_restrictions
: filtre les noms HELO/EHLO invalides.
✉️ Commandes SMTP
HELO
/ EHLO
Initie la session avec le nom d’hôte du client
MAIL FROM
Définit l’expéditeur
RCPT TO
Définit le destinataire
DATA
Démarre la transmission du message
QUIT
Termine la session
RSET
Réinitialise la transaction sans couper la session
VRFY
Vérifie l’existence d’un utilisateur
EXPN
Liste les membres d’une liste de distribution
NOOP
Garde la connexion ouverte sans faire d’action
⚠️ Paramètres dangereux
Certains réglages SMTP peuvent compromettre la sécurité du serveur :
mynetworks = 0.0.0.0/0
Tout le monde peut utiliser le serveur comme relai
VRFY
activé
Permet l’énumération des utilisateurs
STARTTLS non requis
Authentification transmise en clair
AUTH sans chiffrement
Expose les identifiants des utilisateurs
Ce type de mauvaise configuration mène à des attaques de type Open Relay.
🔎 Empreinte et Analyse SMTP
📡 Nmap - Identification du service
$ sudo nmap -sC -sV -p25 10.xx.xx.xx
Permet de détecter le service et les extensions SMTP exposées (smtp-commands
).
🚨 Nmap - Détection de relais ouvert
$ sudo nmap -p25 --script smtp-open-relay -v 10.xx.xx.xx
Effectue 16 tests pour détecter si le serveur accepte des envois anonymes non autorisés.
📬 Envoi manuel d’un email (exemple simplifié)
$ telnet 10.xx.xx.xx 25
EHLO inlanefreight.htb
MAIL FROM:<user@domain.htb>
RCPT TO:<target@domain.htb>
DATA
Subject: Test
This is a test.
.
QUIT
L’envoi via telnet est très utile pour tester les configurations SMTP, analyser les en-têtes ou simuler une attaque.
📚 Ressources utiles
Enumerate the SMTP service and submit the banner, including its version as the answer.
J'utilise netcat afin de lire la bannière du service :
$ nc -nv 10.129.37.25 25
Ncat: Version 7.93 ( https://nmap.org/ncat )
Ncat: Connected to 10.129.37.25:25.
220 InFreight ESMTP v2.11
La version utilisée par la cible est donc InFreight ESMTP v2.11
.
Enumerate the SMTP service even further and find the username that exists on the system. Submit it as the answer.
Nous avons utilisé smtp-enum-users
afin de lister l'ensemble des utilisateurs disponibles sur le poste cible :
$ smtp-user-enum -U /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt 10.129.42.195 25
Après un certain temps d'attente, nous observons la ligne suivante :
[----] robin 252 2.0.0 robin
L'utilisateur attendu est donc robin
.
Mis à jour