SMTP Smuggling
Reading time: 7 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Βασικές Πληροφορίες
This type of vulnerability was originally discovered in this post were it's explained that It's possible to exploit discrepancies in how the SMTP protocol is interpreted when finalising an email, allowing an attacker to smuggle more emails in the body of the legit one, allowing to impersonate other users of the affected domain (such as admin@outlook.com) bypassing defenses such as SPF.
Γιατί
Αυτό συμβαίνει γιατί στο πρωτόκολλο SMTP, τα δεδομένα του μηνύματος που αποστέλλονται στο email ελέγχονται από έναν χρήστη (επιτιθέμενο) ο οποίος μπορεί να στείλει ειδικά κατασκευασμένα δεδομένα εκμεταλλευόμενος διαφορές στους parsers που θα smuggle-άρουν επιπλέον emails στον παραλήπτη. Δείτε αυτό το εικονογραφημένο παράδειγμα από το original post:
 (1) (1) (1) (1).png)
Πώς
Για να εκμεταλλευτεί κάποιος αυτή την ευπάθεια χρειάζεται να στείλει δεδομένα που ο εξερχόμενος SMTP διακομιστής θεωρεί ότι είναι μόνο 1 email αλλά ο εισερχόμενος SMTP διακομιστής θεωρεί ότι υπάρχουν πολλά emails.
Οι ερευνητές ανακάλυψαν πως διαφορετικοί εισερχόμενοι διακομιστές θεωρούν διαφορετικούς χαρακτήρες ως τέλος των δεδομένων του email, οι οποίοι δεν θεωρούνται έτσι από τους εξερχόμενους διακομιστές.
Για παράδειγμα, ένα συνηθισμένο τέλος των δεδομένων είναι \r\n.\r
. Αλλά αν ο εισερχόμενος SMTP διακομιστής επίσης υποστηρίζει \n.
, ένας επιτιθέμενος μπορεί απλά να προσθέσει αυτά τα δεδομένα στο email του και να αρχίσει να υποδεικνύει τις SMTP εντολές ενός νέου μηνύματος για να το smuggle-άρει, όπως στην προηγούμενη εικόνα.
Φυσικά, αυτό μπορεί να λειτουργήσει μόνο αν ο εξερχόμενος SMTP διακομιστής δεν θεωρεί επίσης αυτά τα δεδομένα ως το τέλος των δεδομένων του μηνύματος, γιατί σε αυτή την περίπτωση θα δει 2 emails αντί για 1 — στην ουσία πρόκειται για την αποσυγχρονισμό που εκμεταλλεύεται αυτή η ευπάθεια.
Πιθανά δεδομένα αποσυγχρονισμού:
\n.
\n.\r
Σημειώστε επίσης ότι το SPF παρακάμπτεται γιατί αν smuggle-άρετε ένα email από admin@outlook.com
μέσα σε ένα email από user@outlook.com
, ο αποστολέας παραμένει outlook.com
.
Λίστα ελέγχου επιτιθέμενου (ποιες προϋποθέσεις πρέπει να ισχύουν;)
Για να smuggle-άρετε επιτυχώς ένα δεύτερο email, συνήθως χρειάζεστε:
- Έναν εξερχόμενο server A μέσω του οποίου μπορείτε να στείλετε (συχνά με έγκυρα creds) που θα προωθήσει μία μη‑τυπική ακολουθία τέλους‑DATA χωρίς αλλαγές. Πολλές υπηρεσίες ιστορικά προωθούσαν παραλλαγές όπως
\n.\r\n
ή\n.\n
. - Έναν παραλαμβάνοντα server B που θα ερμηνεύσει αυτή τη μη‑τυπική ακολουθία ως τέλος‑DATA και στη συνέχεια θα αναλύσει ό,τι ακολουθεί ως νέες SMTP εντολές (MAIL/RCPT/DATA...).
- Το outbound πρέπει πραγματικά να στείλει με
DATA
(όχιBDAT
). Αν ο A υποστηρίζει CHUNKING/BDAT, το smuggling λειτουργεί μόνο αν πέσει πίσω σε DATA (π.χ., ο B δεν διαφημίζει CHUNKING), διαφορετικά το BDAT με ορισμό μήκους αποτρέπει την ασάφεια. - Το PIPELINING δεν είναι απαραίτητο αλλά βοηθά στο να κρύψει τις εγχυμένες εντολές σε ένα μόνο TCP write ώστε ενδιάμεσες συσκευές να μην επανασυντονιστούν.
Συνηθισμένες παραλλαγές τέλους‑DATA που αξίζει να δοκιμάσετε (εξαρτάται από τον παραλήπτη):
\n.\n
\n.\r\n
\r.\r\n
\r\n.\r
(ακατέργαστο CR στο τέλος)
Σημείωση: Αυτό που λειτουργεί είναι το τομή (intersection) του “what A forwards” ∩ “what B accepts”.
Παράδειγμα χειροκίνητης εκμετάλλευσης (μονοσυνεδρία)
Το παρακάτω δείχνει την ιδέα χρησιμοποιώντας μια ακατέργαστη STARTTLS SMTP συνεδρία. Αφού το πρώτο DATA block εισάγουμε έναν μη‑τυπικό τερματισμό, και μετά ένα άλλο SMTP διάλογο που ο παραλαμβάνοντας διακομιστής μπορεί να θεωρήσει ως νέο μήνυμα.
Χειροκίνητη συνεδρία smuggling (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
Αν ο A προωθήσει `\n.\r\n` και ο B το δεχτεί ως τέλος‑του‑DATA, το μήνυμα “hello B” μπορεί να γίνει αποδεκτό ως δεύτερο email από `admin@target.com` ενώ περνάει το SPF (ευθυγραμμισμένο με τις IP του A).
</details>
Tip: Όταν δοκιμάζετε διαδραστικά, βεβαιωθείτε ότι χρησιμοποιείται `-crlf` ώστε το OpenSSL να διατηρεί τα CRLF σε ό,τι πληκτρολογείτε.
---
## Αυτοματισμός και σαρωτές
- hannob/smtpsmug: στείλτε ένα μήνυμα που τελειώνει με πολλαπλές κακοσχηματισμένες ακολουθίες end‑of‑DATA για να δείτε τι δέχεται ένας αποδέκτης.
- Example: `./smtpsmug -s mail.target.com -p 25 -t victim@target.com`
- The‑Login/SMTP‑Smuggling‑Tools: scanner για τόσο την εισερχόμενη όσο και την εξερχόμενη πλευρά, μαζί με έναν αναλυτικό SMTP server για να δείτε ακριβώς ποιες ακολουθίες επιβιώνουν από έναν 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 '...'
`
Αυτά τα εργαλεία σας βοηθούν να χαρτογραφήσετε τα ζεύγη A→B όπου το smuggling λειτουργεί πραγματικά.
---
## CHUNKING/BDAT vs DATA
- Το DATA χρησιμοποιεί τον τερματιστή `<CR><LF>.<CR><LF>`· οποιαδήποτε ασάφεια στον τρόπο που τα CR/LF κανονικοποιούνται ή γίνεται dot‑stuffing οδηγεί σε αποσυγχρονισμό.
- Το CHUNKING (BDAT) περικλείει το σώμα με ακριβές μήκος σε bytes και ως εκ τούτου αποτρέπει το κλασικό smuggling. Ωστόσο, αν ο αποστολέας επιστρέψει στο DATA (επειδή ο δέκτης δεν ανακοινώνει CHUNKING), το κλασικό smuggling γίνεται ξανά δυνατό.
---
## Σημειώσεις για το λογισμικό που επηρεάζεται και τις επιδιορθώσεις (για στοχοποίηση)
- Postfix: πριν από την 3.9 το default ανεχόταν bare LFs· από τις 3.5.23/3.6.13/3.7.9/3.8.4 οι admins μπορούν να ενεργοποιήσουν `smtpd_forbid_bare_newline`. Η τρέχουσα σύσταση είναι `smtpd_forbid_bare_newline = normalize` (3.8.5+/3.7.10+/3.6.14+/3.5.24+) ή να οριστεί σε `reject` για αυστηρή εφαρμογή του RFC.
- Exim: διορθώθηκε στην 4.97.1 (και μεταγενέστερες) για παραλλαγές που βασίζονται σε μιγμένες ακολουθίες end‑of‑DATA όταν χρησιμοποιείται DATA. Παλαιότερες 4.97/4.96 μπορεί να είναι εκμεταλλεύσιμες ανάλογα με PIPELINING/CHUNKING.
- Sendmail: διορθώθηκε στην 8.18· οι παλαιότερες 8.17.x αποδέχονταν ορισμένους μη‑τυπικούς τερματιστές.
- Διάφορες βιβλιοθήκες/servers (π.χ. aiosmtpd πριν από 1.4.5, κάποια vendor gateways, και συγκεκριμένα SaaS relays) είχαν παρόμοια προβλήματα· οι σύγχρονες εκδόσεις τείνουν να αποδέχονται το DATA μόνο με το αυστηρό `<CR><LF>.<CR><LF>`.
Χρησιμοποιήστε τους σαρωτές παραπάνω για να επαληθεύσετε τη σημερινή συμπεριφορά· πολλοί vendors άλλαξαν τα defaults στις αρχές 2024–2025.
---
## Συμβουλές για red team ops
- Προτιμήστε μεγάλους commodity senders για τον A (ιστορικά Exchange Online, shared hosters, κ.λπ.). Αν εξακολουθούν να προωθούν κάποιους μη‑τυπικούς EOM και είναι στο SPF του θύματος, το smuggled MAIL FROM θα κληρονομήσει τη φήμη τους.
- Καταγράψτε τις SMTP επεκτάσεις του B: το banner `EHLO` για PIPELINING/CHUNKING· αν λείπει το CHUNKING έχετε καλύτερη πιθανότητα από senders που χρησιμοποιούν BDAT πρώτα. Συνδυάστε με κακοσχηματισμένα EOMs για να δοκιμάσετε την αποδοχή.
- Παρακολουθήστε τα headers: το smuggled μήνυμα συνήθως δημιουργεί ξεχωριστή αλυσίδα Received που ξεκινάει από το B. Το DMARC θα περνάει συχνά επειδή το MAIL FROM ευθυγραμμίζεται με τον IP χώρο του A.
---
## **Αναφορές**
- [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>
Μάθετε & εξασκηθείτε στο 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;">\
Μάθετε & εξασκηθείτε στο 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;">
Μάθετε & εξασκηθείτε στο 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>Υποστηρίξτε το HackTricks</summary>
- Ελέγξτε τα [**σχέδια συνδρομής**](https://github.com/sponsors/carlospolop)!
- **Εγγραφείτε στην** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
- **Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
</div>