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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
أدوات/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 لتنفيذ تعليمات عن بعد دون مصادقة.

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

الأكثر شعبية

عرض الكل →

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

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

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

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

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

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

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


🎯 ما هو CVE-2024-38077؟

الثغرة

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

┌─────────────────────────────────────────────────────────────┐
│  الثغرة: حساب خاطئ للحجم                                    │
├─────────────────────────────────────────────────────────────┤
│  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 متأثرة

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

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

┌─────────────────────────────────────────────────────────────────┐
│                      سلسلة الاستغلال                            │
├──────────┬──────────┬──────────┬──────────┬──────────┬─────────┤
│  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)
  • توليد أنماط لتحليل الأعطال
  • محاذاة البيانات بشكل صحيح

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

# 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: مع كل إقلاع/تشغيل، تتغير العناوين.

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

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

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

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

هيكل الوحدة

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

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

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

المصدركيفية عملهمتى يُستخدم
ManualLeakSourceيقدم المستخدم العناوينمختبر/تصحيح مع الوصول إلى الهدف
ResponseLeakSourceيستخرج من ردود RPCإذا كانت الخدمة تسرب المؤشرات
TimingLeakSourceقناة جانبية زمنيةنظري، صعب جدًا

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

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

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

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


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

ما هي؟

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

لماذا توجد؟

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

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

المكونات

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 # هل لديه مؤشر دالة؟

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

# كائن افتراضي بناءً على التحليل العكسي
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)

الحل

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)

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

# الكتابة فوق 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 - تهيئة الكومة

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

تنزيل الأداة