Buffer overflow baseado em SEH no Easy File Sharing Web Server 7.2 demonstrando como um parâmetro HTTP POST autenticado pode corromper a cadeia do manipulador de exceções.
Estouro de buffer baseado em SEH no Easy File Sharing Web Server 7.2 demonstrando como um parâmetro autenticado de HTTP POST pode corromper a cadeia do manipulador de exceção.
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 cibersegurança, onde ajudo a treinar a próxima geração de engenheiros reversos).
CVE-2018-18912 é o caso que uso para fazer a transição de sobrescritas de EIP convencionais para exploração baseada em SEH. Uma vez que os alunos entendem como funciona uma sobrescrita direta do endereço de retorno, o próximo passo é entender o que acontece quando a pilha está tão corrompida que o programa dispara uma exceção antes de retornar, e como essa cadeia de manipuladores de exceção se torna a superfície de ataque. Este CVE demonstra essa transição de forma limpa: o estouro é profundo o suficiente para alcançar a cadeia SEH, e o caminho de exploração segue a clássica técnica POP POP RETN que todo desenvolvedor de exploits precisa entender. O bypass opcional de DEP via ROP fica como uma extensão para alunos que quiserem ir além — o mesmo estouro, uma estratégia diferente de gadgets, um problema muito mais difícil.
Esta vulnerabilidade afeta o Easy File Sharing Web Server 7.2, um aplicativo de servidor web leve para Windows amplamente utilizado para compartilhamento simples de arquivos. O software foi escrito sem considerar mitigações modernas de segurança. 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-2018-18912 um excelente caso para ensinar técnicas de desenvolvimento de exploits além do básico.
O Easy File Sharing Web Server 7.2 é um aplicativo Windows que permite aos usuários compartilhar arquivos via HTTP. Ele inclui funcionalidades como navegação de arquivos, autenticação de usuários e um sistema de fórum integrado.
A funcionalidade de fórum aceita requisições POST para criar novos tópicos. Um dos campos de formulário manipulados por esse endpoint é o parâmetro author. Internamente, o aplicativo copia esse valor controlado pelo usuário para um buffer de pilha de tamanho fixo sem validar o comprimento.
A vulnerabilidade foi descoberta e reportada em 2018. O PoC original foi publicado logo em seguida, demonstrando tanto a falha quanto uma cadeia de exploração funcional, incluindo gadgets ROP do módulo ImageLoad.dll incluso.
Principais detalhes técnicos:
O Easy File Sharing Web Server processa requisições HTTP POST direcionadas a /forum.ghp quando um usuário cria um novo tópico no fórum. Um dos parâmetros aceitos é o author, que é copiado para um buffer de pilha local sem nenhuma verificação de comprimento.
Ao reverter o binário, pode-se observar que o manipulador desse campo de formulário usa um buffer de tamanho fixo e uma operação de cópia insegura. Uma versão simplificada da lógica vulnerável é assim:
char author_buffer[64];
strcpy(author_buffer, user_input);
Como o buffer de destino tem tamanho fixo e o comprimento da entrada não é validado, enviar uma string suficientemente longa no campo author faz com que a cópia escreva além do final do buffer.
Conforme mais dados são escritos, o layout da pilha é corrompido. Diferente de uma simples sobrescrita de endereço de retorno, o estouro alcança a cadeia do Structured Exception Handler (SEH) armazenada na pilha. Quando uma exceção é disparada como resultado da pilha corrompida, o SO percorre a cadeia SEH e transfere o controle para o endereço do manipulador controlado pelo atacante.
O fluxo de exploração, portanto, segue a técnica de sobrescrita de SEH:
Isso torna a vulnerabilidade mais complexa de explorar do que uma sobrescrita básica de EIP, mas também mais representativa de cenários do mundo real.
A falha pode ser reproduzida enviando uma string longa no parâmetro author de uma requisição POST para /forum.ghp após autenticar com credenciais válidas. Exemplo usando Python:
import socket
HOST = '127.0.0.1'
PORT = 80
payload = b"A" * 500
request = (
b"POST /forum.ghp?forumid=1 HTTP/1.1\r\n"
b"Host: 127.0.0.1\r\n"
b"Content-Type: application/x-www-form-urlencoded\r\n"
b"Cookie: UserID=test; PassWD=test; SESSIONID=1234\r\n"
b"Connection: close\r\n"
b"\r\n"
b"author=" + payload + b"&passwd=test&title=test&content=test&Submit=Submit\r\n"
)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(request)
s.close()
Quando executada sob um depurador, a falha mostra uma cadeia SEH corrompida e uma violação de acesso, confirmando que dados controlados pelo usuário sobrescreveram o ponteiro do manipulador de exceção.
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 no desenvolvimento de exploits reais baseados em SEH.
Para manter o README principal limpo, as notas detalhadas de exploração, scripts e etapas de depuração estão localizadas na pasta Vulnerability 📂 deste repositório.
Lá você encontrará o fluxo de trabalho completo usado para explorar este CVE, incluindo: