Remote Fuzzing
Até agora, concluímos um exercício de buffer overflow local, que cobriu todas as partes essenciais de um exercício de buffer overflow baseado em pilha. Quando se trata de exploração remota, a principal diferença estaria nos scripts de exploração, enquanto as partes principais da exploração de buffer overflow são as mesmas.
Debugging A Remote Program
Estejamos depurando um programa local ou um que escuta conexões remotas, teremos que instalá-lo e depurá-lo localmente em nossa VM do Windows. Assim que nosso exploit estiver totalmente desenvolvido, poderemos executá-lo no serviço remoto sem precisar de acesso local. Se feito corretamente, o exploit deverá funcionar, como veremos mais adiante.
Desta vez, estaremos depurando um programa chamado CloudMe
, uma ferramenta de usuário final para um serviço de compartilhamento de arquivos, encontrada na área de trabalho da VM do Windows abaixo. Como um serviço de compartilhamento de arquivos, esta ferramenta escuta em uma porta quaisquer atualizações do servidor de arquivos. Podemos ver isso se a ferramenta estiver em execução e listamos as portas de escuta em Powershell
Como podemos ver, o serviço está escutando na porta 8888
e também estabeleceu uma conexão com um servidor remoto. Podemos usar o netcat
programa no Desktop para interagir com esta porta e ver se ela aceita algum parâmetro:
Fuzzing Remote Port
Assim que nosso programa estiver em execução e estivermos conectados a ele x32dbg
, podemos começar a difusá-lo e tentar travá-lo. Ao contrário da difusão local, onde gravamos nossas cargas em um arquivo e depois abrimos o arquivo em nosso aplicativo ou copiamos manualmente nossa carga em um campo de texto no programa, com a difusão remota podemos automatizar esse processo por meio de nosso exploit Python.
Criaremos um novo script chamado win32bof_exploit_remote.py
e começaremos adicionando algumas variáveis para IP
e port
, para que possamos alterá-las facilmente se quisermos usar o script em outro servidor. Então, escreveremos nossa função fuzzing def fuzz():
. Queremos enviar incrementos de strings grandes, começando com 500
bytes e incrementando a 500
cada iteração, até enviarmos uma string longa o suficiente que trave o programa. Para fazer isso, faremos um loop em um intervalo de 0
até 10,000
com incrementos de 500
, como segue:
Gradual Fuzzing
Enfrentamos o problema aqui porque nosso programa nunca para de enviar cargas, já que o serviço de escuta nunca falha. Então, como poderíamos saber em que tamanho do buffer o programa travou?
Podemos enviar gradualmente nosso buffer adicionando um breakpoint()
after s.send(buffer)
, de modo que, quando pudermos continuar manualmente pressionando c
, possamos ver se nossa entrada travou o programa e sobrescreveu EIP
.
Então, adicionaremos nosso ponto de interrupção ao nosso exploit, reiniciaremos o programa x32dbg
e começaremos gradualmente a confundir o programa:
Depois que o programa trava e EIP
é sobrescrito, sabemos que a última quantidade de bytes que enviamos foi o que travou o programa e que o programa está vulnerável a um buffer overflow.
Last updated