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

Élément
Rôle

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

Commande
Description

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 :

Paramètre
Risque associé

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