SMTP Smuggling

Tip

Lernen & ĂŒben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & ĂŒben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & ĂŒben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

UnterstĂŒtzen Sie HackTricks

Grundlegende Informationen

Diese Art von Verwundbarkeit wurde originally discovered in this post entdeckt, wo erklĂ€rt wird, dass es möglich ist, Unstimmigkeiten in der Interpretation des SMTP‑Protokolls auszunutzen, wenn eine E‑Mail finalisiert wird. Dadurch kann ein Angreifer zusĂ€tzliche E‑Mails in den Körper der legitimen E‑Mail einschmuggeln und andere Benutzer der betroffenen Domain (z. B. admin@outlook.com) imitieren, wodurch Schutzmechanismen wie SPF umgangen werden.

Warum

Das liegt daran, dass im SMTP‑Protokoll die Daten der Nachricht, die in der E‑Mail gesendet werden, vom Benutzer (Angreifer) kontrolliert werden können. Dieser kann speziell gestaltete Daten senden, die Parser‑Unterschiede ausnutzen und zusĂ€tzliche E‑Mails beim EmpfĂ€nger einschmuggeln. Siehe dieses illustrierte Beispiel aus dem Original‑Post:

https://sec-consult.com/fileadmin/user_upload/sec-consult/Dynamisch/Blogartikel/2023_12/SMTP_Smuggling-Overview__09_.png

Wie

Um diese Verwundbarkeit auszunutzen, muss ein Angreifer Daten senden, die der ausgehende SMPT‑Server fĂŒr eine einzige E‑Mail hĂ€lt, wĂ€hrend der eingehende SMTP‑Server sie als mehrere E‑Mails interpretiert.

Die Forscher entdeckten, dass verschiedene Inboud‑Server unterschiedliche Zeichen als Ende der Daten der E‑Mail‑Nachricht betrachten, die Outbound‑Server nicht.
Zum Beispiel ist ein normales Ende der Daten \r\n.\r. Wenn der Inbound SMTP‑Server jedoch auch \n. unterstĂŒtzt, könnte ein Angreifer genau diese Sequenz in seine E‑Mail einfĂŒgen und danach die SMTP‑Befehle fĂŒr eine neue Nachricht (MAIL/RCPT/DATA
) beginnen, um diese wie im vorherigen Bild einzuschmuggeln.

NatĂŒrlich funktioniert das nur, wenn der ausgehende SMTP‑Server diese Sequenz nicht ebenfalls als Ende der Nachrichtendaten behandelt, denn sonst wĂŒrde er 2 E‑Mails statt nur einer sehen — letztlich wird hier also eine Desynchronisation ausgenutzt.

Mögliche Desynchronisations‑Sequenzen:

  • \n.
  • \n.\r

Beachte auch, dass SPF umgangen wird, weil wenn du eine E‑Mail von admin@outlook.com in eine E‑Mail von user@outlook.com einschmuggelst, der Sender weiterhin outlook.com ist.


Checkliste des Angreifers (welche Bedingungen mĂŒssen erfĂŒllt sein?)

Um erfolgreich eine zweite E‑Mail einzuschmuggeln, brauchst du typischerweise:

  • Einen ausgehenden Server A, ĂŒber den du senden kannst (oft mit gĂŒltigen Zugangsdaten/creds), der eine nicht‑standardmĂ€ĂŸige End‑of‑DATA‑Sequenz unverĂ€ndert weiterleitet. Viele Services haben historisch Varianten wie \n.\r\n oder \n.\n weitergeleitet.
  • Einen empfangenden Server B, der diese nicht‑standardmĂ€ĂŸige Sequenz als Ende‑von‑DATA interpretiert und dann alles, was folgt, als neue SMTP‑Befehle (MAIL/RCPT/DATA
) parst.
  • Outbound muss tatsĂ€chlich mit DATA senden (nicht BDAT). Wenn A CHUNKING/BDAT unterstĂŒtzt, funktioniert smuggling nur, wenn es auf DATA zurĂŒckfĂ€llt (z. B. B wirbt nicht mit CHUNKING), sonst verhindert die lĂ€ngenbasierte BDAT‑Rahmung Mehrdeutigkeit.
  • PIPELINING ist nicht erforderlich, hilft aber dabei, die injizierten Befehle in einem einzigen TCP‑Write zu verstecken, sodass Zwischenstellen nicht resynchronisieren.

