Estouro de buffer baseado em pilha no Sync Breeze Enterprise 10.0.28 acessível através do manipulador /login, demonstrando como o comprimento de entrada não verificado pode corromper a memória da pilha.
Estouro de buffer baseado na pilha no Sync Breeze Enterprise 10.0.28 acessível através do manipulador /login, demonstrando como a falta de verificação do comprimento da entrada pode corromper a memória da pilha.
Este repositório faz parte do material que uso ao ensinar exploração de corrupção de memória (além do meu trabalho regular, também leciono em diferentes cursos de segurança cibernética, onde ajudo a treinar a próxima geração de engenheiros reversos).
CVE-2017-14980 é um caso que utilizo quando quero que os alunos experimentem uma sobrescrita EIP vanilla sobre HTTP, em vez de um protocolo TCP bruto. Parece simples à primeira vista — um formulário de login, uma senha longa, uma falha — mas o contexto HTTP introduz um conjunto de caracteres problemáticos que não são imediatamente óbvios e que forçam os alunos a pensar sobre como os dados estão sendo processados antes de atingirem o buffer vulnerável. Entender por que %, &, + e = são caracteres ruins aqui exige compreender a codificação URL, o que é uma lição útil por si só.
Sync Breeze Enterprise é um aplicativo Windows de sincronização de arquivos que expõe uma interface de gerenciamento web. A vulnerabilidade está no manipulador de login, que copia o campo de senha para um buffer de pilha de tamanho fixo sem validação de comprimento. O que torna este caso útil para ensino:
Sync Breeze Enterprise é uma ferramenta de sincronização de arquivos para Windows que inclui um servidor web embutido para gerenciamento remoto. A interface web escuta na porta TCP 80 quando ativada e expõe um formulário de login em /login. A vulnerabilidade está no manipulador POST que processa o campo de senha.
Detalhes técnicos principais:
O Sync Breeze processa o formulário de login lendo o corpo POST e extraindo o campo de senha. O valor é copiado para um buffer de pilha de tamanho fixo sem verificar seu comprimento. Uma versão simplificada da lógica vulnerável se parece com isso:
char password_buffer[256];
strcpy(password_buffer, password_field);
O corpo POST é decodificado pela URL antes que a cópia ocorra, o que significa que caracteres como %25 são decodificados para % antes de atingir o buffer. É também por isso que certos caracteres especiais de URL atuam como caracteres ruins: eles são interpretados pela camada HTTP antes que os dados atinjam a operação de cópia vulnerável. Enviar um valor de senha suficientemente longo faz com que a cópia escreva além do final do buffer, sobrescrevendo o endereço de retorno salvo. Quando a função retorna, a CPU carrega o valor controlado pelo atacante da pilha para EIP e salta para ele.
A falha pode ser reproduzida enviando uma senha excessivamente longa em uma solicitação POST para /login. Nenhuma autenticação é necessária. Exemplo usando Python:
import socket
HOST = '127.0.0.1'
PORT = 80
payload = b"A" * 600
body = b"username=admin&password=" + payload
request = (
b"POST /login HTTP/1.1\r\n"
b"Host: 127.0.0.1\r\n"
b"Content-Type: application/x-www-form-urlencoded\r\n"
b"Content-Length: " + str(len(body)).encode() + b"\r\n"
b"Connection: close\r\n"
b"\r\n" +
body
)
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 estouro.
O objetivo deste repositório não é apenas demonstrar a falha, mas percorrer o processo completo de exploração passo a passo, desde o fuzzing até um shell reverso funcional.
Para manter o README principal limpo, as notas detalhadas de exploração, scripts e etapas do depurador estão na pasta Vulnerability 📂 deste repositório.
Lá você encontrará o fluxo de trabalho completo usado para explorar este CVE, incluindo: