Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2024-38077-MadLicense-exploit — Modulares Exploit-Framework für CVE-2024-38077 (Windows RDL Heap Overflow) mit ASLR-Bypass, Heap-Grooming, ROP-Ketten-Generierung und DLL-Injection-Payloads für Pre-Auth Remote Code Execution. | Kitploit
Tools/GitHubGitHub/ermensonx/cve-2024-38077-madlicense-exploit
Exploit-FrameworksSchwachstellenanalyseExploitationReverse EngineeringShellcodePenetrationstestsLernen & BildungPayload-EntwicklungBinary-Exploitation
GitHubermensonx/cve-2024-38077-madlicense-exploit

CVE-2024-38077-MadLicense-exploit

Modulares Exploit-Framework für CVE-2024-38077 (Windows RDL Heap Overflow) mit ASLR-Bypass, Heap-Grooming, ROP-Ketten-Generierung und DLL-Injection-Payloads für Pre-Auth Remote Code Execution.

Repository anzeigen
111vor 9 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2024-38077 MadLicense - Vollständiges Exploitation-Framework

📚 Technische Dokumentation zur Präsentation

Dieses Dokument erklärt jede Komponente des Frameworks, warum sie existiert und wie die Ausnutzung eines Heap-Buffer-Overflows auf modernem Windows funktioniert.


🎯 Was ist CVE-2024-38077?

Die Schwachstelle

Der Windows Remote Desktop Licensing Service (lserver.exe) enthält einen Heap-Buffer-Overflow in der Funktion CDataCoding::DecodeData.

┌─────────────────────────────────────────────────────────────┐
│  VULNERABILIDADE: Cálculo incorreto de tamanho             │
├─────────────────────────────────────────────────────────────┤
│  1. Cliente envia dados Base64 de tamanho N                │
│  2. Servidor calcula: buffer_size = (N / 4) * 3            │
│  3. Servidor aloca buffer de 'buffer_size' bytes           │
│  4. Decode Base64 REALMENTE escreve: ceil(N * 3/4) bytes   │
│  5. Se N não é múltiplo de 4: OVERFLOW!                    │
└─────────────────────────────────────────────────────────────┘

Konkretes Beispiel:

  • Eingabe: 4001 Bytes
  • Serverberechnung: (4001 / 4) * 3 = 1000 * 3 = 3000 Bytes alloziert
  • Tatsächliches Decoding: ceil(4001 * 0.75) = 3001 Bytes geschrieben
  • Overflow: 1 Byte (aber auf mehr erweiterbar)

Warum ist es kritisch?

  1. Pre-Auth: Keine Anmeldedaten erforderlich
  2. Remote: Über Netzwerk, Port 135 (RPC)
  3. SYSTEM: Der Dienst läuft als NT AUTHORITY\SYSTEM
  4. Verbreitet: Windows Server 2000-2025 betroffen

🏗️ Framework-Architektur

Modulübersicht

┌─────────────────────────────────────────────────────────────────┐
│                      EXPLOIT CHAIN                              │
├──────────┬──────────┬──────────┬──────────┬──────────┬─────────┤
│  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)                          │
    └───────────────────────────────────────────────────────────┘

📦 Modul 1: primitives.py - Fundament

Was ist das?

Low-Level-Utilities zur Speichermanipulation.

Warum existiert es?

Exploits benötigen:

  • Konvertierung zwischen Typen (int ↔ bytes)
  • Generierung von Mustern für die Crash-Analyse
  • Korrekte Ausrichtung von Daten

Hauptfunktionen

# Pack/Unpack - Converter inteiros para bytes e vice-versa
p64(0xDEADBEEF)      # → b'\xef\xbe\xad\xde\x00\x00\x00\x00'
p32(0x41414141)      # → b'AAAA'
u64(b'\x41\x42...')  # → 0x... (int)

# Padrão Cíclico - Para identificar offset de crash
cyclic(100)          # Gera sequência De Bruijn
cyclic_find(pattern, value)  # Encontra offset do valor

# Alinhamento - Memória precisa estar alinhada
align(0x1003, 0x10)  # → 0x1010 (alinha para 16 bytes)

