Buffer overflow group

31
Buffer Overflow Group Bruno Cabral Thiago Emanuel Waldson Rodrigues São Cristovão-SE 09 de Setembro de 2014

description

Buffer overflow

Transcript of Buffer overflow group

Page 1: Buffer overflow group

Buffer Overflow Group

Bruno CabralThiago Emanuel

Waldson Rodrigues

São Cristovão-SE09 de Setembro de 2014

Page 2: Buffer overflow group

Roteiro da apresentação1. Contexto histórico

2. O que é

3. Como funciona

4. Metasploit Framework

5. Payload

6. Exploit

7. Tipos de ataque baseados em Buffer Overflow

7.1- Stack

7.2- Heap

7.3- Return to libc

8. O que são shellcodes

9. Ferramentas Preventivas

9.1- Nessus

9.2- Nmap

10. Estudo de Caso

10.1- Nessus

10.2- Invasão utilizando exploit

Page 3: Buffer overflow group

Contexto HistóricoA documentação mais antiga de Buffer Overflow data de 1988. Foi uma das muitas vulnerabilidades exploradas pelo Morris worm para se propagar pela internet.

O programa-alvo foi um serviço Unix, chamado fingerd.

O worm sobrescrevia uma flag autenticada do fingerd para criar uma nova cópia dele mesmo

O Morris worm ou Internet worm foi um dos primeiros worms distribuídos pela

Internet; trata-se também do primeiro worm a receber atenção da mídia.

Ele foi escrito por Robert Tappan Morris, estudante da Cornell University e para

despistar sua origem, foi disseminado a partir do MIT em 2 de Novembro de

1988. Curiosamente, hoje Robert Morris é professor do MIT.

Disquete contendo o código fonte do worm Morris, no Museu de Ciências de Boston

Page 4: Buffer overflow group

Contexto HistóricoEm 1995, Thomas Lopatic redescobriu sozinho o buffer overflow e publicou seus achados na lista de emails da Bugtraq.

Um ano depois, Elias Levy (Também conhecido como Aleph One), publicou na revista Phrack, o artigo “Smashing the Stack for Fun and Profit” (Arrasando a Pilha por Diversão e Lucro), uma introdução passo-a-passo para realizar um stack-based buffer overflow.

Link do artigo: http://pt.slideshare.net/alexeymiasoedov/smashing-the-stack-

for-fun-and-profit

Page 5: Buffer overflow group

Contexto HistóricoDesde então, pelo menos 2 worms mais conhecidos exploraram buffer overflows para comprometer um número grande de sistemas.

Em 2001, o Code Red Worm explorou um buffer overflow no ISS (Internet Information Services) 5.0 da Microsoft.

- Iniciou um ataque de negação de serviço distribuída (DDoS) na Casa Branca

GET/default.ida?NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a

Page 6: Buffer overflow group

Contexto Histórico

Em 2003, o worm SQL Slammer colocou em risco máquinas rodando o Microsoft SQL Server 2000.

Page 7: Buffer overflow group

Contexto Histórico

Hosts infectados do SQL Slammer as 05:29 de 25 de janeiro de 2003

Page 8: Buffer overflow group

Contexto Histórico

Hosts infectados do SQL Slammer as 06:00 de 25 de janeiro de 2003

Page 9: Buffer overflow group

Contexto Histórico

Ainda em 2003, buffer overflows em jogos licenciados para o vídeo-game Xbox da Microsoft foram explorados para permitir que softwares não licenciados rodassem no console sem a necessidade de modificações no hardware, conhecidas por modchips.

O PS2 Independence Exploit também usou um buffer overflow para conseguir o mesmo efeito para o video-game Playstation 2 da Sony

Page 10: Buffer overflow group

“Um código realizando tal função não checa os endereços de fonte e destino apropriadamente, permitindo que partes do monitor sejam superpostas pelo usuário. Isso pode ser usado para injetar códigos no monitor que irão permitir o usuário a tomar o controle da máquina.”

Buffer Overflows foram entendidos por volta de 1972, quando o Computer Security Technology Planning Study (documento de planejamento de estudos da USAF) definiu a técnica como o seguinte:

O que é?

Page 11: Buffer overflow group

Em computação, um buffer é uma região temporária da memória onde são guardados dados para serem transportados de um lugar para o outro.

Uma aplicação freqüente de um buffer é quando dados são capturados de um dispositivo de entrada (um teclado ou mouse, por exemplo) e enviados à um dispositivo de saída(monitor,impressora).

Antes de tudo...O que é um Buffer?

