buffer overflows julio auto - jam. roteiro introdução stack overflows heap overflows integer...
Embed Size (px)
TRANSCRIPT

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

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

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

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? */

Introdução – Para Que Serve
LocalEscalação de privilégiosSUID
RemotoAcesso (de preferência root)

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

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)

Stack Overflows (3)
Figura tirada de: http://www.unixwiz.net

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);

Stack Overflows (5)

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?

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!

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

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

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

Stack Overflows (11)
Contra-medidasNon-exec stackASLR(Address Space Layout Randomization)Programação decente
Contra-contra-medidasret-into-libc

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

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

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...

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)

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

Heap Overflows (5)
Contra-medidasXWAjuda de heap profilers no desenvolvimentoProgramação decente

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

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 }

Integer Overflows (3)
Contra-medidasProgramação decente

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);

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

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);

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...

Format String Attacks (5)
Contra-medidasProgramação decente

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...

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

Referências
Phrack - http://www.phrack.org/ sshutup-theo -
http://packetstormsecurity.org/0207-exploits/sshutup-theo.tar.gz

Buffer Overflows
Julio Auto - jam