
Clássico estouro de buffer baseado em pilha no SLMail 5.1 mostrando como servidores de e-mail antigos podiam ser comprometidos por comandos SMTP e POP3 de tamanho excessivo.
Estouro clássico de buffer baseado em pilha no SLMail 5.5, mostrando como servidores de e-mail antigos poderiam ser comprometidos por meio de comandos SMTP e POP3 superdimensionados.
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 dou aulas em diferentes cursos de cibersegurança, onde ajudo a treinar a próxima geração de engenheiros reversos).
CVE-2003-0264 é um dos primeiros casos que apresento ao ensinar estouros de buffer baseados em pilha sobre um protocolo de rede. É limpo, bem documentado e o caminho de exploração é direto: sem SEH, sem egghunter, sem restrições de espaço. O aluno envia um payload, sobrescreve o EIP, cai em um gadget JMP ESP e obtém um shell. Essa clareza é exatamente o que o torna útil como ponto de partida.
O SLMail 5.5 é um servidor de e-mail legado para Windows. A vulnerabilidade está no serviço POP3, especificamente no manipulador do comando PASS, que copia a entrada do usuário diretamente para um buffer de pilha de tamanho fixo, sem qualquer validação de comprimento. O que torna este caso particularmente útil para ensino é a quantidade reduzida de componentes móveis:
Essa combinação — voltado para rede, não autenticado, sobrescrita direta do EIP, sem mitigações modernas — faz do CVE-2003-0264 um dos exemplos mais limpos do mundo real de um estouro de pilha que ainda funciona em versões modernas do Windows.
O SLMail é um servidor de e-mail para Windows que fornece serviços SMTP, POP3 e administração. O serviço POP3 escuta na porta TCP 110 e lida com comandos padrão de recuperação de e-mails. A vulnerabilidade está no manipulador do comando PASS, que processa o argumento de senha enviado por um cliente conectado.
Detalhes técnicos importantes:
O serviço POP3 do SLMail processa o comando PASS copiando o argumento de senha fornecido para um buffer de pilha de tamanho fixo usando uma função insegura sem verificação de comprimento. Uma versão simplificada da lógica vulnerável se parece com isto:
char password_buffer[256];
strcpy(password_buffer, pass_argument);
Enviar uma string suficientemente longa como argumento do PASS faz com que a cópia ultrapasse o final do buffer, corrompendo a pilha até que o endereço de retorno salvo seja sobrescrito. Quando a função retorna, a CPU carrega o valor controlado pelo atacante da pilha para o EIP e salta para ele.
A falha pode ser reproduzida enviando um argumento PASS superdimensionado via POP3. Nenhuma credencial válida é necessária. Exemplo usando Python:
import socket
HOST = '127.0.0.1'
PORT = 110
payload = b"A" * 3000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.recv(1024)
s.send(b"USER username\r\n")
s.recv(1024)
s.send(b"PASS " + payload + b"\r\n")
s.close()
Quando executado sob um depurador, a falha mostra o 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 todo o processo 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: