
Overflow de buffer baseado em pilha clássico no War FTP Daemon 1.65 demonstrando execução remota de código à moda antiga através de comandos FTP malformados.
Estouro de buffer baseado em pilha clássico no War FTP Daemon 1.65 demonstrando execução remota de código à moda antiga através de comandos FTP malformados.
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 leciono em diferentes cursos de cibersegurança onde ajudo a treinar a próxima geração de engenheiros reversos).
O CVE-2007-1567 é um caso que uso logo após introduzir os fundamentos das substituições diretas de EIP (vanilla EIP overwrites). A exploração é limpa e direta, mas traz um detalhe que a torna ligeiramente mais interessante do que um típico primeiro exercício: um caractere inválido extra que o protocolo FTP introduz e que os alunos devem identificar e contabilizar ao construir seu shellcode. É uma pequena restrição, mas suficiente para fazer os alunos pensarem, em vez de apenas copiarem uma técnica que já utilizaram.
O War FTP Daemon 1.65 é um servidor FTP legado para Windows do final dos anos 1990. A vulnerabilidade está no manipulador do comando USER, que usa sprintf para copiar dados fornecidos pelo usuário para um buffer de pilha de tamanho fixo sem validar seu comprimento. O que torna este caso útil para o ensino:
O War FTP Daemon é um servidor FTP para Windows originalmente escrito no final dos anos 1990. Ele escuta na porta TCP 21 e lida com comandos FTP padrão. A vulnerabilidade está no manipulador do comando USER, que processa o nome de usuário enviado por um cliente conectado usando sprintf sem validação de comprimento.
Principais detalhes técnicos:
O War FTP Daemon processa o comando USER passando o nome de usuário fornecido para sprintf, que o copia para um buffer de pilha de tamanho fixo sem verificar seu comprimento. Uma versão simplificada da lógica vulnerável se parece com isto:
char buffer[256];
sprintf(buffer, "%sCRLF", username);
Enviar uma string suficientemente longa como argumento USER 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 EIP e salta para ele.
A falha pode ser reproduzida enviando um argumento USER excessivamente longo via FTP. Nenhuma autenticação é necessária. Exemplo usando Python:
import socket
HOST = '127.0.0.1'
PORT = 21
payload = b"A" * 700
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.recv(1024)
s.send(b"USER " + payload + b"\r\n")
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 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 passos do depurador estão colocados dentro da pasta Vulnerability 📂 deste repositório.
Lá você encontrará o fluxo de trabalho completo usado para explorar este CVE, incluindo: