SEG. EM SISTEMAS E REDES 02. Vulnerabilidades em sistemas Prof. Ulisses Cotta Cavalca <ulisses.cotta@gmail.com> Belo Horizonte/MG 2015
SUMÁRIO 1) Introdução 2) Vulnerabilidades em sistemas
1. INTRODUÇÃO Introdução Principais erros Principais personagens Anatomia de um ataque Vulnerabilidades
1. INTRODUÇÃO 1.1. Principais erros Conectar sistemas na Internet sem testá-los; Conectar com contas e senhas padrão. Usuário: teste; Senha: teste123 Não atualizar erros de segurança, quando estes são encontrados e divulgados; Deixar que pessoas sem o devido treinamento cuidem da segurança; Deixar serviços desnecessários nos computadores: ftpd, telnetd, funger, RPC, mail, Rservices; Manter no servidor pacotes que possibilitam o invasor realizar a compilação de programas;
1. INTRODUÇÃO 1.1. Principais erros Manter no servidor ligado à Internet a base de arquivos da empresa, não diferenciados serviços de LAN e WAN; Conhecer a segurança física, mas desconhecer (ou inexistir) a segurança da informação; Falta de um ambiente de laboratório, ou de teste; Manter um firewall protegendo a rede, acreditando que ele é suficiente; Permitir o uso indiscriminado de protocolos específicos, como o ICMP; Implementar firewall com políticas genéricas; Não tem servidor com horário sincronizado;
1. INTRODUÇÃO 1.1. Principais erros Usar protocolos descriptografados para administrar sistemas remotos, firewalls, etc; Não idealizar perímetros para melhorar a segurança da rede; Não ter concentrados de logs e analisadores dos registros de logs; Possuir um concentrador de logs, mas com os horários dos servidores não sincronizados; Achar que esquecendo os problemas eles somem rapidamente; Falhar na implementação de antivírus ou lista de vírus; Falhas na capacitação e conscientização dos usuários.
1. INTRODUÇÃO 1.2. Principais personagens Hacker Especialista em informática, problem solver, descobre falhas e cria exploit; Possui ética hacker ; Cracker Especialista em informática, problem creator, hacker malicioso, criminoso; Script kiddies Com pouco conhecimento de informática, usam exploits criados pelos hackers e executam ataques na Internet; Possuem muito tempo ocioso
1. INTRODUÇÃO 1.2. Principais personagens Lammer Considerado o nível mais baixo, ou seja, indivíduo que não conhece o poder do computador e se auto denomina um hacker, ou pensa ser um cracker e sai invadindo hosts pela Internet; Menor conhecimento que um script kiddie; Newbie Aprendiz do hacker, pergunta muito, é ignorado e ridicularizado; Larva Indivíduo capaz de eecutar invasões a partir de receitas de bolo e exploits encontrados na Internet, mas diferente do script kiddies, já são capazes de compreender o que estão fazendo e até de melhorar técnicas e ferramentas.
1. INTRODUÇÃO 1.3. Anatomia de um ataque Teste de penetração (pen test) Também denominado teste de invasão. Consiste em apurar o quanto difícil é inadir uma rede de computadores ou um sistema; Pode revelar: Que tipo de informação pode ser obtida fora da organização, sem a necessariamente conectar À rede da empresa ao acessá-la fisicamente; Como os sistemas reagem a um ataque; Se é possível acessar o sistema com informações disponíveis ou já existentes; Informações que possam se tornar acessíveis em caso de pane no sistema
1. INTRODUÇÃO 1.3. Anatomia de um ataque Teste de penetração (pen test) Abordagens: Teste de penetração zero (black box) Grupo de teste não tem nenhuma informação sobre o sistema alvo Teste de invasão mais realístico possível Teste de penetração parcial (gray box) Organização alvo fornece informações que um atacante pode encontrar; Usado se o objetivo for testar um novo tipo de ataque, ou focar em um host específico; Informações como topologias de rede, política de segurança e inventário Teste de conhecimento (white box) Simulação do trabalho de um atacante que possui grande conhecimento da organização alvo
1. INTRODUÇÃO 1.3. Anatomia de um ataque Teste de penetração (pen test) Fases: Fase de descoberta Coleta de informações da organização Fase de enumeração Complementa da fase de descoberta, com a coleta de informações como nomes de usuários, informações de compartilhamentos, aplicativos, plataformas, infraestruturas, etc. Fase de mapeamento de vulnerabilidades Estabelecimento de relação das informações obtidas Fase de exploração Obteção de acesso para descoberta e exploração das vulnerabilidades encontradas
1. INTRODUÇÃO 1.4. Vulnerabilidades Evidência ou fragiliade que eleva o grau de exposição do ativo, aumentando a probabilidade de sucesso da investida de uma ameaça Físicas: cabeamento de baixa qualidade, ausência de fragmentadora de papel, instalação elétrica mal dimensionada; Tecnológicas: defeito de software, sistema operacional desatualizado, senha fraca; Humanas: falta de conscientização dos usuários, ausência de rotina de backup, descuido e despreparo.
1. INTRODUÇÃO 1.4. Vulnerabilidades Sob o ponto de vista tecnológico São falhas presentes em um programa, protocolo ou sistema operacional; Decorrem de erros de especificação ou de programação Prevenção para erros de programação: Aplicação de patches ou hotfix Aplicação de service pack ou maintenance level
Buffer overflow Buffer overflow baseado em pilha Buffer overflow baseado no heap Ataque por retorno da libc Erros de parâmetros SQL injection Cross-site Scripting (XSS) Poluição de parâmetros HTTP
2.1. Buffer overflow Falha amplamente conhecida, que implica em sérios impactos no funcionamento de sistemas; Buffer overflow é basicamente o resultado do armazenamento em memória maior que a sua capacidade; O princípio é estourar o buffer e sobrescrever parte da pilha de memória, alterando o valor das variáveis locais, valores dos parâmetros e/ou o endereço de retorno; Sistemas que não verificam o tamanho disponível em memória estão suscetíveis a esse ataque; Sistemas como Apache, IIS e OpenSSH já apresentaram essa vulnerabilidade.
2.1. Buffer overflow Um processo ao ser executado é divido em quatro partes na memória: Texto, onde estão armazenadas as instruções e código fontes propriamente ditos. Armazena código binário e executável, está marcada apenas como leitura. Em seguida os dados, onde são armazenados os conteúdos das variáveis globais e estáticas do processo em execução. Já pilha é um espaço contínuo de memória responsável por armazenar o conteúdo das variáveis locais do processo, além de valores de passagem e retorno de funções. Por fim, o heap é responsável pela alocação dinâmica de memória.
2.1. Buffer overflow Stack-based buffer overflow (Buffer overflow baseado em pilha): É a técnica mais trival de ataque por buffer overflow, consistindo na rescrita da pilha de memória com o conteúdo excedido. O valor excedido salvo na pilha de memória pode apontar para a execução do código malicioso, ou até mesmo para parte do programa vulnerável.
2.1. Buffer overflow Stack-based buffer overflow:
2.1. Buffer overflow Heap-base buffer overflow (Buffer overflow baseado no heap) Em geral é mais difícil de ser explorada, devido a sua função de alocação dinâmica de memória, blocos contíguos e fragmentação interna. O buffer presente no heap deve ser estourado para que o retorno à pilha aponto para o código malicoso.
2.1. Buffer overflow Return-to-libc attack (Ataque por retorno da libc): consiste no estouro de um buffer para que seja apontado a um trecho do programa em execução, geralmente uma função. Essas funções são tipicamente utilizadas pela biblioteca libc. Ataques desse tipo são comumente aplicados após a inclusão de patches em sistemas operacionais, que são impedidos de executar códigos nas regiões de memória que o processo ocupou (região de dados, pilha, ou heap).
2.2. Erros de parâmetros Principais alvos de ataques são serviços de DNS, servidor Web e servidor de email. Destes, o servidor web é o mais suscetível a ataques por erros de parâmetros, por exigir que parâmetros sejam enviados durante a sua execução; Essa estratégia consiste em inserir numa determinada aplicação parâmetros que, a priori, não são previstos ou tratados no código fonte Podemos citar os ataques por erros de parâmetros: SQL injection XSS (Cross-site Scripting) Poluição de parâmetros HTTP
2.2. Erros de parâmetros SQL injection A vulnerabilidade por SQL injection (SQLi) nasce quando a aplicação não trata o caracter '; Essa ausência de tratamento permite a inserção de código SQL para : expor dados escondidos, sobrescrever dados valiosos; ainda executar comandos de sistema perigosos no servidor; Em geral, aplicações PHP são mais suscetíveis a essa vulnerabilidade.
2.2. Erros de parâmetros SQL injection Exemplo de como SQLi funciona: Fonte: http://php.net/manual/pt_br/security.database.sql-injection.php
2.2. Erros de parâmetros SQL injection
2.2. Erros de parâmetros SQL injection Para verificar se um site tem essa vulnerabilidade, acrescente ' no final da URL; Em geral, sites que contém os seguintes arquivos, é possível aplicar SQLi: index.php?id= gallery.php?id= article.php?id= pageid=
2.2. Erros de parâmetros SQL injection Como se proteger: Nunca confie em nenhum tipo de entrada no sistemas, especialmente aquela que vem do lado do cliente, mesmo que venha de um combobox (HTML), um campo de entrada escondido (hidden) ou um cookie; Nunca conecte ao banco de dados como um superusuário ou como o dono do banco de dados. Use sempre usuários personalidados com privilégios bem limitados; Verifique se uma entrada qualquer tem o tipo de dados experado. Exemplo: espere números se o campo for numérico :)
2.2. Erros de parâmetros Cross-site Scripting (XSS) Envolve a consequência de misturar dados (código HTML por exemplo) e códigos em um objeto. Entendemos estes códigos como linguagens executadas no navegador, como o JavaScript, Active Script e o ActiveX. Em ataques por XSS, o agressor insere trechos em JavaScript (ou qualquer outra linguagem que seja interpretada no navegador do cliente) no HTML da aplicação, sendo impossível a mesma verificar o verdadeiro intuito desses códigos. A partir disso o atacante pode verificar o conteúdo de cookies (que pode conter informações de autenticação do usuário), teclas, dados de formulários, e assim por diante.
2.2. Erros de parâmetros Cross-site Scripting (XSS) Código PHP simples de um site qualquer Acesso a partir de um browser: http://localhost/html/index.php?nome=redes de computadores
2.2. Erros de parâmetros Cross-site Scripting (XSS) Acesso a partir de um browser, injetando o código Java Script: <script>alert(document.lastmodified)</script> http://localhost/html/index.php? nome=<script>alert(document.lastmodified)</script>
2.2. Erros de parâmetros Cross-site Scripting (XSS) Como se proteger: Não confie nos parâmetros passados pelos métodos GET pelo protocolo HTTML; Alguns navegadores já possuem algum implementação que trata ataques do tipo XSS No servidor Web, implemente regras que trate os metacaracteres. O exemplo a seguir verifica a existência de caracter entre barra ou tags /((\%3C) <)((\%2F) \/)*[a-z0-9\%]+((\%3e) >)/i
2.2. Erros de parâmetros Poluição de parâmetros HTTP Consiste no envio de um mesmo parâmetro mais de uma vez. Embora essa técnica seja simples, foi anunciada publicamente recentemente; http://www.loja.com.br/carrinho.php?idproduto=1&idproduto=2 O servidor web não consegue tratar os valores desse parâmetro duplicado, gerando grande instabilidade, funcionamento incorreto e algumas vezes comportamentos desconhecidos. Uma solução seria a concatenação de parâmetros duplicados e passá-los como vetor ao invés de string, diferentemente do que é comumente feito. Entretanto, não existe um consenso para esse tipo de prática e como evitar ataques por poluição de parâmetros HTTP