quinta-feira, 9 de junho de 2011

Invasão de website

Você provavelmente já ouviu falar que um determinado grupo de 'crackers' pichou o website de uma instituição. Esse tipo de notícia chama a atenção da mídia e, infelizmente, é cada vez mais frequente.

O próprio site do HackerTeen já foi pichado por crackers, assim como o securityfocus.com, mcafee.com (na verdade o site de serviços de segurança do sites deles), hackinthebox.org e zone-h.org. Todos apresentaram  ulnerabilidades e devem ter evoluído sua segurança após a pichação, mas ainda assim não podem garantir que estão 100% seguros e nunca mais serão pichados.

Sites famosos estão mais sujeitos a ataques, pois conferem notoriedade e fama ao pichador. Aliás, nem todo cracker está interessado em dinheiro e fraudes. A maioria está interessada em ganhar notoriedade entre seus pares, outros crackers.

Identificando vulnerabilidades...

Uma classe de vulnerabilidades que permitem execução de código malicioso são os ataques de Injeção de Código, ou como são conhecidos na Internet, os famosos "injections". Eles permitem que um atacante insira um determinado código ou mesmo reescreva todo o conteúdo de um website. Para que isso ocorra, o site deve estar vulnerável a este tipo de ataque.

Principais técnicas...

Dentre as técnicas de injection disponíveis, as mais famosas são as técnicas de SQL Injection. Estas técnicas aproveitam falhas na aplicação ou práticas ruins de desenvolvimento para explorar o servidor remoto.

Na prática...

Para termos uma idéia de como isso ocorre, vamos fazer uma busca simples no Google. Vamos procurar pelo meu nome, e então, observe sua barra de endereço:

http://www.google.com.br/search?hl=pt-BR&q=yago+&btnG=Pesquisar&meta=

Note que este endereço é composto de uma seqüência de variáveis, cada uma com um valor diferente. A variável q (q=yago) é a variável utilizada pela aplicação do Google que faz a busca em um banco de dados, e então apresenta o resultado ao usuário.

Vamos fazer outra busca. Vamos procurar pelo nome Yago + hackerteen:

http://www.google.com.br/search?hl=pt-BR&q=yago+%2B+hackerteen&btnG=Pesquisar&meta

A variável q agora possui os valores yago+%2B+hackerteen, indicando agora ao software para buscar pelas palavras "Yago" e "Hackerteen" no banco de dados.

Faça você este teste...

Copie o endereço acima, e cole no seu navegador, substitua a palavra 'Yago' por 'segurança', e então aperte 'Enter'. Note que tanto o resultado da busca quanto as palavras na caixa de pesquisa foram alteradas, ou seja, colocamos um valor na URL e ela afetou o comportamento e a visualização da página da aplicação Google, o mesmo príncipio utilizado no SQL injection.

Claro que isso não é uma invasão, e não foi usada nenhuma técnica especial além da observação.

Sabendo que este comportamento é possível em websites e aplicações web, os crackers passam a observar e testar o site do alvo em busca de alguma informação que possa levar a uma falha, como por exemplo, uma consulta que retorna erro ou uma página inexistente, ou seja, ele busca um indicio que é possível realizar SQL Injection na página.

Como pensa o cracker...

Um cracker pode fazer uma consulta incluindo operadores especiais no Google com a seguinte string:
allinurl: produto.asp?id=

A busca acima poderia indicar a existência de listagens de produtos em um site de comércio eletrônico. Em pouco tempo, o cracker consegue uma lista de sites que correspondem a essa busca. De posse desta lista, o cracker começa a procurar por vulnerabilidades.

Vamos imaginar que o seguinte site foi encontrado: www.sitealvo.com.br/produtos.asp?id=666
Para testar o site, o atacante simplesmente acrescenta um ' ao final da URL, digitando assim o seguinte endereço: www.sitealvo.com.br/produtos.asp?id=666'

Um site programado com possíveis problemas de segurança, retornará um erro semelhante a este:
Microsoft OLE DB Provider for SQL Server error '80040e14'
Line 1: Incorrect syntax near ''.
/produto.asp, line 12


Ao contrário, se a programação do site estiver mais cuidadosa, ele retornará algo como a seguinte frase:
"Caracteres Inválidos no campo id"

Conhecimento em programação...

É ai que entra o conhecimento em programação do cracker. A partir da localização deste erro e do conhecimento de que existem práticas descuidadas de programação, ele poderá inserir comandos e scripts que serão executados pelo site da vítima, levando à pichação e mesmo à fraude, como alteração de preço de produtos, negação de serviços, implementação de backdoors e outras atividades ilicítas.

