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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2022-37969PoC — درس تعليمي حول CVE-2022-37969 مع التركيز على منهجية استغلال النواة، وليس على الأسباب الداخلية لـ CVE | Kitploit
أدوات/GitHubGitHub/emilc3978/cve-2022-37969poc
تصعيد الامتيازاتتحليل الذاكرة الجنائيتحليل الثغرات الأمنيةالاستغلالالهندسة العكسيةالتعلم والتعليماستغلال الملفات الثنائية
GitHubemilc3978/cve-2022-37969poc

CVE-2022-37969PoC

درس تعليمي حول CVE-2022-37969 مع التركيز على منهجية استغلال النواة، وليس على الأسباب الداخلية لـ CVE

عرض المستودع
28منذ 10 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

المحتويات

مقدمة عامة

تم إنشاء هذا لتوضيح الجوانب العامة المتعلقة باستغلال ثغرات Windows. يشرح المفاهيم الأساسية المطبقة على CVE-2022-37969. النتيجة النهائية هي PoC عامل. لا يوضح كل جانب من جوانب الثغرة، لكنه يوفر قطعًا قابلة لإعادة الاستخدام من الكود ويشرح الآليات التي يمكن العثور عليها في العديد من الاستغلالات العامة.

المستخدم المستهدف هو مهندس هندسة عكسية مبتدئ، أو مطور استغلالات يبحث عن كود مصدري لبرهان مفهوم عامل لاختباره وفهم أساسيات Windows الداخلية. يوفر نقطة مرجعية لمزيد من التعلم.

المتطلبات: تصحيح أخطاء أساسي للنواة، هندسة عكسية أساسية، أساسيات Windows الداخلية، مهارات برمجة c/c++

السياق

البرنامج هو قطعة من الكود تعمل على جهاز. عمومًا، يستقبل البرنامج بيانات (مدخلات) ويجري حسابات باستخدام المدخلات ويولّد بيانات (مخرجات). معظم البرامج كتبها بشر، وبالتالي تحتوي على أخطاء. ينشأ الخطأ عن كود مصدري لم يُكتب بشكل صحيح (أراد المبرمج فعل شيء ما بالمدخلات، لكن الكود الناتج كان مختلفًا عن النتيجة المقصودة). تُصحح معظم الأخطاء قبل إطلاق المنتج، لكن يبقى بعضها. يحدث هذا لأن هناك أنواعًا مختلفة من الأخطاء، بعضها يصعب اكتشافه أكثر من البعض الآخر.

Windows هو برنامج كمبيوتر، كتبه بشر، وبالتالي يحتوي على أخطاء. لماذا هذا مهم؟ لأن أنظمة Windows يمكنها تشغيل برامج تتعامل مع بيانات حساسة مثل الحسابات المصرفية وقواعد بيانات الرعاية الصحية وغيرها. يمكن استخدام بعض الأخطاء للوصول بشكل غير قانوني إلى بيانات مقيدة (هذه حالة استخدام جيدة للاستغلال).

هناك أنواع متعددة من الأخطاء، بعضها مفيد وبعضها ليس كذلك. عمومًا، تنشأ الأخطاء من مدخلات تُعطى للبرنامج، وبالتزامن مع سطور الكود التي كُتبت بشكل خاطئ، تولّد مخرجات أو سلوكًا غير سليم للبرنامج. إيجاد تلك المدخلات هو وظيفة أخصائي الأمن (أو الهاكر). الخطوة التالية هي تقييم المخرجات/السلوك غير السليم الناتج والإجابة على السؤال: «هل يمكن استخدامه بطريقة مفيدة؟». هنا تُصنف الأخطاء إلى فئات مختلفة. على سبيل المثال، قد يولّد خطأ سلوكًا يفسد بعض هياكل البيانات ويؤدي إلى إعادة تشغيل الكمبيوتر المستهدف. فائدته محدودة. قد يتسبب خطأ ما في كتابة المدخلات في منطقة ذاكرة تتحكم في أذونات الوصول إلى الملفات المقيدة. هذا النوع من الأخطاء أكثر فائدة.

إذن، من مجموعة كل الأخطاء الممكنة، يبحث الهاكر عن المجموعة الفرعية الأكثر فائدة لغرضه. بشكل عام، المشكلة هي: «هل يمكنني إعطاء البرنامج المستهدف مدخلات مصممة خصيصًا بحيث لا أكسر النظام ولكن يمكنني رفع مستوى وصولي والاستفادة؟»

بعد هذه المقدمة غير التقنية، يمكن صياغة نطاق البرنامج التعليمي: هل يمكننا العثور على برنامج Windows يقبل مدخلات غير سليمة، ونتيجة لرمز مطور خاطئ، يمكنه رفع أذوناتنا بشكل غير قانوني من مستخدم عادي إلى مسؤول؟

البرنامج المستهدف: Windows CLFS (Common Log File System Driver)

اسم الاستغلال: CVE-2022-37969

النوع: رفع امتيازات محلي (Local Privilege Escalation)

تحميل ISO القابل للاستغلال: حمّله من هنا

النظرية العامة لرفع الامتيازات في Windows

مساحة عناوين Windows مقسمة تقريبًا بين مساحة المستخدم (تشغيل البرامج العامة) ومساحة النواة (تشغيل نظام التشغيل نفسه وبرامج مكونات العتاد --> برامج التشغيل). لا يجب على المستخدم العادي الوصول إلى مساحة النواة، لكن هناك آليات يمكن من خلالها لبرامج المستخدم العادي الوصول إلى أجزاء من كود النواة (استدعاءات النظام، إجراءات برامج التشغيل). لماذا نحتاج إلى الوصول؟ للتفاعل مع نظام التشغيل بطريقة آمنة ومنضبطة، وهذا ما يوفره مصممو نظام التشغيل.

