SMTP Smuggling
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- VĂ©rifiez les plans dâabonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
Informations de base
Ce type de vulnĂ©rabilitĂ© a Ă©tĂ© originally discovered in this post oĂč il est expliquĂ© quâil est possible dâexploiter des divergences dans la maniĂšre dont le protocole SMTP est interprĂ©tĂ© lors de la finalisation dâun e-mail, permettant Ă un attaquant de smuggler plusieurs e-mails dans le corps du message lĂ©gitime, ce qui permet dâusurper dâautres utilisateurs du domaine affectĂ© (comme admin@outlook.com) en contournant des dĂ©fenses telles que SPF.
Pourquoi
Ceci sâexplique parce que, dans le protocole SMTP, les donnĂ©es du message Ă envoyer dans lâe-mail sont contrĂŽlĂ©es par un utilisateur (attaquant) qui pourrait envoyer des donnĂ©es spĂ©cialement conçues en abusant des diffĂ©rences entre les parsers pour smuggler des e-mails supplĂ©mentaires chez le rĂ©cepteur. Regardez cet exemple illustrĂ© tirĂ© du post original :
 (1) (1) (1) (1).png)
Comment
Pour exploiter cette vulnĂ©rabilitĂ©, un attaquant doit envoyer des donnĂ©es que lâOutbound SMPT server considĂšre comme un seul eâmail alors que lâInbound SMTP server considĂšre quâil y en a plusieurs.
Les chercheurs ont dĂ©couvert que diffĂ©rents Inbound servers considĂšrent diffĂ©rents caractĂšres comme la fin des donnĂ©es du message eâmail, que les Outbound servers ne considĂšrent pas forcĂ©ment.
Par exemple, une fin de donnĂ©es rĂ©guliĂšre est \r\n.\r. Mais si lâInbound SMTP server supporte aussi \n., un attaquant pourrait simplement ajouter ces donnĂ©es dans son eâmail et commencer Ă indiquer les commandes SMTP dâun nouveau message Ă smuggler, comme dans lâimage prĂ©cĂ©dente.
Ăvidemment, cela ne fonctionnerait que si lâOutbound SMTP server ne traite pas aussi ces donnĂ©es comme la fin des donnĂ©es du message, car dans ce cas il verrait 2 eâmails au lieu dâun seul â câest cette dĂ©synchronisation qui est exploitĂ©e.
Données potentielles de désynchronisation :
\n.\n.\r
Notez aussi que SPF est contournĂ© parce que si vous smugglez un eâmail depuis admin@outlook.com Ă partir dâun eâmail de user@outlook.com, lâexpĂ©diteur reste outlook.com.
Liste de vĂ©rification de lâattaquant (quelles conditions doivent ĂȘtre remplies ?)
Pour smuggler avec succĂšs un second eâmail, vous avez typiquement besoin de :
- Un outbound server A que vous pouvez utiliser (souvent avec des identifiants valides) qui va transfĂ©rer une sĂ©quence de finâdeâDATA non standard sans la modifier. Beaucoup de services ont historiquement forwardĂ© des variantes comme
\n.\r\nou\n.\n. - Un receiving server B qui interprĂ©tera cette sĂ©quence non standard comme la fin de DATA puis parsera ce qui suit comme de nouvelles commandes SMTP (MAIL/RCPT/DATAâŠ).
- Outbound doit effectivement envoyer avec
DATA(et nonBDAT). Si A supporte CHUNKING/BDAT, le smuggling ne fonctionne que sâil revient Ă DATA (par ex. si B nâannonce pas CHUNKING), sinon BDAT avec encadrement par longueur empĂȘche lâambiguĂŻtĂ©. - PIPELINING nâest pas requis mais aide Ă masquer les commandes injectĂ©es dans un seul write TCP pour que des dispositifs intermĂ©diaires ne resynchronisent pas.
Variantes communes de finâdeâDATA Ă tester (dĂ©pend du receiver) :
\n.\n\n.\r\n\r.\r\n\r\n.\r(CR nu Ă la fin)
Note : Ce qui fonctionne est lâintersection de « ce que A forwarde » ⩠« ce que B accepte ».
Exemple dâexploitation manuelle (session unique)
Lâexemple suivant illustre lâidĂ©e en utilisant une session STARTTLS SMTP brute. AprĂšs le premier bloc DATA, nous insĂ©rons un terminateur non standard, puis un autre dialogue SMTP que le serveur rĂ©cepteur peut interprĂ©ter comme un nouveau message.
Session de smuggling manuelle (STARTTLS)
``` $ openssl s_client -starttls smtp -crlf -connect smtp.example.com:587 EHLO a.example AUTH PLAINhello A \n.\r\nMAIL FROM:admin@target.com RCPT TO:victim@target.com DATA From: Admin admin@target.com To: victim victim@target.com Subject: smuggled
hello B \r\n.\r\n
Si A transmet `\n.\r\n` et que B l'accepte comme finâdeâDATA, le message âhello Bâ peut ĂȘtre acceptĂ© comme un deuxiĂšme eâmail provenant de `admin@target.com` tout en passant SPF (alignĂ© avec les IPs d'A).
Conseil : Lorsque vous testez en interactif, assurezâvous d'utiliser `-crlf` afin qu'OpenSSL prĂ©serve les CRLF dans ce que vous tapez.
---
## Automation and scanners
- hannob/smtpsmug: send a message ending with multiple malformed endâofâDATA sequences to see what a receiver accepts.
- Exemple : `./smtpsmug -s mail.target.com -p 25 -t victim@target.com`
- TheâLogin/SMTPâSmugglingâTools: scanner for both inbound and outbound sides plus an analysis SMTP server to see exactly which sequences survive a sender.
- Vérification rapide (inbound) : `python3 smtp_smuggling_scanner.py victim@target.com`
- Sortant via un relais : `python3 smtp_smuggling_scanner.py YOUR@ANALYSIS.DOMAIN --outbound-smtp-server smtp.relay.com --port 587 --starttls --sender-address you@relay.com --username you@relay.com --password '...'
`
Ces outils vous aident Ă cartographier les paires AâB oĂč le smuggling fonctionne rĂ©ellement.
---
## CHUNKING/BDAT vs DATA
- DATA uses a sentinel terminator `<CR><LF>.<CR><LF>`; any ambiguity in how CR/LF are normalized or dotâstuffed leads to desync.
- CHUNKING (BDAT) frames the body with an exact byte length and therefore prevents classic smuggling. However, if the sender falls back to DATA (because the receiver doesnât advertise CHUNKING), classic smuggling becomes possible again.
---
## Notes on affected software and fixes (for targeting)
- Postfix: prior to 3.9 the default tolerated bare LFs; from 3.5.23/3.6.13/3.7.9/3.8.4 admins can enable `smtpd_forbid_bare_newline`. Current recommendation is `smtpd_forbid_bare_newline = normalize` (3.8.5+/3.7.10+/3.6.14+/3.5.24+) or set to `reject` for strict RFC enforcement.
- Exim: fixed in 4.97.1 (and later) for variants relying on mixed endâofâDATA sequences when DATA is used. Older 4.97/4.96 may be exploitable depending on PIPELINING/CHUNKING.
- Sendmail: fixed in 8.18; older 8.17.x accepted some nonâstandard terminators.
- Various libraries/servers (e.g., aiosmtpd before 1.4.5, some vendor gateways, and specific SaaS relays) had similar issues; modern versions tend to accept DATA only with strict `<CR><LF>.<CR><LF>`.
Utilisez les scanners ciâdessus pour vĂ©rifier le comportement actuel ; de nombreux fournisseurs ont changĂ© les paramĂštres par dĂ©faut dĂ©but 2024â2025.
---
## Tips for red team ops
- Favorize large commodity senders for A (historically Exchange Online, shared hosters, etc.). If they still forward some nonâstandard EOM and theyâre in the victimâs SPF, your smuggled MAIL FROM will inherit their reputation.
- ĂnumĂ©rez les extensions SMTP de B : banniĂšre `EHLO` pour PIPELINING/CHUNKING ; si CHUNKING est absent vous avez de meilleures chances avec des senders BDATâfirst. Combinez avec des EOM malformĂ©s pour sonder l'acceptation.
- Surveillez les headers : le message smuggled créera généralement une chaßne Received séparée commençant à B. DMARC passera souvent parce que le MAIL FROM s'aligne avec l'espace IP d'A.
---
## **Références**
- [https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/](https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/)
- [https://www.postfix.org/smtp-smuggling.html](https://www.postfix.org/smtp-smuggling.html)
> [!TIP]
> Apprenez et pratiquez le hacking AWS :<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Apprenez et pratiquez le hacking GCP : <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Apprenez et pratiquez le hacking Azure : <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Soutenir HackTricks</summary>
>
> - Vérifiez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop) !
> - **Rejoignez le** đŹ [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez-nous sur** **Twitter** đŠ [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Partagez des astuces de hacking en soumettant des PR au** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépÎts github.
>
> </details>


