Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Próxima revisão
Revisão anterior
sas:buffer_overflow_-_informacoes_adicionais [2014/03/07 19:57] – created mazierosas:buffer_overflow_-_informacoes_adicionais [2014/08/01 20:20] (atual) – [Roteiro do experimento] maziero
Linha 1: Linha 1:
 +====== Buffer Overflow - Informações adicionais ======
 +
 +Baseado no experimento de [[http://www.cis.syr.edu/~wedu/seed/Labs/Vulnerability/Buffer_Overflow/|buffer overflow]] do Seed Project. Os comandos abaixo foram testados em plataforma Ubuntu 13.04 32 e 64 bits.
 +
 +<note warning>
 +Deve ser usado como informação complementar, não como substituto ao roteiro original!
 +</note>
 +
 +==== Roteiro do experimento ====
 +
 +Desligar proteção ASLR (//Adress Space Layout Randomization//) do kernel:
 +
 +<code>
 +sudo sysctl -w kernel.randomize_va_space=0
 +</code>
 +
 +Compilar ''stack.c'' sem a proteção de pilha do compilador:
 +
 +<code>
 +cc stack.c -o stack -fno-stack-protector -g
 +</code>
 +
 +Desligar o flag NX (No Executable Stack) no cabecalho do executável ELF:
 +
 +<code>
 +sudo apt-get install execstack
 +execstack stack
 +execstack -s stack
 +execstack stack
 +</code>
 +
 +Ajustar usuário e permissões do executável ''stack'':
 +
 +<code>
 +sudo chown root.root stack
 +sudo chmod 4755 stack
 +</code>
 +
 +Gerar um ''badfile'' qualquer para poder executar ''stack'' (sem //overflow//):
 +
 +<code>
 +echo "um teste..." > badfile
 +</code>
 +
 +Depurar ''stack'' para descobrir o endereço do ponteiro ''str'':
 +
 +<code>
 +gdb stack
 +   br 13           // insere breakpoint na linha 13 (strcpy)
 +   run             // inicia a execução
 +   print /x str    // obtém o valor do ponteiro str
 +   quit            // encerra o debugger
 +</code>
 +
 +Usar o valor obtido do ponteiro ''str'' para ajustar ''exploit.c'':
 +
 +  * compreenda a estrutura da pilha do programa ''stack.c'' dentro da chamada a ''bof()''
 +  * descubra que posição da variável ''buffer'' corresponde ao endereço de retorno da função ''bof''
 +  * escreva o código necessário em ''exploit.c'' para produzir um arquivo ''badfile'' que carregue o //shellcode// na memória do alvo e sobrescreva o endereço de retorno da função ''bof'' com o endereço do //shellcode//
 +  * Para ver o conteúdo de ''badfile'' use o comando ''hd'' (//hex dump//)
 +
 +Compilar e executar ''exploit.c'' para gerar o arquivo ''badfile'' malicioso:
 +
 +<code>
 +cc exploit.c -o exploit
 +./exploit
 +</code>
 +
 +Usar o ''badfile'' malicioso para explorar a vulnerabilidade de ''stack'':
 +
 +<code>
 +./stack
 +whoami
 +</code>
 +
 +Se tudo estiver certo, deve retornar um //prompt// de root (#) e o comando ''whoami'' deve informar ''root''. Se não funcionar, verificar:
 +
 +  * se estiver em uma partição de disco montada com o flag ''nosuid'' (verificar isso com o comando ''mount''), mover os arquivos ''stack'' e ''badfile'' para ''/tmp''
 +  * se a arquitetura do //shellcode// está correta (32 ou 64 bits).
 +
 +No caso de arquiteturas de 64 bits, [[http://blog.markloiseau.com/2012/06/64-bit-linux-shellcode|este site]] explica com detalhes a construção de um //shellcode// para processadores de 64 bits no padrão x86_64 (Intel/AMD). Outros //shellcodes// podem ser encontrados [[http://shell-storm.org/shellcode/|aqui]].
 +
 +==== Contornar a proteção ASLR ====
 +
 +Religar a proteção ASLR do kernel:
 +
 +<code>
 +sudo sysctl -w kernel.randomize_va_space=2
 +</code>
 +
 +Executar o ataque continuamente, para tentar contornar a proteção ASLR (pode demorar!):
 +
 +<code>
 +while true ; do ./stack ; done
 +</code>