E overflow?O conceito básico de um overflow é um transbordamento, ou seja, um overflow ocorre quando o volume de determinado objeto ou substância é maior do que a capacidade de seu compartimento.

Page 12: Buffer overflow group

Como funciona?O buffer overflow é um erro de programação que pode resultar em execução errônea de um programa, acesso indevido à áreas de memória, terminação do programa ou uma possível falha de segurança em um sistema.

Tecnicamente falando, um buffer overflow consiste em um processo de armazenar, em um buffer de tamanho fixo, dados maiores que o seu tamanho.

Description

The C library function char *strcpy(char *dest, const char *src) copies the string pointed to by src to dest.

Declaration

Following is the declaration for strcpy() function.

char *strcpy(char *dest, const char *src)

Page 13: Buffer overflow group

Como funciona?Imagine que um programa declara duas estruturas de dados adjacentes na memória do computador:

um vetor de caracteres de 8 bytes, A, e um inteiro de 2 bytes, B, enche A de zeros e B recebe o número 3, como no seguinte esquema:

A palavra excessivo tem 9 letras, conseqüentemente, 10 caracteres, pois um caractere nulo éconcatenado ao final para indicar o fim de uma string (vetor de caracteres).

Separando a palavra em caracteres seria algo como: 'e', 'x', 'c', 'e', 's', 's', 'i', 'v', 'o','\0', sendo o '\0' o caractere nulo, que consiste em um um byte zerado.

Sabendo que cada caractere ocupa um byte, a string A, então, tem apenas 8 bytes, porém estamos inserindo 10 bytes, que é um tamanho maior do que A comporta.

Page 14: Buffer overflow group

Metasploit FrameworkÉ uma avançada plataforma Open Source, concebida especificamente com o objetivo de reforçar e acelerar o desenvolvimento, ensaio e utilização de exploits.

Pequisa de vulnerabilidade de software.

Possui centenas de exploits, payloads e ferramentas muito avançadas que nos permite testar vulnerabilidades em muitas plataformas, sistemas operacionais, e servidores.

A primeira versão estável do MSF foi lançada em meados de 2004. Originalmente escrito em Perl, Assembler e C.

Page 15: Buffer overflow group

Metasploit FrameworkO principal objetivo do MSF é criar um ambiente de pesquisa, desenvolvimento e exploração de vulnerabilidades de software, fornecendo as ferramentas necessárias para o ciclo completo da pesquisa que pode ser divido basicamente em:

● Descoberta da vulnerabilidade;● Análise;● Desenvolvimento do exploit;● Teste do exploit;

Page 16: Buffer overflow group

Payload- Tecnologia do Meterpreter Payload

● No caso de um exploit, o payload é a parte do código injetada na vítima que vai executar alguma ação: criar um usuário, iniciar um processo, apagar arquivos, …

● Um dos principais payloads do MSF é o Meterpreter. O Meterpreter tenta ser invisível ao sistema atacado.

Page 17: Buffer overflow group

Exploits ● É um programa de computador que gera uma porção de dados e sequencias de comandos que

usufrui de vulnerabilidades de um programa de computador ou sistemas operacionais.

● “Hackers, criam exploits maliciosos com o intuito de demonstrar vulnerabilidades ( bugs) para ser corrigidas pelos criadores dos sistemas computacionais.

● Crackers criam EXPLOITS maliciosos a fim de ganhar acesso restrito a si próprio com a intenção de ganhar algum proveito”

Page 18: Buffer overflow group

ExploitsComo funciona?

● Os exploits quase sempre se aproveitam de uma falha conhecida como buffer overflow (estouro de buffer). Essa situação possibilita que um código arbitrário seja executado, necessitando apenas que este seja devidamente posicionado dentro da área de memória do processo.

Como se proteger?● Antivírus e softwares atualizados, um firewall competente, prudência em suas atividades e com

certa dose de sorte, pois a única maneira de permanecer completamente imune a estes processos seria isolar seu computador por completo.

Page 19: Buffer overflow group

Tipos de ataques baseado em Buffer OverflowOs tipos mais comuns de ataques baseados em buffer overflow são:

– Stack-based buffer overflow

– Heap-based buffer overflow

– Return-to-libc attack

Page 20: Buffer overflow group

Stack-based buffer overflowO processador lê uma série de instruções que são referenciadas por bytes.

Com este conhecimento, podemos então no exemplo do slide 11, ao invés de escrevermos um nome, poderíamos enviar os caracteres referentes aos bytes de instruções do processador e reescrever o IP como o endereço referente ao início dos bytes que acabamos de escrever.