تستخدم بعض برامج التشغيل مدخلات بيانات يقدمها المستخدم للعمل على هياكل بيانات في مساحة النواة. إذا ولّد الإدخال خطأً، فقد تتلف النواة. إحدى الحالات هي Common Log File System Driver. باستخدام بعض المدخلات الخاصة، يمكننا إجبار برنامج التشغيل على تغيير هياكل بيانات النواة التي تحتوي على مستوى وصول الامتيازات للمستخدم، والكتابة فوق المستخدم العادي بقيمة المسؤول.

ما الذي يجب تعديله لرفع الامتياز إلى صلاحيات المسؤول؟

نبدأ بالهدف النهائي في أذهاننا. يخزن Windows داخل هيكل بيانات في النواة يُسمى _EPROCESS معلومات لكل عملية تعمل على النظام. مثال على _Eprocess

من الحقول المهمة struct _EX_FAST_REF Token. هذا هيكل بيانات آخر يشير بدوره إلى بيانات تتعلق بمستوى امتياز تلك العملية. في الصورة التالية، تمتلك عملية System رمز نظام (system token)، وعملية Explorer تمتلك رمز مستخدم عادي.

Tokens

إذن، لرفع امتياز Explorer.exe نحتاج إلى نسخ القيمة من System's _EPROCESS-->Token إلى Explorer's _EPROCESS-->Token. سنحقق شيئًا مشابهًا عن طريق نسخ Token النظام إلى Token الخاص ببرنامجنا وتشغيل موجه أوامر من العملية المرفوعة الامتيازات (العمليات الفرعية ترث Token العملية الأب).

لإكمال هذه الإجراءات، نحتاج إلى آليات من أجل:

  1. الحصول على عنوان هيكل بيانات _EPROCESS في النواة
  2. قراءة قيمة حقل Token لعملية System
  3. الحصول على عنوان هيكل بيانات _EPROCESS لعملية Explorer
  4. كتابة قيمة Token الخاص بـ System في إزاحة Token الخاصة بـ Explorer داخل هيكل _EPROCESS الخاص بها

تحديد موقع هيكل بيانات _EPROCESS لعملية مستهدفة باستخدام PID

مقدمة: طبيعة Windows عبر السنوات: مع اكتشاف ثغرات جديدة، احتاج Windows إلى تصحيحات للتخفيف من حدتها. ومع ظهور تقنيات جديدة، احتاج Windows إلى تحديثات ليبقى قادرًا على المنافسة. كان أحد المتطلبات الحاسمة هو التوافق مع الإصدارات السابقة. وأحيانًا كان يتم تحقيق الأمن عبر الغموض (obscurity). أُزيلت هياكل البيانات وتعريفات الدوال من الأدلة، لكن الوظائف بقيت. من خلال الهندسة العكسية، تمكن الباحثون من استخدام تلك الوظائف لأغراض متنوعة.

للعثور على عنوان _EPROCESS في النواة، سنستخدم دالة غير موثقة: NtQuerySystemInformation (انظر الرابط للاطلاع على المعاملات). باستخدام معامل SystemInformationClass يمكننا تحديد نوع المعلومات التي نريد استرجاعها. سنسترجع معلومات عامة عن العمليات بتحديد قيمة SystemExtendedHandleInformation (#define SystemExtendedHandleInformation 0x40).

من المحاذير في استخدام NtQuerySystemInformation أننا لا نعرف مسبقًا طول البيانات التي سيتم إرجاعها، لكن NtQuerySystemInformation لديها آلية تساعد في ذلك. إذا تم استدعاؤها بمصفوفة ذات حجم خاطئ للبيانات المطلوبة، فإنها تُرجع ERROR والحجم الصحيح للبيانات الذي كان يجب طلبه. يمكن استخدام هذا لقراءة معلومات العملية بشكل صحيح بالطريقة التالية:

  1. استدعِ NtQuerySystemInformation بمعامل SystemInformationLength وهمي
  2. اقرأ قيمة المعامل ReturnLength المُعاد
  3. استدعِ NtQuerySystemInformation مرة أخرى بقيمة SystemInformationLength الصحيحة التي تم إرجاعها سابقًا

بنية البيانات المُرجعة هي من النوع PSYSTEM_HANDLE_INFORMATION_EX. هذا هيكل بيانات غير موثق (انظر الرابط) ويقود إلى هيكل بيانات SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX، الذي يحمل في الحقل Object عنوان النواة لهيكل بيانات _Eprocess للعملية المقابلة.

إذن المنطق سيكون: التكرار عبر جميع عناصر PSYSTEM_HANDLE_INFORMATION_EX، ومقارنة حقل UniqueProcessId في SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX مع PID الخاص بالعملية المطلوبة، واختيار حقل Object المقابل للعثور على عنوان _Eprocess الخاص بها في النواة.

مقتطف من الكود:

proc_1 proc_2

يُعلَن NtQuerySystemInformation كمؤشر إلى دالة، ويتم الحصول على عنوانه ديناميكيًا في وقت التشغيل عبر loadlibrary و getprocaddress.

  1. typedef NTSTATUS(WINAPI* ptr_NtQuerySystemInformation)(int, PVOID, ULONG, PULONG);
  2. ntdll=LoadLibrary(L"ntdll.dll");
  3. MyNtQuerySystemInformation = (ptr_NtQuerySystemInformation)GetProcAddress(ntdll, "NtQuerySystemInformation");

لقراءة وكتابة Token، سيتعين علينا الاعتماد على ثغرات داخل clfsw32.sys و NamedPipes.

قراءة وكتابة البيانات في النواة باستخدام الأنابيب (Pipes)

تنزيل الأداة