Top Banner
Buffer Overflows Julio Auto - jam
36

Buffer Overflows

Jan 13, 2016

Download

Documents

argyle

Buffer Overflows. Julio Auto - jam. Roteiro. Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências. Introdução - Prólogo. Fudamentos sobre Intel x86 Ambiente Linux/UNIX Pré-requisito: programação C (ou linguagem de sintaxe similar) - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Buffer Overflows

Buffer Overflows

Julio Auto - jam

Page 2: Buffer Overflows

Roteiro

Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

Page 3: Buffer Overflows

Introdução - Prólogo

Fudamentos sobre Intel x86 Ambiente Linux/UNIX Pré-requisito: programação C (ou

linguagem de sintaxe similar) No entanto, os conceitos se aplicam a

outros S.O.’s, arquiteturas e linguagens modernos

Page 4: Buffer Overflows

Introdução - Histórico

1970: Criação da Linguagem C, K&R 1988: Worm de Robert T. Morris Jr. 1996: Phrack publica “Smashing The

Stack For Fun And Profit”, de AlephOne 2001: “Exploiting Format String

Vulnerabilities”, de scut 2001: Phrack 57

Page 5: Buffer Overflows

Introdução – O Que É

Estouro da memória de um bufferStack/Heap overflows

Sobrescrita de dadosComportamento inesperadoDenial of ServiceExecução de código arbitrário

Page 6: Buffer Overflows

Introdução – O Que É (2)

/* buf é um array com capacidade para 8 int’s */

for (i = 0; i <= 8; i++)

buf[i] = 0;

/* o que acontece? */

Page 7: Buffer Overflows

Introdução – Para Que Serve

LocalEscalação de privilégiosSUID

RemotoAcesso (de preferência root)

Page 8: Buffer Overflows

Stack Overflows

A Stack é uma área do espaço de endereçamento de cada processoLIFO (Push/Pop)Manipulação indireta do ESP

“Empilha” (para baixo) chamadas às funções

Guarda parâmetros das funções Guarda variáveis locais às funções

Page 9: Buffer Overflows

Stack Overflows (2)

Cada função chamada cria um novo frameArmazenamento do endereço de retorno (call)Armazenamento do EBP

Ao término da função, o frame é destruídoEBP restauradoControle dado para a instrução apontada pelo

endereço de retorno (ret)

Page 10: Buffer Overflows

Stack Overflows (3)

Figura tirada de: http://www.unixwiz.net

Page 11: Buffer Overflows

Stack Overflows (4)

Imagine que “local var #2” é um array de 4 char’s

O que acontece quando executamos a seguinte linha de código passando uma string “evil” maior do que 3 caracteres?strcpy (localvar2, evil);

Page 12: Buffer Overflows

Stack Overflows (5)

Page 13: Buffer Overflows

Stack Overflows (6)

Sobrescrita de memória indevidaQual a importância dos valores na memória

sobrescrita?Quão importante são para o fluxo do

programa?Podemos controlar esses valores?

Page 14: Buffer Overflows

Stack Overflows (7)

Variáveis locais = (possivelmente) não tão importantes

EBP e EIP = problemas maioresControle do EIP = controle do fluxoMas controlar para onde?

Shellcode!

Page 15: Buffer Overflows

Stack Overflows (8)

ShellcodeCódigo a ser executado pelo programa

comprometidoPode ser armazenado no próprio buffer

Afinal de contas, código é apenas uma sequência de bytes

Page 16: Buffer Overflows

Stack Overflows (9)

Quanto espaço um shellcode precisa?Shell local ~ 24 bytesBindshell ~ 80 bytesNormalmente, menos do que há disponível

Page 17: Buffer Overflows

Stack Overflows (10)

Como saber o endereço do shellcode?Normalmente, a stack está sempre na mesma

posição quando o bug ocorreBrute-Force

Algumas melhoriasNOPsVariáveis de Ambiente

Page 18: Buffer Overflows

Stack Overflows (11)

Contra-medidasNon-exec stackASLR(Address Space Layout Randomization)Programação decente

Contra-contra-medidasret-into-libc

Page 19: Buffer Overflows

Heap Overflows