Warum ist das wichtig?

Reales Problem: Du verursachst einen Crash und das RIP enthält 0x61616171.

  • Ohne cyclic: „Irgendwo in meinem Buffer ..."
  • Mit cyclic: cyclic_find(pattern, 0x61616171) → exakter Offset!

📦 Modul 2: leak.py - ASLR-Bypass

Was ist ASLR?

Address Space Layout Randomization: Bei jedem Boot/Start ändern sich die Adressen.

Boot 1:  ntdll.dll @ 0x7FFA12340000
Boot 2:  ntdll.dll @ 0x7FFB98760000
Boot 3:  ntdll.dll @ 0x7FFC55550000

Warum brauchen wir einen Leak?

Ohne zu wissen, wo sich der Speicher befindet:

  • Wir wissen nicht, wo wir den Payload platzieren sollen
  • Wir kennen die Adressen der ROP-Gadgets nicht
  • Jeder Versuch = zufälliger Crash

Modulstruktur

class LeakInfo:
    """Container para endereços vazados"""
    heap_base: int         # Base do heap
    ntdll_base: int        # Base do ntdll.dll
    kernel32_base: int     # Base do kernel32.dll
    # ...

class LeakProvider:
    """Orquestrador de fontes de leak"""
    sources: List[LeakSource]
    
    def obtain() -> LeakInfo:
        # Tenta cada fonte até conseguir

Implementierte Leak-Quellen

QuelleFunktionsweiseWann verwenden
ManualLeakSourceBenutzer stellt Adressen bereitLab/Debug mit Zugriff auf das Ziel
ResponseLeakSourceExtrahiert aus RPC-AntwortenWenn der Dienst Zeiger preisgibt
TimingLeakSourceZeitlicher SeitenkanalTheoretisch, sehr schwierig

Warum manuelle Eingabe?

In Demonstrationen/Labs kannst du:

  1. Einen Debugger an das Ziel anhängen
  2. Die Basisadressen der Module ansehen
  3. Über --ntdll-base 0x7ffa... angeben

Das simuliert einen echten Leak und ermöglicht es, den Rest der Kette zu testen.


📦 Modul 3: target_model.py - Ziel-Mapping

Was ist das?

Modellierung der verwundbaren und angrenzenden Datenstrukturen.

Warum existiert es?

Overflow ≠ Exploitation. Wir müssen wissen:

  • Was überschreiben wir?
  • Wie groß ist das Objekt?
  • Welches Feld ist nützlich zu korrumpieren?

Komponenten

class VulnerableBuffer:
    """O buffer que vai sofrer overflow"""
    allocation_size: int   # Quanto foi alocado
    write_size: int        # Quanto será escrito
    overflow_amount: int   # Diferença = overflow
    
    def calculate_overflow(input_size):
        # Simula o bug de cálculo
        alloc = (input_size // 4) * 3
        actual = ((input_size + 3) // 4) * 3
        return alloc, actual, actual - alloc

class AdjacentObject:
    """Objeto que será corrompido (adjacente no heap)"""
    fields: List[StructField]
    has_vtable: bool       # Tem tabela virtual?
    has_function_ptr: bool # Tem ponteiro de função?

Beispiel einer Zielstruktur

# Objeto hipotético baseado em análise reversa
license_req = AdjacentObject(
    name="CLicenseRequest",
    typical_size=0x100,
    has_vtable=True
)

# Campos mapeados
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)

Warum is_target=True?

Markiert für die Exploitation nützliche Felder:

  • vtable: Wenn wir es überschreiben, kontrollieren wir Methodenaufrufe
  • callback: Wenn wir es überschreiben, kontrollieren wir, wann der Callback aufgerufen wird

📦 Modul 4: write_primitive.py - Kontrolliertes Schreiben

Das Problem

Der Overflow schreibt sequenzielle Daten. Aber wir brauchen:

  • Einen spezifischen Wert schreiben (Adresse unseres ROP)
  • An einem spezifischen Offset (wo sich der vtable-Zeiger befindet)

Die Lösung

Tool herunterladen