Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2024-38077-MadLicense-exploit — Framework di exploit modulare per CVE-2024-38077 (heap overflow di Windows RDL) con bypass ASLR, heap grooming, generazione di catene ROP e payload di iniezione DLL per esecuzione remota di codice pre-autenticazione. | Kitploit
Strumenti/GitHubGitHub/ermensonx/cve-2024-38077-madlicense-exploit
Framework di ExploitAnalisi delle VulnerabilitàExploitReverse EngineeringShellcodePenetration TestingApprendimento e FormazioneSviluppo PayloadBinary Exploitation
GitHubermensonx/cve-2024-38077-madlicense-exploit

CVE-2024-38077-MadLicense-exploit

Framework di exploit modulare per CVE-2024-38077 (heap overflow di Windows RDL) con bypass ASLR, heap grooming, generazione di catene ROP e payload di iniezione DLL per esecuzione remota di codice pre-autenticazione.

Vedi Repository
1129 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2024-38077 MadLicense - Framework di Exploit Completo

📚 Documentazione Tecnica per la Presentazione

Questo documento spiega ogni componente del framework, perché esiste, e come funziona lo sfruttamento dell'heap buffer overflow su Windows moderno.


🎯 Cos'è CVE-2024-38077?

La Vulnerabilità

Il Windows Remote Desktop Licensing Service (lserver.exe) contiene un heap buffer overflow nella funzione CDataCoding::DecodeData.

┌─────────────────────────────────────────────────────────────┐
│  VULNERABILITÀ: Calcolo errato della dimensione            │
├─────────────────────────────────────────────────────────────┤
│  1. Il client invia dati Base64 di dimensione N            │
│  2. Il server calcola: buffer_size = (N / 4) * 3           │
│  3. Il server alloca un buffer di 'buffer_size' byte       │
│  4. La decodifica Base64 REALMENTE scrive: ceil(N * 3/4) byte │
│  5. Se N non è multiplo di 4: OVERFLOW!                    │
└─────────────────────────────────────────────────────────────┘

Esempio concreto:

  • Input: 4001 byte
  • Calcolo del server: (4001 / 4) * 3 = 1000 * 3 = 3000 byte allocati
  • Decodifica reale: ceil(4001 * 0.75) = 3001 byte scritti
  • Overflow: 1 byte (ma controllabile per di più)

Perché è Critico?

  1. Pre-Auth: Non servono credenziali
  2. Remoto: Via rete, porta 135 (RPC)
  3. SYSTEM: Il servizio gira come NT AUTHORITY\SYSTEM
  4. Diffuso: Windows Server 2000-2025 interessati

🏗️ Architettura del Framework

Panoramica dei Moduli

┌─────────────────────────────────────────────────────────────────┐
│                      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)                          │
    └───────────────────────────────────────────────────────────┘

📦 Modulo 1: primitives.py - Fondamenta

Cos'è?

Utility di basso livello per la manipolazione della memoria.

Perché Esiste?

Gli exploit necessitano di:

  • Convertire tra tipi (int ↔ byte)
  • Generare pattern per l'analisi dei crash
  • Allineare correttamente i dati

Funzioni Principali

# Pack/Unpack - Convertire interi in byte e viceversa
p64(0xDEADBEEF)      # → b'\xef\xbe\xad\xde\x00\x00\x00\x00'
p32(0x41414141)      # → b'AAAA'
u64(b'\x41\x42...')  # → 0x... (int)

# Pattern Ciclico - Per identificare l'offset del crash
cyclic(100)          # Genera sequenza di De Bruijn
cyclic_find(pattern, value)  # Trova l'offset del valore

# Allineamento - La memoria deve essere allineata
align(0x1003, 0x10)  # → 0x1010 (allinea a 16 byte)

Perché è Importante?

Problema reale: Causi un crash e il RIP contiene 0x61616171.

  • Senza cyclic: "Da qualche parte nel mio buffer..."
  • Con cyclic: cyclic_find(pattern, 0x61616171) → offset esatto!

📦 Modulo 2: leak.py - Bypass di ASLR

Cos'è l'ASLR?

Address Space Layout Randomization: A ogni avvio/esecuzione, gli indirizzi cambiano.

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

Perché Ci Serve un Leak?

Senza sapere dove si trova la memoria:

  • Non sappiamo dove mettere il payload
  • Non conosciamo l'indirizzo dei gadget ROP
  • Qualsiasi tentativo = crash casuale

Struttura del Modulo

class LeakInfo:
    """Container per indirizzi divulgati"""
    heap_base: int         # Base dell'heap
    ntdll_base: int        # Base di ntdll.dll
    kernel32_base: int     # Base di kernel32.dll
    # ...

class LeakProvider:
    """Orchestratore delle fonti di leak"""
    sources: List[LeakSource]
    
    def obtain() -> LeakInfo:
        # Prova ogni fonte finché non ci riesce

Fonti di Leak Implementate

FonteCome FunzionaQuando Usarla
ManualLeakSourceL'utente fornisce gli indirizziLab/Debug con accesso al target
ResponseLeakSourceEstratto dalle risposte RPCSe il servizio fa trapelare puntatori
TimingLeakSourceSide-channel temporaleTeorico, molto difficile

Perché Input Manuale?

In demo/lab, puoi:

  1. Attaccare un debugger al target
  2. Vedere la base dei moduli
  3. Fornirla tramite --ntdll-base 0x7ffa...

Questo simula un leak reale, permettendo di testare il resto della catena.


📦 Modulo 3: target_model.py - Mappatura del Target

Cos'è?

Modellazione delle strutture dati vulnerabili e adiacenti.

Perché Esiste?

Overflow ≠ Exploit. Dobbiamo sapere:

  • Cosa stiamo sovrascrivendo?
  • Qual è la dimensione dell'oggetto?
  • Quale campo è utile corrompere?

Componenti

class VulnerableBuffer:
    """Il buffer che subirà l'overflow"""
    allocation_size: int   # Quanto è stato allocato
    write_size: int        # Quanto verrà scritto
    overflow_amount: int   # Differenza = overflow
    
    def calculate_overflow(input_size):
        # Simula il bug di calcolo
        alloc = (input_size // 4) * 3
        actual = ((input_size + 3) // 4) * 3
        return alloc, actual, actual - alloc

class AdjacentObject:
    """Oggetto che verrà corrotto (adiacente nell'heap)"""
    fields: List[StructField]
    has_vtable: bool       # Ha una tabella virtuale?
    has_function_ptr: bool # Ha un puntatore a funzione?

Esempio di Struttura Target

# Oggetto ipotetico basato su reverse engineering
license_req = AdjacentObject(
    name="CLicenseRequest",
    typical_size=0x100,
    has_vtable=True
)

# Campi mappati
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)

Perché is_target=True?

Marca i campi utili per lo sfruttamento:

  • vtable: Se la sovrascriviamo, controlliamo le chiamate ai metodi
  • callback: Se lo sovrascriviamo, controlliamo quando il callback viene invocato

📦 Modulo 4: write_primitive.py - Scrittura Controllata

Il Problema

L'overflow scrive dati sequenziali. Ma ci serve:

  • Scrivere un valore specifico (indirizzo del nostro ROP)
  • A un offset specifico (dove si trova il puntatore alla vtable)

La Soluzione

Scarica lo strumento