Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2017-0261 — CVE-2017-8570 Exp وتحليل عينات الاستغلال | Kitploit
أدوات/GitHubGitHub/erfze/cve-2017-0261
تحليل الثغرات الأمنيةالاستغلالتحليل البرمجيات الخبيثةالأوراق والأبحاثالتعلم والتعليماستغلال الملفات الثنائية
GitHuberfze/cve-2017-0261

CVE-2017-0261

CVE-2017-8570 Exp وتحليل عينات الاستغلال

عرض المستودع
منذ 5 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2017-0261 وتحليل العينة المستغلة

0x01 وصف الثغرة

  • السبب: عند فتح مستند Office، يتم استخدام FLTLDR.EXE لعرض ملف EPS المضمن الذي يحتوي على الثغرة. هذا الملف مكتوب بلغة PostScript ويمكن للمهاجم استغلاله من خلال عملية "save-restore"، وهو في جوهره ثغرة UAF. عندما يفتح المستخدم ملفًا يحتوي على صورة رسومية غير صحيحة، أو عندما يقوم المستخدم بإدراج صورة رسومية غير صحيحة في ملف Office، يمكن استغلال الثغرة.

  • الإصدارات المتأثرة: Microsoft Office 2010 Service Pack 2, Microsoft Office 2013 Service Pack 1, Microsoft Office 2016

  • POC: kcufId's Github

0x02 تحليل POC

لقد بحثت طويلاً على الإنترنت، لكني لم أجد حزمة Office تحتوي على EPSIMP32.FLT. لحسن الحظ، قدم الأستاذ kcufId أداة LoadEps.exe لتحميل ملفات EPS، شكرًا للأستاذ kcufId.

LoadEps.exe أولاً يقوم بتحميل EPSIMP32.FLT:

صورة 1 تحميل EPSIMP32.FLT

ثم يستدعي ImportGr لبدء تحميل ملف EPS:

صورة 2 ImportGr

هنا نتابع مباشرة باستخدام F7، ثم نتمكن من التوقف عند نقطة التوقف التي تم تعيينها داخل EPSIMP32.FLT.


قبل الدخول في الموضوع، دعنا نقدم بنية كائن Postscript.

root@kitploit:~
// PostScript Object
struct PostScript object
{
    dword    type;
    dword    attr;
    dword    value1;
    dword    value2;    // if array, point to userdict where store the array object
}ps_obj;

حيث أن القيم المقابلة لـ type المختلفة هي كالتالي:

root@kitploit:~
0x0       	nulltype
0x3       	integertype
0x5       	realtype
0x8       	booleantype
0x10      	operatortype
0x20      	marktype
0x40      	savetype
0x300     	nametype
0x500     	stringtype
0x900     	filetype
0x30000   	arraytype          
0x0B0000 	packedarraytype
0x70000 	packedarraytype
0x110000  	dicttype
0x210000  	gstatetype