Heap = espaço para alocação de memória dinâmicamalloc()calloc()realloc() free()

Page 20: Buffer Overflows

Heap Overflows (2)

Diferentes implementações do algoritmo de memory management (malloc):Doug LeaBSD KingsleyBSD PHKSystem VYorktownRtlHeap

Page 21: Buffer Overflows

Heap Overflows (3)

Heap Overflows mais complicados de explicar que Stack OverflowsDependem da implementação do malloc

‘Chunks’ de malloc contêm headers:Tamanho do chunk,Tamanho do chunk anterior,Flags...

Page 22: Buffer Overflows

Heap Overflows (4)

O interessante agora é sobrescrever os valores desses headersO algoritmo pode fazer algo indevido se os

valores nos headers foram corrompidos Durante um free(), o algoritmo de Doug

Lea pode escrever o endereço de nosso buffer em outro endereço (arbitrário)

Page 23: Buffer Overflows

Heap Overflows (5)

Sobrescrita do endereço de retorno com o endereço do bufferBuffer = Shellcode

Double-free’sDois free()’s de um mesmo ponteiro também

corrompem as estruturas do mallocDepois disso, dois malloc()’s consecutivos

podem retornar o mesmo ponteiro

Page 24: Buffer Overflows

Heap Overflows (5)

Contra-medidasXWAjuda de heap profilers no desenvolvimentoProgramação decente

Page 25: Buffer Overflows

Integer Overflows

Estouro dos limites de um inteiro ie., um número muito grande para caber em

um int é “truncado” Como bug, sozinho não é tão perigoso Mas pode ser usado como vetor para o

disparo de outros bugs

Page 26: Buffer Overflows

Integer Overflows (2)

Antiga vulnerabilidade no OpenSSH:

input_userauth_info_response() em auth2-chall.c:

258 nresp = packet_get_int();259 if (nresp > 0) {260 response = xmalloc(nresp * sizeof(char*));261 for (i = 0; i < nresp; i++)262 response[i] = packet_get_string(NULL);263 }

Page 27: Buffer Overflows

Integer Overflows (3)

Contra-medidasProgramação decente

Page 28: Buffer Overflows

Format String Attacks

Format Strings são strings usadas para formatar um número arbitrário de parâmetros de tipo arbitrário em uma única string, eg.:/* sprintf (char *buffer, const char *format [, argument, ...]); */

sprintf(output, “Nome: %s\nNumero: %d\n”, nome, numero);printf(“Dados:\n%s”, output);

Page 29: Buffer Overflows

Format String Attacks (2)

E se uma format string recebe mais argumentos do que os que foram passados para a função?Ela vai ler (ou escrever) o que estiver na

stack

Page 30: Buffer Overflows

Format String Attacks (3)

O problema está quando o programa nos deixa controlar a format string:

Poderia ser feito diferente?

/* fprintf (FILE *stream, const char *format [, argument, ...]); */

fprintf(file, string);

/* fprintf (FILE *stream, const char *format [, argument, ...]); */

fprintf(file, “%s”, string);

Page 31: Buffer Overflows

Format String Attacks (4)

Format Strings maliciosas podem:Ler o conteúdo de qualquer lugar na memóriaEscrever qualquer valor em qualquer lugar da

memória O resto não é novidade:

Injeção do shellcode,Sobrescrita do endereço de retorno...

Page 32: Buffer Overflows

Format String Attacks (5)

Contra-medidasProgramação decente

Page 33: Buffer Overflows

Conclusões

Buffer Overflow é um dos tipos de bug mais comuns e mais perigosos

A exploração de um buffer overflow pode invalidar várias medidas de segurança:Firewalls,Criptografia...

Page 34: Buffer Overflows

Conclusões (2)

O mundo procura por soluções:Linguagens “seguras”,Softwares de bug-hunting,Proteções em memory-level...

Até lá, somente uma medida se mostra infalível:Programação decente

Page 35: Buffer Overflows

Referências

Phrack - http://www.phrack.org/ sshutup-theo -

http://packetstormsecurity.org/0207-exploits/sshutup-theo.tar.gz

Page 36: Buffer Overflows

Buffer Overflows

Julio Auto - jam