Exemplo: www.sitealvo.com.br/produtos.asp?id=666 and 'SELECT password FROM costumers'
Com este comando, o cracker traria as senhas dos clientes cadastrados no site, por exemplo

Reforce a segurança do seu website...

Para se proteger desses ataques, é necessário utilizar boas praticas de programação aliadas a uma política de segurança local dos servidores web, ou "hardening". Para prevenir alguns problemas é recomendado que alguns parâmetros de PHP sejam configurados no php.ini:
  • allow_url_fopen = Off
  • safe_mode = On
  • magic_quotes_gpc = On
  • display_errors = Off

Você estará protegendo...

Este conjunto de instruções impedem que URLS externas sejam interpretadas pelo PHP, obrigam as aplicações a rodarem com UID/GID definidas, protegem caracteres especiais utilizadas em SQL Injection, como o ' (aspas) do exemplo acima e a última impede que mensagens de erros sejam mostradas no browser, dificultando a análise do atacante.

Para os servidores de banco de dados...

Utilize criptografia nas senhas, utilize privilégios distintos para o dono do banco e para os objetos do banco. O programador deve sempre fazer tratamentos das querys e sempre checar os dados antes de enviar para o sistema gerenciador de bancos de dados. Por exemplo, se você espera que o usuário digite um número, tenha certeza de que o dado realmente é um número válido, antes de realizar a consulta.

Para a servidor web...

  • Tenha cuidado com as permissões do diretório do servidor web, permissões incorretas de gravação em um arquivo php, por exemplo;
  • Fique atento às permissões especiais para diretórios;
  • Esconda as assinaturas que exibem a versão do servidor e módulos utilizados: Para o Apache, habilite a opção "server signature off" no arquivo de configuração;
  • Mantenha os serviços sempre atualizados, e não mantenha instalado aquilo que você não pretende utilizar, por exemplo, NFS em um servidor Web;
  • Tenha cuidado com as permissões dos executáveis em servidores web. Um atacante pode usar ferramentas simples como clientes FTP e clientes web (o wget, por exemplo) para iniciar o download de código malicioso ou kits de invasão para o servidor em ataque;
  • Tenha cuidado com os parametros de montagem de dispositivos;
  • A partição /tmp é o alvo preferido de crackers porque possui permissão de escrita, leitura e execução para todos. O uso de técnicas simples, como configurar a partição com parâmetros noexec impede que o cracker execute alguma ferramenta a partir do /tmp;

Observe as permissões especiais...

Existem permissões especiais, como o SUID BIT, que permitem que qualquer aplicação seja executada com permissões de root, o que pode comprometer a segurança. Faça testes periódicos e elimine arquivos com permissão SUID.

Uma maneira simples de efetuar esta busca é executar o comando: # find / -perm -4000
  • Sempre analise o conteúdo das pastas que podem ser escritas pelo usuário que executam os serviços web;
  • Sempre cheque a integridade dos arquivos disponibilizados no seu servidor web. A instalação de uma aplicação automatizada para isso, como o AIDE, facilita bastante a criação das somas de checagem e sua conferência;
  • Analise constantemente os registros de atividades (logs) do seu servidor;
  • Analise constantemente as informações vitais do seu servidor: consumo de disco, banda e memória. Alterações significativas podem ser sinal de algo errado;
  • Elimine serviços não usados;
  • Mantenha uma política de atualização de software;
  • Saiba quem acessa e o que faz em seu servidor. Uma política de acesso controlada com uso de sudo e registro de operações é fundamental;
  • Documente: A inexistência de documentação pode levar a soluçoes de contorno que podem expor a segurança;
  • Comunique: Modificações não comunicadas e não analisadas podem levar a problemas de segurança;
  • Mantenha-se antenado: Busque informações sobre problemas de segurança enfrentados por outros administradores ou nos boletins de segurança.
  • Observe as permissões especiais...
  • Utilize práticas de desenvolvimento seguras;
  • Faça tratamento de erros nas mensagens;
  • Nunca acredite nos dados que foram digitados, sempre efetue validações. Tanto no lado cliente como no lado servidor;
  • Crackers são criativos, sua defesa também é a criatividade. Passe um bom tempo imaginando o que faria se fosse um cracker.;
  • Não acredite que algo é seguro. Ele pode estar seguro, mas mentes criativas estão tentando encontrar formas de torna-lo inseguro.
Teste as aplicações antes que alguém faça isso por você!
Apesar dessas medidas serem interessantes, elas não garantem segurança 100%. Nenhuma medida terá 100% de garantias. A insegurança estará sempre à frente da segurança, basta assistir ao filme "Prenda-me se for capaz"
Para saber mais: http://www.owasp.org/

Sem comentários:

Enviar um comentário