كمثال على السلسلة النصية، نشرح هيكل تخزينها. من خلال تعيين نقطة توقف في دالة forall، يمكننا معرفة كيفية معالجتها للسلاسل النصية (لمعرفة كيفية تحديد موقع دالة forall، راجع https://paper.seebug.org/368/).

صورة 3 هيكل تخزين السلسلة النصية

الصورة رقم 1 تقابل ps_obj، حيث يشير حقل value2 إلى العنصر المقابل في قائمة الفهارس (الصورة رقم 2). يشير عنصر الفهرس إلى بنية بحجم 0x30، في الموقع 0x24 من هذه البنية يوجد مؤشر لمؤشر إلى بنية بحجم 0x28 (الصورة رقم 5)، والموقع 0x2C يحفظ حجم السلسلة النصية (الصورة رقم 3). في الصورة رقم 5، الموقع 0x4 من البنية يخزن عنوان العنصر المقابل في قائمة الفهارس (أي 0x01DB5E94 من الصورة رقم 4)، والموقع 0x20 يشير إلى موقع التخزين النهائي للسلسلة النصية (الصورة رقم 6)، والموقع 0x24 هو الحجم الفعلي للذاكرة المشغولة — حجم السلسلة النصية + 1.

بنية بحجم 0x30:

root@kitploit:~
+0x0  dword   
+0x4  dword
+0x8  dword
+0xc  dword
+0x10 dword
+0x14 dword
+0x18 dword
+0x1c dword
+0x20 dword
+0x24 dword   pp_struct      //指向大小为0x28结构的指针的指针
+0x28 dword 
+0x2c dword   size           //字符串实际大小

بنية بحجم 0x28 (إذا كانت مصفوفة، فإن حجم البنية هو 0x2C، والموقع 0x28 يشير إلى عناصر المصفوفة، كل عنصر هو ps_obj):

root@kitploit:~
+0x0  dword
+0x4  dword					//存储该结构于索引列表中对应项的地址
+0x8  dword
+0xc  dword
+0x10 dword
+0x14 dword
+0x18 dword
+0x1c dword
+0x20 dword  ptr_object 	//指向字符串最终存储位置
+0x24 dword  size      		//实际所占内存大小,字符串实际大小+1

أول تشغيل للثغرة:

صورة 4 التشغيل الأول

أولاً، يتم حفظ حالة VM في المتغير l62، ثم يتم استدعاء عملية l61 ——>>l59 ——>>l56 لكل حرف في المتغير l63. يقوم l62 restore باستعادة الحالة السابقة، وبالتالي يتم تحرير مساحة الذاكرة المخصصة بواسطة l63 بعد العبارة /l62 save def، مما يجعلها مؤشرًا معلقًا.

صورة 5 l95-l99

المتغيرات l95-l99 تحدد التدفق اللاحق، وقيمها كلها 0 (أي 32 بت):

صورة 6 exch_proc

التشغيل الثاني للثغرة، أولاً يتم تخصيص مساحة ذاكرة بحجم 0x27 (ستشغل فعليًا 0x28) لتخزين l63:

صورة 7 l63

ثم يقوم l62 restore باستعادة الحالة السابقة، مما يؤدي إلى تحرير مساحة الذاكرة المخصصة بواسطة l63، وبالتالي تصبح مؤشرًا معلقًا. بعد ذلك، يتم تنفيذ l100، وسيتم استخدام مساحة الذاكرة التي كانت تشغلها l63 سابقًا لتخزين بنية 0x28 للسلسلة النصية l102 (أي l136) (وهذا يفسر لماذا خصصت l63 مساحة بحجم 0x27):

صورة 8 l102

الحصول على القيم في المواقع 0x4 و 0x20 و 0x24 من هذه البنية:

صورة 9 الحصول على القيم

أخيرًا، تعديل محتوى السلسلة النصية l136 (يوضح الشكل التعديلات الجزئية فقط):

صورة 10 بناء السلسلة النصية

هذه التعديلات مبنية بعناية، وسيتم استخدامها عند التشغيل الثالث للثغرة.

التشغيل الثالث للثغرة، يتم تخصيص مصفوفة تحتوي على 0x37 عنصرًا، ثم في الدورة عند العنصر 0x34 يتم تنفيذ l62 restore:

صورة 11 تدفق التشغيل الثالث

بعد تنفيذ restore، يتم استبدال بنية 0x30 للمصفوفة بمحتوى السلسلة النصية l193:

صورة 12 المحتوى المستبدل

وبهذا، يصبح الكائن الذي يتم تنفيذه في عملية forall الأخيرة (0x36) هو بنية 0x30 في الشكل أعلاه، والوصول إلى العنصر 0x36 منه سيؤدي إلى السلسلة النصية التي تم بناؤها بعناية أثناء التشغيل الثاني للثغرة:

صورة 13 الحصول على عنصر المصفوفة

والعنصر الذي تم الحصول عليه من المصفوفة هو مصفوفة بحجم 4، وعنصرها الأول هو سلسلة نصية بعنوان بداية 0 وحجم 0x7FFFFFFF:

صورة 14 محتوى عنصر المصفوفة

سيتم تخزين هذه المصفوفة في المتغير l159، وسيتم تخزين عنصرها الأول — السلسلة النصية بعنوان بداية 0 وحجم 0x7FFFFFFF — في المتغير l201، وبعد ذلك يمكن الحصول على قيمة أي عنوان من خلال المتغير l201.

الحصول على العنوان الأساسي لـ kernel32.dll:

صورة 15 الحصول على العنوان الأساسي -1

صورة 16 الحصول على العنوان الأساسي -2

وبهذا، يحتوي المتغير l314 على العنوان الأساسي لـ EPSIMP32.FLT.

صورة 17 الحصول على العنوان الأساسي -3

ملاحظة: بناء جملة الأمر search كما يلي:

صورة 18 search

البحث عن gadget محدد:

صورة 19 gadget-1

صورة 20 gadget-2

بناء هيكل من نوع file:

root@kitploit:~
	l199 l201 get_dword                          
    /l487 exch def
    l487 l201 get_dword
    /l488 exch def
    l488 36 my_add l201 get_dword
    /l489 exch def
    l489 l201 get_dword
    /l490 exch def
    l490 32 my_add l201 get_dword
    /l491 exch def
    l199 l491 l201 put_data_to_array
    l199 12 my_sub 2304 l201 put_data_to_array

صورة 21 بناء نوع file

كتابة البيانات المنشأة إلى العنوان l492 (l491+0x32):

root@kitploit:~
		l492 0 l201 put_data_to_array                 %% 0x00 0
        l492 4 my_add l375 l201 put_data_to_array     %% 0x04 Address of <5E C3>
        l492 8 my_add l373 l201 put_data_to_array     %% 0x08 Address of <94 00 00 00 00 5E C3> 
        l492 12 my_add l377 l201 put_data_to_array    %% 0x0C Address of <C2 0C 00>
        l492 16 my_add l370 l201 put_data_to_array    %% 0x10 Address of VirtualProtect()
        l492 20 my_add 0 l201 put_data_to_array       %% 0x14 0
        l492 24 my_add 0 l201 put_data_to_array       %% 0x18 0
        l492 28 my_add 0 l201 put_data_to_array       %% 0x1C 0
        l492 32 my_add l368 l201 put_data_to_array    %% 0x20 Address of Shellcode
        l492 36 my_add l368 l201 put_data_to_array    %% 0x24 Address of Shellcode——lpAddress
        l492 40 my_add l349 l201 put_data_to_array    %% 0x28 Size of Shellcode——dwSize
        l492 44 my_add 64 l201 put_data_to_array      %% 0x2C PAGE_EXECUTE_READWRITE——flNewProtect
        l492 48 my_add l493 l201 put_data_to_array    %% 0x30 lpflOldProtect

أخيرًا، عند تنفيذ تعليمة closefile، يتم الانتقال إلى Shellcode:

صورة 22 closefile

0x03 تحليل العينة

توجد البرامج النصية لاستغلال EPS في الدليل \word\media، ويمكن رؤيتها بعد فك الضغط. تتشابه عينات استغلال هذه الثغرة باستثناء جزء Shellcode، لذلك سنأخذ إحدى العينات من منظمة Patchword كمثال للتحليل.

اسم الملف: Cyber_Secure_Pakistan.docx

MD5: DD89BBB916A2C909630EC78CBB0E13E5

الانتقال إلى Shellcode، واستعادة المكدس:

صورة 23 استعادة المكدس

تخصيص الذاكرة:

صورة 24 VirtualAlloc

الحصول على عنوان استدعاء الدالة:

صورة 25 عنوان استدعاء الدالة

أثناء التصحيح، ربما بسبب مشكلة في البيئة لم يتم الحصول على عنوان استدعاء الدالة CreateToolhelp32Snapshot بنجاح:

صورة 26 CreateToolhelp32Snapshot

نقوم بإدخال العنوان يدويًا وفتح Word لمتابعة التحليل.

تعداد العمليات، والبحث عن WINWORD.exe:

صورة 27 تعداد العمليات

إنشاء برنامج باسم MSBuild.exe في الدليل C:\ProgramData\Microsoft\DeviceSync:

صورة 28 إنشاء MSBuild.exe

كتابة محتوى الملف، حيث يتم تخزين هذا المحتوى في المتغير payload_32 داخل البرنامج النصي EPS:

صورة 29 WriteFile

صورة 30 payload_32

إنشاء ملف vmtools.dll:

صورة 31 إنشاء vmtools.dll

كتابة محتوى الملف، حيث يتم تخزين هذا المحتوى في المتغير payload_32_f2 داخل البرنامج النصي EPS:

صورة 32 WriteFile

صورة 33 payload_32_f2

إنشاء ملف VMwareCplLauncher.exe:

صورة 34 إنشاء VMwareCplLauncher.exe

يتم تخزين محتواه في المتغير payload_32_f1 داخل البرنامج النصي EPS:

صورة 35 payload_32_f1

هذا الملف هو ملف أبيض (موثوق) موقّع من Vmware:

صورة 36 توقيع Vmware

حقن المحتوى التالي في explorer.exe:

صورة 37 حقن explorer.exe

وظيفته هي إنشاء عملية VMwareCplLauncher.exe:

صورة 38 إنشاء عملية VMwareCplLauncher.exe

تم ذكر التدفق اللاحق في هذا التقرير من 360، وهذه المقالة لا تتناول جزء التحليل الخاص به في الوقت الحالي:

صورة 39 التدفق

يمكن للقارئ المهتم قراءة المزيد من هذا التقرير.

ملاحظة: تتشابه عينات استغلال هذه الثغرة بشكل أساسي، والاختلاف يكمن في الحمولة النهائية MSBuild.exe، والتي يتم تخزينها في المتغير payload_32 داخل البرنامج النصي EPS، ويمكن تفريغها مباشرة، وبعد إكمال رأس ملف DOS يمكن سحبها إلى IDA للتحليل.

0x04 الروابط المرجعية

  • EPS Processing Zero-Days Exploited by Multiple Threat Actors
  • CVE-2015-2545 تحليل عينة استغلال Word
  • PostScript LANGUAGE REFERENCE
  • تحليل عينة هجوم الثغرة الأحدث من مجموعة Patchwork والإنذار المبكر
تنزيل الأداة