Introdução aos Exploits

Um exploit não é nada mais que um código capaz de explorar uma falha num segmento de código ou software. Do inglês, significa literalmente em português “explorar”.

No mundo da segurança informática, denomina-se exploit um método capaz de tirar proveito de um bug (falha) de um software provocando comportamentos não pretendidos do software, frequentemente para conseguir escalar privilégios, obter controlo do sistema ou negar serviços (DoS). Geralmente utilizados em milhares de sistemas diariamente, os exploits são a fonte de grande parte dos ataques ocorridos localmente e remotamente nos sistemas existentes. Estes podem ainda tomar formas e poderes bastantes variados. Pode ser um programa executável, uma mensagem num determinado protocolo de rede ou até mesmo uma mensagem escondida num email.

Neste artigo vamo-nos focar no tipo de falha buffer overflow e utilizaremos a linguagem C para demonstrar.

Como funcionam os exploits?

Os exploits quase sempre fazem proveito de uma falha conhecida como buffer overflow (sobrecarga da memória buffer).

O buffer overflow acontece quando um programa grava dados numa determinada variável passando, porém, uma quantidade maior de dados do que estava previsto pelo programa. Essa situação pode possibilitar a execução de um código arbitrário, necessitando apenas que este seja devidamente posicionado na área de memória do processo.

Abaixo temos um exemplo de um programa vulnerável a um ataque de buffer overflow. O problema está na segunda linha da função ProcessarParam, que não limita o tamanho do argumento recebido (arg).

void ProcessarParam(char *arg);

void main(int argc, char *argv[]) {
  if (argc > 1){
    printf("Param: %s\n",argv[1]); 
    ProcessarParam(argv[1]);
}

void ProcessarParam(char *arg) {
  char buffer[10];
  strcpy(buffer, arg); /* BUG:
      se a string contida em arg tiver mais que 
      10 carateres existirá um Buffer Overflow */
  printf(buffer);
}

O buffer overflow, quando ocorre de forma aleatória, normalmente causa um erro fatal/crash na aplicação. No Windows XP esta situação gera uma janela de erro, e no Linux gera a conhecida segmentation fault com core dump (dá-se um core dump quando o sistema consegue guardar o estado do programa antes de surgir a falha, sendo o core o ficheiro guardado). Porém, quando correctamente induzido pelo atacante, o buffer overflow pode permitir que se execute código malicioso que terá os mesmos privilégios de execução da aplicação a ser atacada, que geralmente são privilégios de administrador.

Para entender completamente como o buffer overflow é explorado para se obter acessos indevidos ao sistema, seria necessário compreender como é que os processos são organizados na memória, no qual cada arquitectura de hardware, sistema operativo ou compilador pode organizar de forma diferente.

Buffer overflow é apenas um dos muitos tipos de vulnerabilidades possíveis num software. Sendo alguns deles: heap overflow, integer overflow, return-to-libc attack, format string attack, race condition, code injection, SQL injection, cross-site scripting e cross-site request forgery. Geralmente um exploit apenas toma vantagem de uma única vulnerabilidade de software, o que torna por vezes normal serem utilizados vários exploits em simultâneo: primeiro para ganhar acesso de nível reduzido, depois para escalar privilégios repetidamente até obter privilégios máximos, nomeadamente Administrador/root.

Normalmente um único exploit pode apenas ser utilizado para tomar vantagem numa única vulnerabilidade de software. Habitualmente, quando um exploit é publicado, a vulnerabilidade é corrigida através de uma correcção (patch) e o exploit torna-se obsoleto para novas versões do software. Esta é a razão pelo qual alguns hackers não publicam os seus exploits, mantendo-os privados. Tais exploits são geralmente referenciados como exploits 0 day e obter tais exploits é o desejo principal dos atacantes inexperientes, geralmente chamados script kiddies.

Projecto Metasploit

O projecto Metasploit é uma plataforma online open-source, disponível para download, que permite controlar e utilizar exploits publicados online.

Escrito em Perl, com componentes em C, Assembly e Python, o Metasploit tornou-se uma ferramenta famosa por facilitar o uso de exploits a todos. Criticado pelos experts da área como uma ferramenta que vem facilitar o trabalho aos script kiddies e assim aumentar o número de sistemas sob ataques.

Com esta ferramenta, a fase de procura e desenvolvimento dos exploits é praticamente eliminada visto que se torna bastante fácil de descarregar novos exploits para utilizar na plataforma.