buffer overflows julio auto - jam. roteiro introdução stack overflows heap overflows integer...

36
Buffer Overflows Julio Auto - jam

Upload: internet

Post on 22-Apr-2015

157 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Buffer Overflows Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

Buffer Overflows

Julio Auto - jam

Page 2: Buffer Overflows Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

Roteiro

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

Page 3: 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) No entanto, os conceitos se aplicam a

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

Page 4: Buffer Overflows Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

Introdução – Para Que Serve

LocalEscalação de privilégiosSUID

RemotoAcesso (de preferência root)

Page 8: Buffer Overflows Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

Stack Overflows (3)

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

Page 11: Buffer Overflows Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

Stack Overflows (5)

Page 13: Buffer Overflows Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

Stack Overflows (11)

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

Contra-contra-medidasret-into-libc

Page 19: Buffer Overflows Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

Heap Overflows

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

Page 20: Buffer Overflows Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

Heap Overflows (2)

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

Page 21: Buffer Overflows Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

Heap Overflows (5)

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

Page 25: Buffer Overflows Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

Integer Overflows (3)

Contra-medidasProgramação decente

Page 28: Buffer Overflows Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

Format String Attacks (5)

Contra-medidasProgramação decente

Page 33: Buffer Overflows Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

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 Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

Referências

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

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

Page 36: Buffer Overflows Julio Auto - jam. Roteiro Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências

Buffer Overflows

Julio Auto - jam