GĂ€ngige End‑of‑DATA‑Varianten, die es wert sind getestet zu werden (empfĂ€ngerabhĂ€ngig):

  • \n.\n
  • \n.\r\n
  • \r.\r\n
  • \r\n.\r (bare CR at end)

Hinweis: Funktioniert nur die Schnittmenge von „was A weiterleitet“ ∩ „was B akzeptiert“.


Manuelles Exploit‑Beispiel (einzelne Sitzung)

Das Folgende zeigt die Idee anhand einer rohen STARTTLS‑SMTP‑Sitzung. Nach dem ersten DATA‑Block fĂŒgen wir einen nicht‑standardmĂ€ĂŸigen Terminator ein, gefolgt von einem weiteren SMTP‑Dialog, den der empfangende Server als neue Nachricht interpretieren könnte.

Manuelle smuggling‑Sitzung (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

If A forwards `\n.\r\n` and B accepts it as end‑of‑DATA, message “hello B” may be accepted as a second email from `admin@target.com` while passing SPF (aligned with A’s IPs).
</details>

Tip: When testing interactively, ensure `-crlf` is used so OpenSSL preserves CRLF in what you type.

---

## Automatisierung und Scanner

- hannob/smtpsmug: send a message ending with multiple malformed end‑of‑DATA sequences to see what a receiver accepts.
- Example: `./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.
- Inbound quick check: `python3 smtp_smuggling_scanner.py victim@target.com`
- Outbound via a relay: `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 '...'
`

These tools help you map the A→B pairs where smuggling actually works.

---

## 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.

---

## Hinweise zu betroffener Software und Fixes (fĂŒr Targeting)

- Postfix: vor 3.9 tolerierte die Standardeinstellung bare LFs; ab 3.5.23/3.6.13/3.7.9/3.8.4 können Admins `smtpd_forbid_bare_newline` aktivieren. Aktuelle Empfehlung ist `smtpd_forbid_bare_newline = normalize` (3.8.5+/3.7.10+/3.6.14+/3.5.24+) oder fĂŒr strikte RFC‑Durchsetzung auf `reject` setzen.
- Exim: fixed in 4.97.1 (and later) for variants relying on mixed end‑of‑DATA sequences when DATA is used. Ältere 4.97/4.96‑Versionen können je nach PIPELINING/CHUNKING ausnutzbar sein.
- Sendmail: fixed in 8.18; Ă€ltere 8.17.x akzeptierten einige nicht‑standardmĂ€ĂŸige Terminatoren.
- Verschiedene Bibliotheken/Server (z. B. aiosmtpd vor 1.4.5, einige Vendor‑Gateways und bestimmte SaaS‑Relays) hatten Ă€hnliche Probleme; moderne Versionen akzeptieren DATA meist nur mit strikt `<CR><LF>.<CR><LF>`.

Verwende die oben genannten Scanner, um das aktuelle Verhalten zu ĂŒberprĂŒfen; viele Anbieter haben ihre Defaults Anfang 2024–2025 geĂ€ndert.

---

## Tipps fĂŒr red team ops

- Bevorzuge große Commodity‑Sender fĂŒr A (historisch Exchange Online, shared hoster etc.). Wenn sie weiterhin einige nicht‑standardmĂ€ĂŸige EOM weiterleiten und in der SPF des Opfers stehen, erbt deine geschmuggelte MAIL FROM deren Reputation.
- Enumeriere B’s SMTP‑Extensions: `EHLO`‑Banner fĂŒr PIPELINING/CHUNKING; wenn CHUNKING fehlt, hast du von BDAT‑first‑Sendern bessere Chancen. Kombiniere das mit malformed EOMs zum Abtasten der Akzeptanz.
- Achte auf Header: die geschmuggelte Nachricht erzeugt in der Regel eine separate Received‑Kette beginnend bei B. DMARC besteht hĂ€ufig, weil MAIL FROM mit A’s IP‑Bereich aligned ist.

---

## **Referenzen**

- [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]
> Lernen & ĂŒben Sie AWS Hacking:<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;">\
> Lernen & ĂŒben Sie GCP Hacking: <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;">
> Lernen & ĂŒben Sie Azure Hacking: <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>UnterstĂŒtzen Sie HackTricks</summary>
>
> - ÜberprĂŒfen Sie die [**AbonnementplĂ€ne**](https://github.com/sponsors/carlospolop)!
> - **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐩 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Teilen Sie Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repos senden.
>
> </details>