نظرة عامة
ما هو SMTP؟
Simple Mail Transfer Protocol — بروتوكول إرسال الإيميلات عبر الشبكة. يشتغل بين الـ client والـ mail server، وبين سيرفرين SMTP. بدون تشفير افتراضياً — كل شيء يمشي clear-text.
الـ Ports
PORT 25 — قديم
سيرفر → سيرفر، بدون تشفير
PORT 587 — STARTTLS
Client → سيرفر، يبدأ عادي ثم يشفر
PORT 465 — SSL/TLS
Client → سيرفر، مشفر من البداية
SMTP vs ESMTP
SMTP عادي:
بدون تشفير، بدون authentication
بدون تشفير، بدون authentication
ESMTP (Extended):
+ STARTTLS = تشفير
+ AUTH PLAIN = authentication
لما الناس يقولوا SMTP = يقصدون ESMTP
+ STARTTLS = تشفير
+ AUTH PLAIN = authentication
لما الناس يقولوا SMTP = يقصدون ESMTP
⚠️ عيبان أساسيان في SMTP
❌ العيب 1 — ما في تأكيد وصول
ترسل إيميل — SMTP ما يخبرك إذا وصل. لو ما وصل: رسالة خطأ بالإنجليزي بدون تنسيق موحد.
❌ العيب 2 — ما في authentication
أي شخص يقول "أنا ceo@company.com" — SMTP ما يتحقق! = Mail Spoofing مجاني 💀
💡 الحلول: DKIM (توقيع رقمي) + SPF (تحديد IPs المسموح لها) — بس على جانب المستلم فقط، ما يمنعون Open Relay!
🔒 STARTTLS vs SSL/TLS
Port 587 — STARTTLS
الاتصال يبدأ عادي (plaintext)
Client يرسل STARTTLS
بعدها يتحول للتشفير
"ابدأ عادي بعدين شفّر"
Client يرسل STARTTLS
بعدها يتحول للتشفير
"ابدأ عادي بعدين شفّر"
Port 465 — SSL/TLS
التشفير يبدأ من أول لحظة
ما في لحظة plaintext أبداً
"شفّر من البداية" ✅
ما في لحظة plaintext أبداً
"شفّر من البداية" ✅
مسار الإيميل
📧 المكونات الأربعة
MUA
Mail User Agent
Gmail/Outlook
Gmail/Outlook
→
MSA
Submission Agent
يتحقق منك
يتحقق منك
→
MTA
Transfer Agent
ساعي البريد
ساعي البريد
→
MDA
Delivery Agent
يحط في الصندوق
يحط في الصندوق
→
Mailbox
POP3/IMAP
🎯 Open Relay = MTA بدون MSA — ما في تحقق من المرسل = أي شخص يرسل لأي شخص!
🌍 مثال — من Gmail لـ Outlook
1. أنت (MUA) تكتب الإيميل في Gmail
↓
2. Gmail SMTP (MTA) يستقبله — Port 587
↓
3. Gmail يبحث في DNS عن MX record لـ outlook.com
↓
4. Gmail SMTP يتصل بـ Outlook SMTP — Port 25
↓
5. MDA يحط الإيميل في صندوق المستلم ✅
💡 سيرفرين SMTP على الأقل — Gmail يصير "client" لما يتصل بـ Outlook!
SMTP Commands
📋 جميع الأوامر
| الأمر | الوظيفة | أهمية Pentest |
|---|---|---|
| HELO | تعريف نفسك — SMTP قديم | محدود |
| EHLO | تعريف نفسك — ESMTP، يعرض الميزات | يكشف VRFY وAUTH! |
| MAIL FROM | تحديد المرسل | Spoofing — أي إيميل مزيف |
| RCPT TO | تحديد المستلم | تحديد الهدف |
| DATA | بدء كتابة الإيميل (ينتهي بـ .) | محتوى الإيميل |
| VRFY | التحقق من وجود يوزر | User Enumeration 🎯 |
| EXPN | عرض أعضاء mailing list | كشف أسماء + إيميلات |
| RSET | إلغاء الإيميل الحالي بدون قطع الاتصال | ابدأ من جديد |
| NOOP | ping للسيرفر — منع timeout | إبقاء الاتصال |
| QUIT | إنهاء الاتصال | إغلاق الجلسة |
💻 HELO vs EHLO
HELO — قديم:
HELO mail1.inlanefreight.htb
250 mail1.inlanefreight.htb
← يرجع الاسم فقط
EHLO — حديث (ESMTP):
EHLO mail1
250-mail1.inlanefreight.htb
250-PIPELINING
250-SIZE 10240000
250-VRFY ← User Enum!
250-STARTTLS
250-AUTH PLAIN
250 CHUNKING
🎯 VRFY في القائمة = User Enumeration مفعّل!
👤 VRFY — User Enumeration
telnet 10.129.14.128 25
220 ESMTP Server
VRFY root
252 2.0.0 root ← ممكن موجود
VRFY cry0l1t3
252 2.0.0 cry0l1t3 ← ممكن موجود
VRFY aaaaaaaaaaaaaaaa
252 2.0.0 aaaaaaaaaaaaa ← السيرفر يكذب!
⚠️ كودات الرد:
252 = "ممكن موجود" — مش دايماً صادق!
250 = موجود 100%
550 = غير موجود
252 = "ممكن موجود" — مش دايماً صادق!
250 = موجود 100%
550 = غير موجود
🎯 دايماً جرب VRFY على اسم عشوائي واضح — لو رجع 252 = السيرفر يكذب!
📤 إرسال إيميل كامل عبر telnet
telnet 10.129.14.128 25
220 ESMTP Server
# 1. تعريف نفسك
EHLO inlanefreight.htb
250-mail1.inlanefreight.htb
# 2. تحديد المرسل (ممكن تزوّره!)
MAIL FROM: <cry0l1t3@inlanefreight.htb>
250 2.1.0 Ok
# 3. تحديد المستلم
RCPT TO: <mrb3n@inlanefreight.htb> NOTIFY=success,failure
250 2.1.5 Ok
# 4. بدء كتابة الإيميل
DATA
354 End data with <CR><LF>.<CR><LF>
From: <cry0l1t3@inlanefreight.htb>
To: <mrb3n@inlanefreight.htb>
Subject: DB Access
Date: Tue, 28 Sept 2021 16:32:51 +0200
Hey man, the DB creds don't work. Did you change them?
.
250 2.0.0 Ok: queued as 6E1CF1681AB
QUIT
221 2.0.0 Bye
💡 النقطة . وحدها على سطر = نهاية الإيميل. NOTIFY=success,failure = أخبرني لو وصل أو لم يصل.
الإعدادات — Postfix
ملف الإعداد
cat /etc/postfix/main.cf | grep -v "#" | sed -r "/^\s*$/d"
smtpd_banner = ESMTP Server ← ما يكشف الإصدار ✅
myhostname = mail1.inlanefreight.htb
mynetworks = 127.0.0.0/8 10.129.0.0/16 ← محدود ✅
mydestination = $myhostname, localhost
masquerade_domains = $myhostname
mailbox_size_limit = 0
smtp_bind_address = 0.0.0.0 ← يستمع على كل interfaces!
inet_protocols = ipv4
smtpd_helo_restrictions = reject_invalid_hostname
home_mailbox = /home/postfix
📋 شرح الإعدادات المهمة
| الإعداد | الوظيفة | الخطر |
|---|---|---|
| smtpd_banner | ما يظهر عند الاتصال | لو بدون إصدار = جيد ✅ |
| myhostname | اسم السيرفر | يكشف اسم الجهاز |
| mynetworks | من يقدر يرسل عبر السيرفر | 0.0.0.0/0 = Open Relay 💀 |
| smtp_bind_address | أي interface يستمع عليها | 0.0.0.0 = كل interfaces |
| smtpd_helo_restrictions | قيود على HELO | reject_invalid = حماية |
Dangerous Settings
💀 Open Relay — أخطر إعداد
الإعداد الخطير:
mynetworks = 0.0.0.0/0
← أي IP في العالم
يقدر يرسل عبر هاد السيرفر!
💀 Open Relay = أي شخص يرسل إيميلات مزيفة بدون authentication!
الإعداد الآمن:
mynetworks = 127.0.0.0/8
10.129.0.0/16
← localhost والشبكة الداخلية فقط ✅
✅ محدود = فقط الأجهزة الداخلية تقدر ترسل
🎭 Mail Spoofing + Phishing
Open Relay مفتوح
↓
MAIL FROM: <ceo@company.com> ← مزيف!
↓
RCPT TO: <all-employees@company.com>
↓
"أرسل بياناتك البنكية فوراً" 💀
🎯 أنواع الهجمات:
Phishing = إيميل لعدد كبير
Spear Phishing = مستهدف لشخص معين
Whaling = مستهدف لمدير كبير (CEO/CFO)
Phishing = إيميل لعدد كبير
Spear Phishing = مستهدف لشخص معين
Whaling = مستهدف لمدير كبير (CEO/CFO)
🛡️ DKIM و SPF — الحماية الجزئية
SPF
يحدد أي IPs مسموح لها ترسل باسم الدومين. المستلم يتحقق — لو IP غريب = spam.
DKIM
توقيع رقمي على الإيميل. المستلم يتحقق إن الإيميل جاء فعلاً من هاد الدومين.
⚠️ SPF وDKIM على جانب المستلم فقط — ما يمنعون Open Relay! وجودهم لا يلغي خطر الـ Spoofing على سيرفرات ما عندها هاي الحماية.
الأدوات
اختر الأداة:
Nmap
telnet
Open Relay
User Enum
🔍 Nmap على SMTP
sudo nmap 10.129.14.128 -sC -sV -p25
PORT STATE SERVICE VERSION
25/tcp open smtp Postfix smtpd
|_smtp-commands: mail1.inlanefreight.htb,
PIPELINING, SIZE 10240000,
VRFY, ← User Enum مفعّل!
ETRN, ENHANCEDSTATUSCODES,
8BITMIME, DSN, SMTPUTF8, CHUNKING
🎯 VRFY في القائمة = ابدأ User Enumeration فوراً!
💡 smtpd_banner = "ESMTP Server" بدون إصدار — الـ admin أخفى الإصدار. لو ظهر "Postfix 3.4.13" = ابحث عن CVEs!
💻 telnet — User Enumeration بـ VRFY
telnet 10.129.14.128 25
220 ESMTP Server
# أول شي — تحقق إذا السيرفر صادق:
VRFY xxxxxxxxxxxxxxxxxxx
550 5.1.1 unknown ← صادق ✅
# لو رجع 252 = السيرفر يكذب!
# بعدها جرب الأسماء الحقيقية:
VRFY root
252 2.0.0 root ← ممكن موجود
VRFY cry0l1t3
252 2.0.0 cry0l1t3 ← ممكن موجود
💡 استخدم EXPN للـ mailing lists:
EXPN support → يعرض كل الأعضاء
EXPN support → يعرض كل الأعضاء
📡 Nmap — Open Relay Detection
sudo nmap 10.129.14.128 -p25 --script smtp-open-relay -v
PORT STATE SERVICE
25/tcp open smtp
| smtp-open-relay: Server is an open relay (16/16 tests)
| MAIL FROM:<> -> RCPT TO:<relaytest@nmap.scanme.org>
| MAIL FROM:<antispam@nmap.scanme.org> -> RCPT TO:<...>
| MAIL FROM:<antispam@ESMTP> -> RCPT TO:<...>
|_ ... (16 tests total)
💀 16/16 = Open Relay كامل! أي شخص يرسل إيميلات مزيفة عبر هاد السيرفر
💡 -v = verbose — يعرض تفاصيل كل test مش بس النتيجة
👤 smtp-user-enum — User Enumeration
أداة متخصصة لـ SMTP User Enumeration باستخدام VRFY أو EXPN أو RCPT:
الأمر الأساسي:
smtp-user-enum -M VRFY -U footprinting-wordlist.txt -t 10.129.14.128
######## Scan started ########
10.129.14.128: robin exists
10.129.14.128: admin exists
10.129.14.128: john <no result>
######## 2 results ########
مع verbose وtimeout:
smtp-user-enum -M VRFY -U footprinting-wordlist.txt -t 10.129.14.128 -v -w 15
# -v = verbose (شوف المحاولات)
# -w 15 = انتظر 15 ثانية لكل رد (للسيرفرات البطيئة)
خيارات الـ Method:
| Flag | الطريقة | الاستخدام |
|---|---|---|
| -M VRFY | VRFY command | الأكثر شيوعاً |
| -M EXPN | EXPN command | للـ mailing lists |
| -M RCPT | RCPT TO command | لو VRFY مغلق |
⚠️ تنبيهات مهمة:
• HTB توفر wordlist خاصة في Resources — استخدمها أول
• usernames غالباً = أسماء الموظفين (john.smith, jsmith)
• بعض السيرفرات بطيئة — زد الـ timeout بـ -w
• تحقق يدوياً أول: VRFY على اسم عشوائي — لو رجع 252 = السيرفر يكذب!
• HTB توفر wordlist خاصة في Resources — استخدمها أول
• usernames غالباً = أسماء الموظفين (john.smith, jsmith)
• بعض السيرفرات بطيئة — زد الـ timeout بـ -w
• تحقق يدوياً أول: VRFY على اسم عشوائي — لو رجع 252 = السيرفر يكذب!
Methodology
⛓️ خطوات الـ SMTP Footprinting
1
Nmap Scan
اكتشاف Port 25 + إصدار + الأوامر المدعومة
sudo nmap -sC -sV -p25 TARGET
👀 VRFY في القائمة؟ → User Enum ممكن
2
EHLO — تحقق من الميزات
شوف كل الميزات المدعومة
telnet TARGET 25
EHLO test
3
VRFY — User Enumeration
جرب أسماء من LinkedIn أو قوائم شائعة
VRFY root
VRFY admin
VRFY john.smith
⚠️ تحقق أول بـ VRFY على اسم عشوائي — السيرفر ممكن يكذب!
4
Open Relay Check
تحقق إذا السيرفر Open Relay
sudo nmap TARGET -p25 --script smtp-open-relay -v
5
لو Open Relay — Mail Spoofing
ترسل إيميل مزيف بهوية موثوقة
MAIL FROM: <ceo@company.com>
RCPT TO: <target@company.com>
🎯 Spear Phishing بهوية المدير = أخطر هجوم!
Explained — Q&A
🌐 الأساسيات
إيش الفرق بين Port 587 وPort 465؟
587 يستخدم STARTTLS — يبدأ الاتصال عادي بعدين يتحول للتشفير. 465 يستخدم SSL/TLS — مشفر من أول لحظة. الاثنين مشفرين بس وقت بدء التشفير مختلف.
ليش SMTP ما عنده authentication افتراضياً؟
لأنه بروتوكول قديم (1982) — صُمم قبل ما الأمان يكون أولوية. الحل جاء لاحقاً بـ ESMTP وAUTH PLAIN. لكن لا يزال بدون authentication للاتصالات بين السيرفرات.
🎭 Mail Spoofing
هل SPF وDKIM يمنعون Mail Spoofing كلياً؟
لا — يعملان على جانب المستلم فقط. لو Open Relay موجود المهاجم يرسل الإيميل المزيف. بعض المستلمين SPF/DKIM يكشفه ويحطه في spam. بعضهم ما عندهم SPF/DKIM = الإيميل يوصل مباشرة!
إيش الفرق بين Phishing وSpear Phishing؟
Phishing = إيميل لعدد كبير من الناس بشكل عام "فزت بجائزة". Spear Phishing = مستهدف لشخص معين بمعلومات شخصية "عزيزي John، بخصوص مشروعك مع قسم IT". الثاني أخطر لأنه مقنع ومخصص.
👤 VRFY و EXPN
ليش لا نثق بنتائج VRFY دايماً؟
بعض السيرفرات مضبوطة تقول 252 حتى لو اليوزر ما موجود! جرب VRFY على اسم عشوائي واضح — لو رجع 252 = السيرفر يكذب وما تقدر تثق بالنتائج.
إيش الفرق بين VRFY وEXPN؟
VRFY يتحقق من يوزر واحد. EXPN يوسّع mailing list — يعرض كل الأشخاص فيها. EXPN أخطر لأنه يكشف أسماء + إيميلات دفعة وحدة.
📤 إرسال إيميل
ليش الإيميل ينتهي بنقطة . وحدها؟
لأن DATA يقول للسيرفر "ابدأ الاستقبال" — السيرفر ما يعرف متى تنتهي. النقطة على سطر وحدها = إشارة "انتهيت". بعدها السيرفر يرسل 250 Ok: queued.
إيش يعني NOTIFY=success,failure؟
يطلب من السيرفر إرسال إشعار: success = لو الإيميل وصل، failure = لو ما وصل. مفيد في pentest لتأكيد إن الإيميل المزيف وصل للهدف.