Estouro de buffer baseado em pilha no MiniShare 1.4.1 acessível através de uma única requisição HTTP PUT.
Buffer overflow baseado em pilha no MiniShare 1.4.1 acessível através de uma única requisição HTTP PUT.
Este repositório faz parte do material que utilizo ao ensinar exploração de corrupção de memória (além do meu trabalho regular, também ministro cursos de segurança cibernética, onde ajudo a treinar a próxima geração de engenheiros reversos).
CVE-2020-13768 é um caso que uso quando quero mostrar como servidores simples expostos à rede podem exibir clássicos buffer overflows baseados em pilha através de métodos de protocolo padrão. O endpoint vulnerável não requer autenticação, o overflow é uma sobrescrita direta de EIP, e o caminho de exploração é limpo e bem definido. É um caso ideal para aprender a metodologia completa de exploração em um cenário remoto não autenticado realista.
O que também torna este caso interessante como exercício de ensino é que a mesma causa raiz — entrada não sanitizada copiada para um buffer de pilha de tamanho fixo — aparece em múltiplas entradas de CVE para o mesmo binário. CVE-2018-19861, CVE-2018-19862 e CVE-2019-17601 descrevem a mesma classe de vulnerabilidade, apenas reportadas por diferentes pesquisadores através de diferentes métodos HTTP ou endpoints. Isso ensina os alunos a olhar para as causas raiz, em vez de apenas números de CVE.
Essa vulnerabilidade afeta o MiniShare 1.4.1, um servidor HTTP leve para Windows descontinuado, projetado para compartilhamento simples de arquivos locais. O software foi escrito sem práticas modernas de segurança em mente. O que torna este caso particularmente interessante do ponto de vista didático é a combinação de fatores envolvidos:
Essa combinação torna o CVE-2020-13768 um excelente caso para ensinar os fundamentos da exploração de buffer overflow baseado em rede em um cenário não autenticado realista.
MiniShare é um servidor HTTP Windows minimalista originalmente projetado para compartilhamento rápido de arquivos locais em uma LAN. Ele escuta na porta TCP 80 e lida com um pequeno subconjunto de métodos HTTP, incluindo GET e PUT. O manipulador PUT processa requisições recebidas e copia o caminho URI para um buffer de pilha de tamanho fixo sem validar seu comprimento.
Detalhes técnicos principais:
MiniShare processa requisições HTTP recebidas e as despacha para o manipulador apropriado com base no método. O manipulador PUT extrai o caminho URI da requisição e o copia para um buffer de pilha de tamanho fixo sem verificar seu comprimento.
Uma versão simplificada da lógica vulnerável é assim:
char path_buffer[256];
strcpy(path_buffer, uri_path);
Como o buffer de destino tem tamanho fixo e o comprimento da entrada não é validado, enviar um URI suficientemente longo na requisição PUT faz com que a cópia escreva além do final do buffer, eventualmente alcançando e sobrescrevendo o endereço de retorno salvo (EIP) na pilha.
Quando a função vulnerável retorna, a CPU carrega o valor controlado pelo atacante da pilha para EIP e salta para ele. Se esse endereço aponta para dados controlados pelo atacante contendo shellcode, a execução arbitrária de código é alcançada.
A falha pode ser reproduzida enviando um URI excessivamente longo em uma requisição HTTP PUT. Nenhuma autenticação é necessária. Exemplo usando Python:
import socket
HOST = '127.0.0.1'
PORT = 80
payload = b"A" * 3000
request = (
b"PUT /" + payload + b" HTTP/1.1\r\n"
b"Host: 127.0.0.1\r\n"
b"Connection: close\r\n"
b"\r\n"
)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(request)
s.close()
Quando executado sob um depurador, a falha mostra EIP sobrescrito com dados controlados pelo usuário:
EIP = 41414141
confirmando que o endereço de retorno salvo foi corrompido pelo overflow.
O objetivo deste repositório não é apenas demonstrar a falha, mas também percorrer todo o processo de exploração passo a passo, seguindo a metodologia usada ao desenvolver explorações reais baseadas em pilha.
Para manter o README principal limpo, as notas detalhadas de exploração, scripts e etapas do depurador estão colocadas dentro da pasta Vulnerability 📂 deste repositório.
Lá você encontrará o fluxo de trabalho completo usado para explorar este CVE, incluindo: