SMTP Smuggling
Reading time: 7 minutes
tip
Apprenez et pratiquez le hacking AWS : HackTricks Training AWS Red Team Expert (ARTE)
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :  HackTricks Training GCP Red Team Expert (GRTE)
HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure :
Apprenez et pratiquez le hacking Azure :  HackTricks Training Azure Red Team Expert (AzRTE)
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)
<div class="mdbook-alerts mdbook-alerts-tip">
<p class="mdbook-alerts-title">
  <span class="mdbook-alerts-icon"></span>
  tip
</p>
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>
</div>
 HackTricks
HackTricks