Deste modo, as instruções referentes aos bytes que escrevemos serão executadas, pois o IP aponta para o início dos bytes maliciosamente escritos, então, quando a subrotina terminar, o processador lerá a instrução apontada pelo IP, que será o primeiro byte que acabamos de escrever.

Isto caracteriza uma injeção de código por buffer overflow, diretamente na pilha.

É o tipo de ataque baseado em buffer overflow mais comum e simples. O código inserido é normalmente chamado de shellcode.

Page 21: Buffer overflow group

Mas...o que são shellcodes?

Shellcodes são pedaços de código legíveis ao processador, ou seja, bytes referentes às instruções. Como geralmente shellcodes são passados como strings, representamos cada byte por “\xNN”, onde “\” significa que estamos passando um byte (não um caractere), “x” significa que seu valor está na base hexadecimal e NN é o valor do byte na base hexadecimal.

Page 22: Buffer overflow group

Heap-based buffer overflowÉ um tipo muito mais difícil de ser explorado devido ao fato do alvo ser a heap. Entre as

dificuldades estão:

– Na heap, não existem valores os quais o processador usa para saber qual a próxima operação

a executar, apenas valores de organização do próprio heap.

– Devido ao fato do heap crescer em direção aos valores maiores da memória e podermos

apenas escrever nesta mesma direção, não é possível reescrever os valores de controle do

bloco atual, apenas dos blocos posteriores.

– Como a organização da heap pode variar, o atacante precisa saber qual é a implementação de

heap do programa-alvo.

Page 23: Buffer overflow group

Heap-based buffer overflowPara explorar um buffer overflow na heap é necessário encontrar uma vulnerabilidade em

alguma função interna de administração da heap, de modo que esta processe o buffer alvo na heap.

Deste modo:

– Precisamos explorar a heap para sobrescrever os valores de administração de um bloco alvo

e assim inserir o shellcode, construindo um bloco malicioso na heap.

– Os valores de administração devem ser alterados no bloco de forma que este, ao ser

analisado por uma função, como free(), por exemplo, seja processado, diretamente ou por

meio de outra função, como a unlink(), que é chamada dentro da free(), por exemplo.

– Além de modificados para ativar uma função, os valores de administração devem ser

reescritos para causar um overflow no frame da função que processa o bloco, para direcionar

a execução do programa para o shellcode inserido.

Outro modo de explorar o heap overflow é estourar o heap até chegar na pilha e então

sobrescrever o IP do frame do topo da pilha.

Page 24: Buffer overflow group

Return-to-libc attackUma das defesas para um ataque de buffer overflow baseado em pilha é não dar permissão de execução na pilha. Deste modo, não é possível tentar executar um shellcode na pilha.

Existe uma alternativa, que é explorar um código que já existe nas rotinas do programa. Um código que está em quase qualquer coisa(incluindo o sistema operacional), são os códigos da libc, a biblioteca padrão do C.

Além de estarem presentes na maioria dos sistemas, eles possuem uma posição estática na

memória em um sistema.

Page 25: Buffer overflow group

Return-to-libc attackO método para pular para uma função da libc é o mesmo do buffer overflow baseado em

pilha: reescrever o IP com o endereço da função desejada. O endereço de uma função da libc pode

ser facilmente descoberto, em um ambiente sem proteção de aleatoriedade nos espaços de endereço, usando um programa de teste que imprima o endereço da função, por exemplo.

Devemos, então, reescrever o IP com o endereço da função desejada, seu endereço de

retorno e então seus argumentos.

Page 26: Buffer overflow group

Ferramentas preventivasFerramentas de análise de vulnerabilidade local: Crystal, Deputy, Flawfinder etc...

Ferramentas de análise de vulnerabilidade remota: Nessus, Snort, Tripwire, Nmap etc...

Page 27: Buffer overflow group

Nessus

Page 28: Buffer overflow group

Nmap

Page 29: Buffer overflow group

Técnicas para evitar vulnerabilidades

A solução tradicional é utilizar funções de biblioteca que não apresentem problemas relacionados a buffer overflow.

A solução na biblioteca padrão é utilizar as funções strncpy e strncat que recebem como argumento o número máximo de caracteres copiados entre as strings.

A Tabela apresenta as funções nativas da linguagem com e seus respectivos riscos.

Page 30: Buffer overflow group

Estudo de caso- Demonstração do Nessus- Invasão

Page 31: Buffer overflow group

Perguntas!?