Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2024-38077-MadLicense-exploit — Framework de exploits modular para CVE-2024-38077 (desbordamiento de montón de RDL de Windows) con bypass de ASLR, preparación de montón, generación de cadenas ROP y cargas útiles de inyección de DLL para ejecución remota de código sin autenticación previa. | Kitploit
Herramientas/GitHubGitHub/ermensonx/cve-2024-38077-madlicense-exploit
Frameworks de ExploitsAnálisis de VulnerabilidadesExplotaciónIngeniería InversaShellcodePruebas de PenetraciónAprendizaje y EducaciónDesarrollo de PayloadsExplotación de Binarios
GitHubermensonx/cve-2024-38077-madlicense-exploit

CVE-2024-38077-MadLicense-exploit

Framework de exploits modular para CVE-2024-38077 (desbordamiento de montón de RDL de Windows) con bypass de ASLR, preparación de montón, generación de cadenas ROP y cargas útiles de inyección de DLL para ejecución remota de código sin autenticación previa.

Ver Repositorio
112hace 9 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2024-38077 MadLicense - Framework de Explotación Completo

📚 Documentación Técnica para Presentación

Este documento explica cada componente del framework, por qué existe, y cómo funciona la explotación de heap buffer overflow en Windows moderno.


🎯 ¿Qué Es CVE-2024-38077?

La Vulnerabilidad

El Windows Remote Desktop Licensing Service (lserver.exe) contiene un heap buffer overflow en la función CDataCoding::DecodeData.

┌─────────────────────────────────────────────────────────────┐
│  VULNERABILIDAD: Cálculo incorrecto de tamaño             │
├─────────────────────────────────────────────────────────────┤
│  1. Cliente envía datos Base64 de tamaño N                │
│  2. Servidor calcula: buffer_size = (N / 4) * 3            │
│  3. Servidor asigna buffer de 'buffer_size' bytes          │
│  4. Decode Base64 REALMENTE escribe: ceil(N * 3/4) bytes   │
│  5. Si N no es múltiplo de 4: ¡OVERFLOW!                   │
└─────────────────────────────────────────────────────────────┘

Ejemplo concreto:

  • Input: 4001 bytes
  • Cálculo servidor: (4001 / 4) * 3 = 1000 * 3 = 3000 bytes asignados
  • Decode real: ceil(4001 * 0.75) = 3001 bytes escritos
  • Overflow: 1 byte (pero controlable para más)

¿Por Qué Es Crítico?

  1. Pre-Auth: No necesita credenciales
  2. Remoto: Vía red, puerto 135 (RPC)
  3. SYSTEM: Servicio corre como NT AUTHORITY\SYSTEM
  4. Común: Windows Server 2000-2025 afectados

🏗️ Arquitectura del Framework

Visión General de los Módulos

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

📦 Módulo 1: primitives.py - Fundación

¿Qué Es?

Utilidades de bajo nivel para manipulación de memoria.

¿Por Qué Existe?

Los exploits necesitan:

  • Convertir entre tipos (int ↔ bytes)
  • Generar patrones para crash analysis
  • Alinear datos correctamente

Funciones Principales

# Pack/Unpack - Convertir enteros a bytes y viceversa
p64(0xDEADBEEF)      # → b'\xef\xbe\xad\xde\x00\x00\x00\x00'
p32(0x41414141)      # → b'AAAA'
u64(b'\x41\x42...')  # → 0x... (int)

# Patrón Cíclico - Para identificar offset de crash
cyclic(100)          # Genera secuencia De Bruijn
cyclic_find(pattern, value)  # Encuentra offset del valor

# Alineación - Memoria necesita estar alineada
align(0x1003, 0x10)  # → 0x1010 (alinea a 16 bytes)

¿Por Qué Esto Importa?

Problema real: Causas un crash y el RIP contiene 0x61616171.

  • Sin cyclic: "En algún lugar de mi buffer..."
  • Con cyclic: cyclic_find(pattern, 0x61616171) → ¡offset exacto!

📦 Módulo 2: leak.py - Bypass de ASLR

¿Qué Es ASLR?

Address Space Layout Randomization: En cada boot/ejecución, las direcciones cambian.

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

¿Por Qué Necesitamos Leak?

Sin saber dónde está la memoria:

  • No sabemos dónde colocar payload
  • No sabemos dirección de los gadgets ROP
  • Cualquier intento = crash aleatorio

Estructura del Módulo

class LeakInfo:
    """Contenedor para direcciones filtradas"""
    heap_base: int         # Base del heap
    ntdll_base: int        # Base de ntdll.dll
    kernel32_base: int     # Base de kernel32.dll
    # ...

class LeakProvider:
    """Orquestador de fuentes de leak"""
    sources: List[LeakSource]
    
    def obtain() -> LeakInfo:
        # Intenta cada fuente hasta conseguirlo

Fuentes de Leak Implementadas

FuenteCómo FuncionaCuándo Usar
ManualLeakSourceUsuario proporciona direccionesLab/Debug con acceso al objetivo
ResponseLeakSourceExtrae de respuestas RPCSi el servicio filtra punteros
TimingLeakSourceSide-channel de tiempoTeórico, muy difícil

¿Por Qué Input Manual?

En demostraciones/labs, puedes:

  1. Adjuntar depurador al objetivo
  2. Ver base de los módulos
  3. Proporcionar vía --ntdll-base 0x7ffa...

Esto simula tener un leak real, permitiendo probar el resto de la cadena.


📦 Módulo 3: target_model.py - Mapeo del Objetivo

¿Qué Es?

Modelado de las estructuras de datos vulnerables y adyacentes.

¿Por Qué Existe?

Overflow ≠ Explotación. Necesitamos saber:

  • ¿Qué estamos sobrescribiendo?
  • ¿Cuál es el tamaño del objeto?
  • ¿Qué campo es útil corromper?

Componentes

class VulnerableBuffer:
    """El buffer que va a sufrir overflow"""
    allocation_size: int   # Cuánto se asignó
    write_size: int        # Cuánto se escribirá
    overflow_amount: int   # Diferencia = overflow
    
    def calculate_overflow(input_size):
        # Simula el 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 (adyacente en el heap)"""
    fields: List[StructField]
    has_vtable: bool       # ¿Tiene tabla virtual?
    has_function_ptr: bool # ¿Tiene puntero de función?

Ejemplo de Estructura Objetivo

# Objeto hipotético basado en análisis reverso
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)

¿Por Qué is_target=True?

Marca campos útiles para explotación:

  • vtable: Si sobrescribimos, controlamos llamadas de método
  • callback: Si sobrescribimos, controlamos cuando se llama al callback

📦 Módulo 4: write_primitive.py - Escritura Controlada

El Problema

Overflow escribe datos secuenciales. Pero necesitamos:

  • Escribir valor específico (dirección de nuestro ROP)
  • En offset específico (donde está el puntero vtable)

La Solución

Descargar herramienta