Você está na página 1de 46

Snort

19 de dezembro de 2006
Sumário

I Sobre essa apostila 2

II Informações Básicas 4

III Snort 9

1 Snort 10

2 Plano de ensino 11
2.1 Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2 Público Alvo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3 Pré-requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.4 Descrição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.5 Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.6 Cronograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.7 Avaliação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.8 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3 Introdução 13
3.1 O que é o Snort? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2 O que o Snort faz? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

4 Como é o Snort? 15
4.1 Como o Snort funciona? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

5 Instalação 17
5.1 Instalando - 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.2 Instalando - 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

6 Montando um snort.conf 21
6.1 Selecionando o código funcional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
6.2 Adequando a seção de regras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
6.3 Comentador dos includes do snort.conf de regras do Snort . . . . . . . . . . . . . . 23
6.4 Inclusor de includes de regras do Snort no snort.conf . . . . . . . . . . . . . . . . . 24
6.5 snort.conf resultante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

1
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

7 Variáveis 29
7.1 Conhecendo as variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
7.2 Entendendo e definindo as variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

8 Regras 33
8.1 Introduzindo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
8.2 Entendendo as regras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
8.3 Montando regras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

9 Rodando o Snort 36
9.1 Os logs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
9.2 Os modos de funcionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
9.3 Enfim, rodando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
9.4 Modo sniffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
9.5 Modo logger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
9.6 Modo NIDS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

10 Notas finais 43
10.1 Conferindo os alertas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
10.2 Outros aplicativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

2
Parte I

Sobre essa apostila

3
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

Conteúdo
O conteúdo dessa apostila é fruto da compilação de diversos materiais livres publicados na in-
ternet, disponíveis em diversos sites ou originalmente produzido no CDTC em http://www.cdtc.org.br.

O formato original deste material bem como sua atualização está disponível dentro da licença
GNU Free Documentation License, cujo teor integral encontra-se aqui reproduzido na seção de
mesmo nome, tendo inclusive uma versão traduzida (não oficial).

A revisão e alteração vem sendo realizada pelo CDTC (suporte@cdtc.org.br), desde outubro
de 2006. Criticas e sugestões construtivas são bem-vindas a qualquer tempo.

Autores
A autoria deste conteúdo, atividades e avaliações é de responsabilidade de Tomas Ribeiro
Cardoso (tomas@cdtc.org.br).

O texto original faz parte do projeto Centro de Difusão de Tecnolgia e Conhecimento, que vem
sendo realizado pelo ITI em conjunto com outros parceiros institucionais, atuando em conjunto
com as universidades federais brasileiras que tem produzido e utilizado Software Livre, apoiando
inclusive a comunidade Free Software junto a outras entidades no país.

Informações adicionais podem ser obtidas atráves do email ouvidoria@cdtc.org.br, ou da


home page da entidade, atráves da URL http://www.cdtc.org.br.

Garantias
O material contido nesta apostila é isento de garantias e o seu uso é de inteira responsabi-
lidade do usuário/leitor. Os autores, bem como o ITI e seus parceiros, não se responsabilizam
direta ou indiretamente por qualquer prejuízo oriundo da utilização do material aqui contido.

Licença
Copyright ©2006,Tomas Ribeiro Cardoso (tomas@cdtc.org.br).

Permission is granted to copy, distribute and/or modify this document under the terms
of the GNU Free Documentation License, Version 1.1 or any later version published by
the Free Software Foundation; with the Invariant Chapter being SOBRE ESSA APOS-
TILA. A copy of the license is included in the section entitled GNU Free Documentation
License.

4
Parte II

Informações Básicas

5
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

Sobre o CDTC
Objetivo Geral

O Projeto CDTC visa a promoção e o desenvolvimento de ações que incentivem a dissemina-


ção de soluções que utilizem padrões abertos e não proprietários de tecnologia, em proveito do
desenvolvimento social, cultural, político, tecnológico e econômico da sociedade brasileira.

Objetivo Específico

Auxiliar o Governo Federal na implantação do plano nacional de software não-proprietário e


de código fonte aberto, identificando e mobilizando grupos de formadores de opinião dentre os
servidores públicos e agentes políticos da União Federal, estimulando e incentivando o mercado
nacional a adotar novos modelos de negócio da tecnologia da informação e de novos negócios
de comunicação com base em software não-proprietário e de código fonte aberto, oferecendo
treinamento específico para técnicos, profissionais de suporte e funcionários públicos usuários,
criando grupos de funcionários públicos que irão treinar outros funcionários públicos e atuar como
incentivadores e defensores de produtos de software não proprietários e código fonte aberto, ofe-
recendo conteúdo técnico on-line para serviços de suporte, ferramentas para desenvolvimento de
produtos de software não proprietários e de seu código fonte livre, articulando redes de terceiros
(dentro e fora do governo) fornecedoras de educação, pesquisa, desenvolvimento e teste de pro-
dutos de software livre.

Guia do aluno
Neste guia, você terá reunidas uma série de informações importantes para que você comece
seu curso. São elas:

• Licenças para cópia de material disponível

• Os 10 mandamentos do aluno de Educação a Distância

• Como participar dos foruns e da wikipédia

• Primeiros passos

É muito importante que você entre em contato com TODAS estas informações, seguindo o
roteiro acima.

Licença
Copyright ©2006, Tomas Ribeiro Cardoso (tomas@cdtc.org.br).

É dada permissão para copiar, distribuir e/ou modificar este documento sob os termos
da Licença de Documentação Livre GNU, Versão 1.1 ou qualquer versão posterior

6
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

públicada pela Free Software Foundation; com o Capitulo Invariante SOBRE ESSA
APOSTILA. Uma cópia da licença está inclusa na seção entitulada "Licença de Docu-
mentação Livre GNU".

Os 10 mandamentos do aluno de educação online

• 1. Acesso à Internet: ter endereço eletrônico, um provedor e um equipamento adequado é


pré-requisito para a participação nos cursos a distância.

• 2. Habilidade e disposição para operar programas: ter conhecimentos básicos de Informá-


tica é necessário para poder executar as tarefas.

• 3. Vontade para aprender colaborativamente: interagir, ser participativo no ensino a distân-


cia conta muitos pontos, pois irá colaborar para o processo ensino-aprendizagem pessoal,
dos colegas e dos professores.

• 4. Comportamentos compatíveis com a etiqueta: mostrar-se interessado em conhecer seus


colegas de turma respeitando-os e fazendo ser respeitado pelo mesmo.

• 5. Organização pessoal: planejar e organizar tudo é fundamental para facilitar a sua revisão
e a sua recuperação de materiais.

• 6. Vontade para realizar as atividades no tempo correto: anotar todas as suas obrigações e
realizá-las em tempo real.

• 7. Curiosidade e abertura para inovações: aceitar novas idéias e inovar sempre.

• 8. Flexibilidade e adaptação: requisitos necessário à mudança tecnológica, aprendizagens


e descobertas.

• 9. Objetividade em sua comunicação: comunicar-se de forma clara, breve e transparente é


ponto - chave na comunicação pela Internet.

• 10. Responsabilidade: ser responsável por seu próprio aprendizado. O ambiente virtual não
controla a sua dedicação, mas reflete os resultados do seu esforço e da sua colaboração.

Como participar dos fóruns e Wikipédia


Você tem um problema e precisa de ajuda?

Podemos te ajudar de 2 formas:

A primeira é o uso dos fóruns de notícias e de dúvidas gerais que se distinguem pelo uso:

. O fórum de notícias tem por objetivo disponibilizar um meio de acesso rápido a informações
que sejam pertinentes ao curso (avisos, notícias). As mensagens postadas nele são enviadas a
todos participantes. Assim, se o monitor ou algum outro participante tiver uma informação que
interesse ao grupo, favor postá-la aqui.
Porém, se o que você deseja é resolver alguma dúvida ou discutir algum tópico específico do
curso. É recomendado que você faça uso do Forum de dúvidas gerais que lhe dá recursos mais

7
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

efetivos para esta prática.

. O fórum de dúvidas gerais tem por objetivo disponibilizar um meio fácil, rápido e interativo
para solucionar suas dúvidas e trocar experiências. As mensagens postadas nele são enviadas
a todos participantes do curso. Assim, fica muito mais fácil obter respostas, já que todos podem
ajudar.
Se você receber uma mensagem com algum tópico que saiba responder, não se preocupe com a
formalização ou a gramática. Responda! E não se esqueça de que antes de abrir um novo tópico
é recomendável ver se a sua pergunta já foi feita por outro participante.

A segunda forma se dá pelas Wikis:

. Uma wiki é uma página web que pode ser editada colaborativamente, ou seja, qualquer par-
ticipante pode inserir, editar, apagar textos. As versões antigas vão sendo arquivadas e podem
ser recuperadas a qualquer momento que um dos participantes o desejar. Assim, ela oferece um
ótimo suporte a processos de aprendizagem colaborativa. A maior wiki na web é o site "Wikipé-
dia", uma experiência grandiosa de construção de uma enciclopédia de forma colaborativa, por
pessoas de todas as partes do mundo. Acesse-a em português pelos links:

• Página principal da Wiki - http://pt.wikipedia.org/wiki/

Agradecemos antecipadamente a sua colaboração com a aprendizagem do grupo!

Primeiros Passos
Para uma melhor aprendizagem é recomendável que você siga os seguintes passos:

• Ler o Plano de Ensino e entender a que seu curso se dispõe a ensinar;

• Ler a Ambientação do Moodle para aprender a navegar neste ambiente e se utilizar das
ferramentas básicas do mesmo;

• Entrar nas lições seguindo a seqüência descrita no Plano de Ensino;

• Qualquer dúvida, reporte ao Fórum de Dúvidas Gerais.

Perfil do Tutor
Segue-se uma descrição do tutor ideal, baseada no feedback de alunos e de tutores.

O tutor ideal é um modelo de excelência: é consistente, justo e profissional nos respectivos


valores e atitudes, incentiva mas é honesto, imparcial, amável, positivo, respeitador, aceita as
idéias dos estudantes, é paciente, pessoal, tolerante, apreciativo, compreensivo e pronto a ajudar.
A classificação por um tutor desta natureza proporciona o melhor feedback possível, é crucial, e,
para a maior parte dos alunos, constitui o ponto central do processo de aprendizagem.’ Este tutor
ou instrutor:

• fornece explicações claras acerca do que ele espera, e do estilo de classificação que irá
utilizar;

8
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

• gosta que lhe façam perguntas adicionais;

• identifica as nossas falhas, mas corrige-as amavelmente’, diz um estudante, ’e explica por-
que motivo a classificação foi ou não foi atribuída’;

• tece comentários completos e construtivos, mas de forma agradável (em contraste com um
reparo de um estudante: ’os comentários deixam-nos com uma sensação de crítica, de
ameaça e de nervossismo’)

• dá uma ajuda complementar para encorajar um estudante em dificuldade;

• esclarece pontos que não foram entendidos, ou corretamente aprendidos anteriormente;

• ajuda o estudante a alcançar os seus objetivos;

• é flexível quando necessário;

• mostra um interesse genuíno em motivar os alunos (mesmo os principiantes e, por isso,


talvez numa fase menos interessante para o tutor);

• escreve todas as correções de forma legível e com um nível de pormenorização adequado;

• acima de tudo, devolve os trabalhos rapidamente;

9
Parte III

Snort

10
Capítulo 1

Snort

Snort é um IDS (Intrusion Detection System) - Sistema de Detecção de Intrusão. Ele analisa em
tempo real os pacotes que passam por uma dada interface de rede e os loga caso os diagnostique
como ameaças. Seu funcionamento é configurável e seu uso é simples e transparente. Hoje o
Snort é o IDS mais usado do mundo GNU//Linux.

11
Capítulo 2

Plano de ensino

2.1 Objetivo
Capacitar o usuário para o uso dos principais recursos do Detector de Intrusão Snort.

2.2 Público Alvo


Administradores de rede iniciantes ou aqueles que querem relembrar o uso do Snort ou mesmo
aqueles que utilizam com experiência, mas que são entusiastas do IDS.

2.3 Pré-requisitos
Os usuários devem ter experiência e familiaridade com o(s) shell(s) do linux e ter conhecimento
de redes.

2.4 Descrição
O curso será realizado na modalidade Educação a Distância e utilizará a Plataforma Moodle
como ferramenta de aprendizagem. O curso tem duração de uma semana e possui um conjunto
de lições que deverão ser lidas e repondidas ao longo da semana. O material didático está
disponível on-line de acordo com as datas pré-estabelecidas em cada tópico.

2.5 Metodologia
Todo o material está no formato de lições, sendo que cada uma dispõe de um texto explicativo e
uma ou mais perguntas para acompanhar panoramicamente a leitura dos participantes. Ao final
do curso um questionário será apresentado para que se faça uma avaliação do aprendizado de
cada um. Aconselhamos a leitura de "Ambientação do Moodle"para aquelas pessoas que não
tenham nenhum familiaridade com o que seja nem o Moodle nem o que seja ensino à distância.

12
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

2.6 Cronograma
Duração Descrição do Módulo
De segunda-feira a domingo Lição 1 - Introdução
Lição 2 - Instalação
Lição 3 - Montando um snort.conf
Lição 4 - Variáveis
Lição 6 - Regras
Lição 7 - Rodando o Snort
Lição 8 - Notas finais
Avaliação de aprendizagem
Avaliação do curso

As lições contém o contéudo principal. Elas poderão ser acessadas quantas vezes forem ne-
cessárias, desde que esteja dentro da semana programada. Ao final de uma lição, você receberá
uma nota de acordo com o seu desempenho. Responda com atenção às perguntas de cada lição,
pois elas serão consideradas na sua nota final. Caso sua nota numa determinada lição for menor
do que 7, sugerimos que você faça novamente esta lição. Ao final do curso será disponibilizada a
avaliação referente ao curso. Tanto as notas das lições quanto a da avaliação serão consideradas
para a nota final. Todos os módulos ficarão visíveis para que possam ser consultados durante a
avaliação final.
Aconselhamos a leitura da "Ambientação do Moodle"para que você conheça a plataforma de
Ensino a Distância, evitando dificuldades advindas do "desconhecimento"sobre a mesma.
Os instrutores estarão a sua disposição ao longo de todo curso. Qualquer dúvida deverá ser
enviada no fórum. Diariamente os monitores darão respostas e esclarecimentos.

2.7 Avaliação
Toda a avaliação será feita on-line. Tanto o resultado das lições quanto o resultado do questionário
final serão relevantes para a média final das notas, que por sua vez nos habilita ou não a liberar
a certificação. Para a aprovação o participante deverá obter nota maior ou igual a 6,0 na média
final.

2.8 Bibliografia
• http://afrodita.unicauca.edu.co/

• http://packetstormsecurity.nl/papers/IDS/snort_rules.htm

• http://neworder.box.sk/newsread.php?newsid=7646

• http://docs.triforsec.com.br/index.php?option=com_content&task=view&id=18&It

• http://www.snort.org/docs/snort_manual/node19.html

13
Capítulo 3

Introdução

3.1 O que é o Snort?


O Snort é um famoso IDS (Intrusion Detection System) - Sistema de Detecção de Intrusão. Ele
é um programa que fica o tempo todo, enquanto está funcionando, vigiando a entrada que a
rede tem à máquina para nos informar caso haja alguma tentativa de ataque. O Snort é como
um guarda desarmado, mas com uma máquina fotográfica à mão. Essa foi a explicação mais
simples. Vamos então saber melhor o que é o Snort.
O Snort é basicamente um farejador de rede com capacidade de reconhecer padrões de
cabeçalho e de conteúdos de pacotes. A parte interessante é que essa capacidade é altamente
configurável.
Um farejador de rede é um programa que escuta em uma dada interface de rede os pacotes
que por ela passam. Tipicamente, os únicos pacotes que por ela passam e também são lidos por
inteiro são aqueles que se destinam à máquina à qual pertence a interface.
Um farejador, no entanto, pode, se quiser, capturar não somente os pacotes destinados a sua
máquina, mas também todos os pacotes que por ela passarem independetemente de sua origem
ou destino. Isso é mais eficaz, é claro, quanto mais máquinas estiverem enviando pacotes em
broadcast na mesma seção de rede que o farejador. Uma interface de rede é dita estar em estado
promíscuo quando permite um farejador escutar quaisquer pacotes. O Snort pode funcionar e
funciona por padrão sobre interfaces em modo promíscuo.
Ao longo deste curso pode ser bastante útil que consultem o manual on-line na página do
Snort, que é muito detalhado e organizado.

3.2 O que o Snort faz?


Assim que o Snort captura os pacotes ele os analiza segundo assinaturas de reconhecimento de
ataques, que nada mais são do que padrões de conteúdos dos pacotes que são comparados aos
dos pacotes reais que entram em nossa máquina para tentar reconhecer sua função.
Aqueles conjuntos de pacotes que forem reconhecidos como maliciosos fazem o Snort logar
uma tentativa de ataque em seu log de alertas. Para tanto o Snort consulta regras que decidem
o que deve ou não ser logado, e como o deve. Uma regra pega o diagnóstico dado a um pacotes
e decide o que como irá logá-lo. Um log é simplismente um aviso informativo de alguma coisa
que veio a acontecer. Esse aviso fica tipicamente armazenado em arquivos no disco da máquina,
ainda que possa ser redirecionado para outra máquina na rede ou mesmo enviado por e-mail.

14
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

No caso do Snort, os mesmos logs podem ser enviados em tempo real para a saída padrão, o
console.
Esse log, por sua vez, pode ser escrito tanto em texto plano em formato legível quanto em
outros formatos otimizados que tem de ser interpretados por um programa e que podem ser
manipulados até mesmo em tempo real para o visualizarmos melhor, caso utilizemos algum plugin
especial.
O Snort é capaz de reconhecer vários tipos de pacotes maliciosos. Alguns exemplos são
pacotes de varreduras discretas de portas, ataques de CGI, ataques de estouro de buffer e outros
esforços que possam servir a futuros ataques, como reconhecimento de sistema operacional, por
exemplo.

15
Capítulo 4

Como é o Snort?

O Snort é manipulado pela linha de comando. Podemos inicializá-lo, interrompê-lo, acompanhar


o que escuta em tempo real e configurar suas regras tudo com o console.
O Snort, por ser um programa compilado, tem seu arquivo binário. Além deste, o Snort é
composto de um arquivo de configuração e alguns scripts, que ficam na mesma pasta, e de uma
pasta de logs, separada.
O diretório de configuração do Snort é o /etc/snort. Nele existem dois diretórios que nos
interessa conhecer:
/etc/snort/rules - Contém as regras que decidem o que logar, como e onde.
/etc/snort/docs - Contém as assinaturas que permitem ao Snort reconhecer o caráter de um
pacote.
Outro diretório que nos cabe conhecer é a sua pasta de logs, que fica no diretório /var:
/var/snort
Além dos diretórios, existe o próprio arquivo de configuração do Snort, sobre o qual vamos
nos debruçar neste breve curso, o
/etc/snort/snort.conf
O arquivo de configuração do Snort guarda variáveis de valores da rede e da máquina relevan-
tes ao seu funcionamento. As variáveis nos interessam especialmente para a configuração das
regras, e para tanto as variáveis devem estar setadas adequadamente. Além disso, o snort.conf
lista os preprocessadores utilizados na análise de um pacote, o que vamos entender um pouco
melhor mais tarde, e também a indicação dos plugins utilizados para dar suporte ao uso do Snort,
como aqueles apresentados a cima. No final do arquivo, por fim, são listadas as regras de logging
do Snort.

4.1 Como o Snort funciona?


Existem ferramentas que facilitam a manipulação dos logs do Snort, como o programa BASE,
uma que otimiza sua função, se comprometendo a logar e deixando o Snort livre para detecção
de pacotes, o Barnyard, e até outra que gerencia as regras do Snort, o Oinkmaster.
Neste curso, porém, vamos nos concetrar para entender o Snort por ele mesmo, para que
aqueles que quiserem experimentar posteriormente outras ferramentas tenham um bom conhe-
cimento do Snort.

16
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

Como sabemos, o Snort captura os pacotes que passam por uma dada interface de rede.
Para descobrir se está ou não havendo uma tentativa de intrusão, o Snort atravessa os dados
dos pacotes por uma série de módulos de análise e de diagnóstico. O decodificador recebe os
pacotes e os analisa no nível dos protocolos e dos cabeçalhos, descobrindo os IP envolvidos, as
portas, o tamanho do pacote e sua integridade, tudo antes mesmo deles serem remontados para
uma aplicação.
O preprocessador identifica comportamentos suspeitos de pacotes e os encaminha para uma
análise de conteúdo para o módulo seguinte. Já o processador de pacotes compara o con-
teúdo e natureza do pacote com assinaturas de ataques conhecidos, armazenadas no diretório
/etc/snort/doc e indicadas pelas regras carregadas pelo Snort (lidas no arquivo de configuração).
As mesmas regras que enviam a informação sobre os pacotes para serem processadas encami-
nham o diagnóstico para ser logado e/ou impresso no console.
O Snort pode ser configurado por quem quiser para funcionar sob o controle do inet.d, como
é padrão para quem o instalou por um gerenciador de pacotes como o apt no Debian, o que faria
com que o controlássemos com /etc/init.d/snort start/stop/restart/status... Aqui, porém vamos
manipulá-lo por conta própria, inicializando-o quando quisermos (e não automaticamente com o
boot).

17
Capítulo 5

Instalação

5.1 Instalando - 1
Primeiramente, vamos adquirir o codigo fonte do Snort.
Baixem o código no endereço http://www.snort.org/dl/ e faça o descrito a seguir.
Atualmente, no momento em que este texto foi escrito, o Snort se encontra na versão 2.6.0. É
importante que acompanhem o curso com a versão mais recente disponível, mesmo que ela não
seja mais a 2.6.
O comando a seguir, o wget, baixa da internet o pacote no endereço indicado. O mesmo vale
para todos wgets. Estes comandos se tornam naturalmente desnecessários se visitarem os sites
e baixarem os pacotes diretamente deles.

$ wget http://www.snort.org/dl/current/snort-2.6.0.1.tar.gz

Outros pacotes importantes são a biblioteca libpcap, que a maioria esmagadora dos sniffers usam
para escutar em uma interface promiscua e o pcre, um conjunto de funcoes com expressoes re-
gulares compativeis com perl. Hoje a versão do libpcap que estou baixando é a 0.9.4 e a do pcre
é a 6.3. Mas caso haja outras mais recentes, baixe-as. Procure por elas nos sites
Libpcap: http://www.tcpdump.org/release/ Pcre: http://surfnet.dl.sourceforge.net/sourceforge/pcre/

$ wget http://www.tcpdump.org/release/libpcap-<versão.mais.nova>.tar.gz

$ wget http://surfnet.dl.sourceforge.net/sourceforge/pcre/pcre-<versão.mais.nova>.tar.gz

Bom, adquira um shell root e crie uma pasta /etc/snort:

$ mkdir /etc/snort

Copie os códigos compactados que baixou até a pasta criada e entre nela:

$ cp /home/<usuário>/Desktop/snort-<número da versão>.tar.gz /etc/snort


$ cp /home/<usuário>/Desktop/pcre-<número da versão>.tar.gz /etc/snort
$ cp /home/<usuário>/Desktop/libpcap-<número da versão>.tar.gz /etc/snort

18
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

$ cd /etc/snort

(Adapte para a pasta onde se encontram os arquivos baixados, se necessário)


Descompacte os arquivos:

$ gzip -dc snort-<número da versão>.tar.gz | tar xvf -

$ gzip -dc pcre-<número da versão>.tar.gz | tar xvf -

$ gzip -dc libpcap-<número da versão>.tar.gz | tar xvf -

Entre na pasta do pcre e digite os comandos:

$ cd pcre-<versão>
$ ./configure
$ make
$ make install

Entre na pasta do libpcap e repita os comandos:

$ cd ../libpcap-<versão>
$ ./configure
$ make
$ make install

Agora entre na pasta do codigo descompactado do Snort e vamos instalar o Snort ele mesmo:

$ cd ../snort-<versão>

Rode o script configure habilitando plugins dinâmicos:

$ ./configure –enable-dynamicplugin

Habilite o uso do banco de dados mysql para uso futuros testes e experimentos adicionando,
se quiser:

–with-mysql

Compile e depois instale:

$ make

$ su

$ make install

Caso queira, retorne a pasta pai e remova as fontes utilizadas:

19
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

$ cd /etc/snort
$ rm snort-<número da versão>.tar.gz
$ rm pcre-<número da versão>.tar.gz
$ rm libpcap-<número da versão>.tar.gz

Por fim, copie os seguintes arquivos da pasta de regras para a pasta pai:

$ cd /etc/snort
$ cp rules/unicode.map .
$ cp rules/classification.config .
$ cp rules/reference.config .

5.2 Instalando - 2
Vamos, ao mesmo tempo em que conhecemos um pouco dos arquivos e diretórios utilizados
pelo snort, preparar o sistema para o seu uso. Quem instalou com apt-get não terá de fazer
adaptações.
Antes de mais nada, ganhe um shell como root. Precisamos de uma pasta para guardar as
regras de análise do snort (vamos entender isso posteriormente). Para tanto, crie, caso já não
tenha sido criada, a pasta rules dentro do diretório do snort:
Agora crie outra pasta fundamental, a pasta snort em que ficarão os logs do snort, dentro do
diretório /var/log:

$ mkdir /var/log/snort

Copie o arquivo de configuração do snort para a pasta base do snort que criamos, só para fi-
car mais à mão:

$ cp /etc/snort/snort-<número da versão>/etc/snort.conf /etc/snort

Agora vamos criar um usuário e um grupo para utilizar o snort e altere o proprietário da pasta
de logs do snort para o novo usuário snort:

$ groupadd snort

$ useradd -g snort snort

$ chown snort /var/log/snort

Por último, baixe as regras do snort da sua versão em


"http://www.snort.org/pub-bin/downloads.cgi"
No final da página tem uma sessão especial para não cadastrados. E uma sessão de regras
feitas pela comunidade (e não pela equipe do Snort).

20
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

$ wget http://www.snort.org/pub-bin/downloads.cgi/Download/vrt_pr/snortrules-pr-2.4.tar.gz

Esse comando baixa as regras do Snort 2.4 feita para os não cadastrados. Para se cadastrar não
é preciso pagar nada, mas para se inscrever sim, e esses últimos que recebem as regras mais
novas e readequadas. Para se cadastrar, entre em "https://www.snort.org/pub-bin/register.cgi".
Descompacte o arquivo:

tar -xvzf snortrules-pr-<numero.da.versao>.tar.gz

E por fim mova as duas pastas criadas (doc e rules) para a pasta do Snort:

mv doc/ rules/ /etc/snort

Por fim, copie os seguintes arquivos da pasta de regras para a pasta pai:

$ cd /etc/snort
$ cp rules/unicode.map .
$ cp rules/classification.config .
$ cp rules/reference.config .

21
Capítulo 6

Montando um snort.conf

6.1 Selecionando o código funcional


Vamos conhecer melhor o tal arquivo de configuração do Snort. Entrem no seu diretório, /etc/snort,
e abra o arquivo snort.conf com um algum editor de texto.
Logo no início do arquivo vemos a seguinte mensagem:

###################################################
# This file contains a sample snort configuration.
# You can take the following steps to create your own custom configuration:
#
# 1) Set the variables for your network
# 2) Configure dynamic loaded libraries
# 3) Configure preprocessors
# 4) Configure output plugins
# 5) Add any runtime config directives
# 6) Customize your rule set
#
###################################################

Como informado no início do snort.conf, a configuração padrão é somente um exemplo de como


um snort.conf pode ser. E são indicados quatro passos para montar o seu próprio arquivo. Como
a configuração padrão funciona bem, podemos simplismente adaptá-la às nossas condições.
Para customizar nosso arquivo sem ter nem de programar nem de embalar o Snort com outros
programas, precisamos conhecer e adaptar especialmente (senão somente) as variáveis e as
regras do Snort.
Como os scripts de bash, os comentários no snort.conf são identificados pelo caractere ’ #
’. Observem como a maior parte do arquivo de configuração é comentada. Boa parte desses
trechos não são somente comentários, mas também código que pode ser eventualmente desco-
mentado para ser habilitado. Para podermos ter uma boa visão da parte operante do arquivo e
assim modificá-la, vamos criar um novo arquivo de configuração com todas e somente as linhas
descomentadas do snort.conf padrão. O meu arquivo padrão tem exatamente 864 linhas. Só de
código comentado, são 693 linhas! Obviamente, não queremos perder esse código. Para não
perdermos esse código, e também por segurança, vamos manter o arquivo original intacto. Digi-

22
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

temos, portanto, os seguintes comandos:

$ cd /etc/snort
$ mv snort.conf snort.conf.original
$ head -n 20 snort.conf.original > original.sem.comentarios
$ cat snort.conf.original | grep -v #̂ » original.sem.comentarios
$ uniq original.sem.comentarios snort.conf

Para quem não entendeu o que foi feito, entramos na pasta do Snort para no segundo comando
renomear o snort.conf para snort.conf.original. Esse é o arquivo como veio. No terceiro comando
capturamos as primeiras vinte linhas do arquivo original para manter o mesmo cabeçalho no ar-
quivo que criamos. No quarto comando removemos todas as linhas comentadas, chamando o
arquivo resultante de original.sem.comentarios. Esse vai ser um segundo arquivo reserva. No
último comando retiramos as linhas repetidas, no caso somente as linhas em branco, para que
ficasse mais legível, e nomeamos o arquivo resultante de snort.conf - o arquivo que vamos utilizar.

6.2 Adequando a seção de regras


Adequendo as regras apontadas pelo snort.conf Antes de conhecermos a estrutura e a sintaxe
de uma regra ou de montarmos a nossa própria, vamos nos preocupar em manter nosso arquivo
de configuração consistente com as regras de que dispomos. Para tanto, abra o snort.conf em
um editor de textos, vá até seu final, onde estão as linhas "include"e abra um gerenciador de
arquivos qualquer para visualizar o conteúdo da pasta /etc/snort/rules.
Observe as linhas no seu arquivo de configuração que são como estas:
include $RULE_PATH/bad-traffic.rules
include $RULE_PATH/exploit.rules
include $RULE_PATH/scan.rules
include $RULE_PATH/finger.rules
include $RULE_PATH/ftp.rules
include $RULE_PATH/telnet.rules
include $RULE_PATH/rpc.rules
include $RULE_PATH/rservices.rules

Como em um código de uma linguagem de programação, estas linhas apontam cada uma
delas para um conteúdo que está em outro arquivo. Estes arquivos, por sua vez, estão, como
indicam as linhas, na pasta indicada pela variável $RULE_PATH. Lembrem que atribuímos a essa
variável o endereço da pasta /etc/snort/rules. Essas linhas apontam, pois, para arquivos contidos
na nossa pasta de regras.
Como o Snort lê o arquivo snort.conf para rodar e segue os caminhos apontados para os
arquivos de regras, ocorreriam erros caso houvesse ’includes’ que apontassem para arquivos de
regras que não existem. Portanto, é importante, antes de acionar o Snort, conferir se as linhas de
’includes’ apontam para arquivos de regras existentes. No caso de eles não existirem suas linhas
devem ser comentadas no snort.conf. Para tanto podemos comparar as linhas do snort.conf com
os arquivos que vemos no diretório /etc/snort/rules/.
Fiz, para este curso, entretanto, um script que automatiza essa tarefa comentando as linhas
do snort.conf que apontam para arquivos inexistentes. No entanto, pode ser do seu interesse não
comentar as linhas inadequadas do snort.conf, mas sim incluir no snort.conf linhas que apontem

23
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

para todos e somente para os arquivos de regras existentes. Outro script está disponível para
esta função. Neste caso, o Snort faria uso de todos os arquivos de regras disponíveis, e pode
ser uma boa opção para quem precisa de um IDS completo. Quem atualiza com frequência os
arquivos de regras também podem fazer um bom uso desse script.
Os scripts podem ser encontrados na página principal do curso de Snort e também nas
próximas páginas ainda nesta lição. As páginas deste curso que contêm os códigos explicam
como executá-los caso tenha dificuldades. Note que os scripts estão preparados para procurar
o snort.conf na pasta do snort /etc/snort e o diretório de regras em /etc/snort/rules. Caso sua
configuração seja diferente, altere o valor das variáveis no início do código.

6.3 Comentador dos includes do snort.conf de regras do Snort


Este script comenta automaticamente as linhas do snort.conf que apontam para arquivos de re-
gras que não existem. Copie seu conteúdo para um arquivo de nome, por exemplo, "comenta-
dor.sh"e, para utilizá-lo, digite como root:

$ chmod +x comentador.sh
$ ./comentador.sh

———————-INICIO DO CODIGO————————-

#!/bin/bash
#Comenta as linhas do snort.conf que apontam para arquivos de regras no
diretório rules/ que não existem.

ARQ_CONF="/etc/snort/snort.conf"
RULES_DIR="/etc/snort/rules"
ARQ_LISTA1="lista_de_includes_pura"
ARQ_LISTA2="lista_de_includes_gerada"
TEMPORARIO="snort.conf-temporario"

cat $ARQ_CONF | grep "include $RULE_PATH awk -F’/’ ’{print $2}’ >
$ARQ_LISTA1
for i in $(cat $ARQ_LISTA1 )
do
if [ -e $RULES_DIR/$i ]
then
echo "include $RULE_PATH/$i»> $ARQ_LISTA2
else
echo "#include $RULE_PATH/$i»> $ARQ_LISTA2
fi
done
cat $ARQ_CONF | grep -v "include $RULE_PATH» $TEMPORARIO
cat $TEMPORARIO > $ARQ_CONF
echo ” » $ARQ_CONF
cat $ARQ_LISTA2 » $ARQ_CONF

24
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

rm $ARQ_LISTA1 $ARQ_LISTA2 $TEMPORARIO

————————–FINAL DO COGIDO—————————-

6.4 Inclusor de includes de regras do Snort no snort.conf


Este script escreve no snort.conf uma linha de include para cada arquivo de regras existente no
diretório de regras padrão. Copie seu conteúdo para um arquivo de nome, por exemplo, "inclu-
sor.sh"e, para utilizá-lo, digite como root:

$ chmod +x inclusor.sh
./inclusor.sh

—————————-INICIO DO CODIGO—————————

#!/bin/bash
#Inclui no snort.conf uma chamada para cada arquivo de regras existente em
rules/

ARQ_CONF="/etc/snort/snort.conf"
RULES_DIR="/etc/snort/rules"
ARQ_LISTA1="lista_de_regras_pura"
ARQ_LISTA2="lista_de_regras_gerada"
TEMPORARIO="snort.conf-temporario"

ls -1 /etc/snort/rules | grep "rules$» $ARQ_LISTA1

for i in $(cat $ARQ_LISTA1)


do
echo "include $RULE_PATH/$i»> $ARQ_LISTA2
done

cat $ARQ_CONF | grep -v "include $RULE_PATH» $TEMPORARIO


cat $TEMPORARIO > $ARQ_CONF
echo ” » $ARQ_CONF
cat $ARQ_LISTA2 » $ARQ_CONF

rm $ARQ_LISTA1 $ARQ_LISTA2 $TEMPORARIO

—————————FINAL DO CODIGO——————————–

25
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

6.5 snort.conf resultante


#————————————————–
# http://www.snort.org Snort 2.6.0 config file
# Contact: snort-sigs@lists.sourceforge.net
#————————————————–
# $Id$
#
###################################################
# This file contains a sample snort configuration.
# You can take the following steps to create your own custom configuration:
#
# 1) Set the variables for your network
# 2) Configure dynamic loaded libraries
# 3) Configure preprocessors
# 4) Configure output plugins
# 5) Add any runtime config directives
# 6) Customize your rule set
#
###################################################
# Step #1: Set the network variables:
#

var HOME_NET any

var EXTERNAL_NET any

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

var HTTP_SERVERS $HOME_NET

var SQL_SERVERS $HOME_NET

var TELNET_SERVERS $HOME_NET

var SNMP_SERVERS $HOME_NET

var HTTP_PORTS 80

var SHELLCODE_PORTS !80

var ORACLE_PORTS 1521

var AIM_SERVERS [64.12.24.0/23,64.12.28.0/23,64.12.161.0/24,64.12.163.0/24,64.12.200.0/24,205.188.3.0

var RULE_PATH rules

26
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

dynamicpreprocessor directory /usr/local/lib/snort_dynamicpreprocessor/


dynamicengine /usr/local/lib/snort_dynamicengine/libsf_engine.so

preprocessor flow: stats_interval 0 hash 2

preprocessor frag3_global: max_frags 65536


preprocessor frag3_engine: policy first detect_anomalies

preprocessor stream4: disable_evasion_alerts

preprocessor stream4_reassemble

preprocessor http_inspect: global \


iis_unicode_map unicode.map 1252

preprocessor http_inspect_server: server default \


profile all ports 80 8080 8180 oversize_dir_length 500

preprocessor rpc_decode: 111 32771

preprocessor bo

preprocessor ftp_telnet: global \


encrypted_traffic yes \
inspection_type stateful

preprocessor ftp_telnet_protocol: telnet \


normalize \
ayt_attack_thresh 200

preprocessor ftp_telnet_protocol: ftp server


default \
def_max_param_len 100 \
alt_max_param_len 200 CWD \
cmd_validity MODE < char ASBCZ > \
cmd_validity MDTM < [ date
nnnnnnnnnnnnnn[.n[n[n]]] ] string > \
chk_str_fmt USER PASS RNFR RNTO SITE MKD
\
telnet_cmds yes \
data_chan

preprocessor ftp_telnet_protocol:
ftp client default \
max_resp_len 256 \
bounce yes \
telnet_cmds yes

27
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

preprocessor smtp: \
ports 25 \
inspection_type stateful \
normalize cmds \
normalize_cmds EXPN VRFY
RCPT \
alt_max_command_line_len
260 MAIL \
alt_max_command_line_len
300 RCPT \
alt_max_command_line_len
500 HELP
HELO
ETRN
\
alt_max_command_line_len
255

EXPN
VRFY

preprocessor sfportscan: proto all \


memcap 10000000 \
sense_level low

include classification.config

include reference.config

include $RULE_PATH/local.rules
include $RULE_PATH/bad-traffic.rules
include $RULE_PATH/exploit.rules
include $RULE_PATH/scan.rules
include $RULE_PATH/finger.rules
include $RULE_PATH/ftp.rules
include $RULE_PATH/telnet.rules
include $RULE_PATH/rpc.rules
include $RULE_PATH/rservices.rules
include $RULE_PATH/dos.rules
include $RULE_PATH/ddos.rules
include $RULE_PATH/dns.rules
include $RULE_PATH/tftp.rules

include $RULE_PATH/web-cgi.rules
include $RULE_PATH/web-coldfusion.rules
include $RULE_PATH/web-iis.rules

28
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

include $RULE_PATH/web-frontpage.rules
include $RULE_PATH/web-misc.rules
include $RULE_PATH/web-client.rules
include $RULE_PATH/web-php.rules

include $RULE_PATH/sql.rules
include $RULE_PATH/x11.rules
include $RULE_PATH/icmp.rules
include $RULE_PATH/netbios.rules
include $RULE_PATH/misc.rules
include $RULE_PATH/attack-responses.rules
include $RULE_PATH/oracle.rules
include $RULE_PATH/mysql.rules
include $RULE_PATH/snmp.rules

include $RULE_PATH/smtp.rules
include $RULE_PATH/imap.rules
include $RULE_PATH/pop2.rules
include $RULE_PATH/pop3.rules

include $RULE_PATH/nntp.rules
include $RULE_PATH/other-ids.rules
include $RULE_PATH/virus.rules
include $RULE_PATH/experimental.rules

29
Capítulo 7

Variáveis

7.1 Conhecendo as variáveis


Bom, antes de mais nada, abram seus reespectivos snort.conf, que devem estar em /etc/snort,
com qualquer editor de texto de sua preferência (eu recomendo o vim para qualquer coisa e
sempre!). Na medida em que eu for descrevendo as variáveis, vamos adequando o snort.conf
aos nossos usos particulares.
As variáveis básicas
Vamos primeiramente dar uma olhada nas variáveis do snort.conf de que falávamos. Entre
em /etc/snort e abra o nosso arquivo snort.conf com qualquer editor de textos.
No arquivo que apresentei na última página, as variáveis declaradas foram:

var HOME_NET any


var EXTERNAL_NET any
var DNS_SERVERS $HOME_NET
var SMTP_SERVERS $HOME_NET
var HTTP_SERVERS $HOME_NET
var SQL_SERVERS $HOME_NET
var TELNET_SERVERS $HOME_NET
var SNMP_SERVERS $HOME_NET
var HTTP_PORTS 80
var SHELLCODE_PORTS !80
var ORACLE_PORTS 1521
var AIM_SERVERS

64.12.24.0/23, 64.12.28.0/23, 64.12.161.0/24, 64.12.163.0/24, 64.12.200.0/24, 205.188.3.0/24, 205.188.5.0/24, 205

var RULE_PATH rules

As variáveis básicas vitais As variável que Snort reconhece, como podemos esperar, são pre-
definidas. As variáveis que vemos acima são importantes para o funcionamento do Snort, ainda
que a boa configuração de três delas seja mais vital na medida em que são variáveis-chave. Elas
são:

HOME_NET

30
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

EXTERNAL_NET
RULE_PATH

Sintaxes de definição de variável


A sintaxe de uma definição de variáveis para o Snort é muito simples:
var nome-da-variável valor-da-variável

7.2 Entendendo e definindo as variáveis


HOME_NET
Quando o valor declarado é any, significa que qualquer valor de tipo compatível com o da a
variável será considerado um valor da variável. Se HOME_NET, pois, vale "any"e a HOME_NET
é a variável relativa à seção da rede a estar no escopo interno do Snort, então qualquer interface
de rede que for encontrada será analisada pelo Snort. Neste caso um pacote que sai de nossa
máquina para um IP de fora também é considerado interno ao Snort. Talvez não queiramos incluir
no escopo interno da vistoria do Snort quaisquer interfaces. Se quisermos incluir todas interfaces
da rede interna, temos de substituir "any"pelo endereço da rede interna. Alguns exemplos são:

var HONE_NET 192.168.0.0


var HOME_NET 192.168.1.0
var HOME_NET 10.0.0.0
var HOME_NET 172.16.0.0

Provavelmente, porém, também não queremos incluir toda uma rede interna no escopo da HOME_NET,
e nesse caso, vamos querer restringir sua seção. Para tanto, precisamos expecificar sub-redes
com o padrão CIDR. Para saber mais, dê uma olhada nesta página sobre o padão CIDR na
wikipedia.
Uma definição como aquelas acima, que incluem toda rede interna, é o mesmo que os exem-
plos abaixo, utilizando CIDR:

var HONE_NET 192.168.0.0/32


var HOME_NET 192.168.1.0/32
var HOME_NET 10.0.0.0/32
var HOME_NET 172.16.0.0/32

Podemos definir sub-redes como:

var HOME_NET 192.168.0.0/16


var HONE_NET 192.168.0.0/24
var HOME_NET 192.168.0.0/26
var HOME_NET 192.168.0.0/28

Para determinar como HOME_NET somente a nossa própria máquina, porém, definimos, mais
que naturalmente, o nosso próprio IP, como por exemplo:

var HOME_NET 192.168.0.2

31
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

Note que, neste caso, o Snort não precisa trabalhar em modo promíscuo (ainda que ele o faça
por padrão)! Caso queiramos, o que é razoável, incluir mais de uma máquina, definimos uma lista
separada por vírgula, sem espaços e entre colchetes, como por exemplo:

var HOME_NET [192.168.0.2,192.168.0.3]

Analogamente, se queremos definir duas sub-redes distintas, ou mesmo uma máquina e uma
sub-rede, fazemos, por exemplo:

var HOME_NET [10.0.0.1/24,192.168.0.0/24]

ou

var HOME_NET [10.0.0.1/24,192.168.0.2]

EXTERNAL_NET
A variável EXTERNAL_NET é reservada para a definição de que endereços serão reconheci-
dos como externos para o Snort. Podemos, seguindo as mesmas regras sintáticas da definição
da HOME_NET, definí-la seccionando a rede ou mesmo mantendo-a como "any". O ideal, no
entanto, talvez fosse simplismente definir EXTERNAL_NET como tudo aquilo que não é conside-
rado interno pelo Snort, ou seja, tudo aquilo que não for HOME_NET. Note, entretanto, que neste
caso estará ignorando pacotes internos, correndo o risco de perder detecções de ataques de
dentro da própria rede. Para definir a rede externa como a negação do que seja a interna, enfim,
podemos utilizar o símbolo ’ ! ’ (exclamação), que significa a negação do valor que o segue. Para
definir EXTERNAL_NET como sendo aquilo que não é HOME_NET, basta definí-la como:
var EXTERNAL_NET !$HOME_NET
Tome somente o cuidado de não definir a EXTERNAL_NET como !$HOME_NET se antes
definiu a HOME_NET como "any", pois neste caso estaria informando que a rede externa é tudo
que não é qualquer coisa, o que não é possível, visto que a sua rede externa tem de ser alguma
coisa. Caso queira fazer o Snort experimentar a vertigem de um paradoxo, faça-o e depois me
conte o resultado. Provavelmente um erro simples.
Como de se esperar, temos de utilizar o símbolo do cifrão ’ $ ’ antes de HOME_NET para
estarmos referindo a variável HOME_NET, e não à palavra HOME_NET.
RULE_PATH
A variável RULE_PATH não depende da sua rede nem do que queremos fazer com ela. Esta
variável indica o caminho do diretório no seu sistema de arquivos em que se encontram as regras
que o Snort poderá utilizar. Dentre essas, indicaremos algumas ao final do arquivo de confi-
guração e adequaremos e faremos outras. Mas todos arquivos de regras indicados no final do
snort.conf devem estar no mesmo diretório. O caminho desse diretório deve ser o valor da variá-
vel RULE_PATH. Na instalação que sugeri, o diretório de regras fica em /etc/snort, e seu caminho
absotulo é /etc/snort/rules. A definição de RULE_PATH para essa instalação pode ser, portanto:

var RULE_PATH /etc/snort/rules

ou até mesmo

var RULE_PATH rules

32
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

As outras variáveis
As outras variáveis dizem respeito aos servidores da sua rede e a algumas portas relevantes.
Cada tipo de serviço possui uma variável particular que deve apontar para o IP da máquina que
o realiza. Se sua própria máquina que serve o Snort realiza um serviço, a definição pode ser:

var HTTP_SERVERS $HOME_NET

33
Capítulo 8

Regras

8.1 Introduzindo
Bom, tudo o que preparamos até então dentro do arquivo snort.conf, que foi adequar as variáveis
às nossas condições, tem uma única e exclusiva finalidade: a de permitir o funcionamento das
regras comuns, como as três básicas e as que dizem respeito a serviços e portas. Afinal, são
essas regras que vão se utilizar das variáveis que definimos. Essas regras têm a função de
decidir que processamento um pacote vai sofrer e que caminho o dignóstico vai tomar, para que
essas decisões sejam tomadas, as informações que colocamos nas variáveis são fundamentais.
Essas regras decidem, pois, sobre o valor que as variáveis a elas relevantes possuem. Note que
qinda que a maioria delas faça referência às variáveis HOME_NET e EXTERNAL_NET, somente
algumas fazem referência às variáveis do endereço de serviços específicos. Definir bem todas
as variáveis permite que o Snort faça uma análise mais inteligente tendo em vista o destino dos
pacotes intrusivos, ao mesmo tempo que economiza seu processamento evitando que ele procure
exploits para Web direcionados para o servidor exclusivo de DNS.

8.2 Entendendo as regras


Assim como essas linhas de ’includes’ estão apontando para outros arquivos, poderíamos perfei-
tamente simplismente colar em seus lugares o conteúdo dos arquivos aos quais apontam. Utilizar
arquivos distintos que são referenciados pelo snort.conf é, pois, uma maneira de manter um ar-
quivo de configuração mais organizado e regras mais fáceis de se manter e de atualizar. Fica
claro porque utilizar linhas que apontam para arquivos separados e não simplimente deixar todos
códigos no mesmo arquivo se abrirmos um arquivos de regra qualquer.
Abra, por exemplo, o arquivo de regras porn.rules. O caminho do arquivo, como sabemos, é
/etc/snort/rules/porn.rules. Como podem imaginar, as regras desse arquivos se destinam a reco-
nhecer conteúdos de pacotes que vêm de sites pornográficos. Esse arquivo de regras, apesar de
engraçado e até constrangedor, revela de forma simples como as regras, em geral, operam. Sua
função pode servir muito bem a instituições decididas a retardar a difusão da pedofilia impedindo
o acesso a sites pornográficos de dentro das redes, ou mesmo pode servir a pais que querem sa-
ber se seus filhos vêem pornografia na internet. O exemplo é interessante pois é uma arquivo de
regras que busca por strings no payload dos pacotes, tendo um funcionamento intuitivo, portanto.
Com o porn.rules aberto, observe que a partir da linha 9 há uma regra por linha. A frente
segue uma regra do arquivo recortada:

34
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

alert tcp $EXTERNAL_NET $HTTP_PORTS -> $HOME_NET any (msg:"PORN erotica"; con-
tent:"erotic"; nocase; flow:to_client,established; classtype:kickass-porn; sid:1798; rev:1;)
As informações escritas até os parênteses são parte do que chamamos de cabeçalho da
regra, e o que vem dentro deles são as opções da regra. Aquilo que vem dentro dos parênteses
e antes dos ’dois pontos’ é chamado de palavra-chave.

1. Com alert, esta regra diz ao Snort para gerar um alerta e logar;

2. tcp informa o protocolo do pacote;

3. $var1 $var2 -> $var3 $var4 informa que os pacotes que interessam a esta regra são aqueles
que vêm da rede de fora (no caso, $var1) pelas portas que servem o protocolo http (no caso,
$var2) e entram ( -> ) na rede interna (no caso, $var3) por qualquer porta (any);

4. msg é a palavra-chave que leva o alert do Snort a imprimir uma mensagem no alerta e nos
logs. No caso, a mensagem é "PORN erotica";

5. content informa ao Snort que string será procurada dentro do payload do pacote.

6. nocase desabilita a sensibilidade da regra a se as letras são minúsculas ou maiúsculas;

7. flow:to_client,established indica, no caso, que o pacote vai em direção ao cliente da conexão


e que o estado desta é estabelecido;

8. classtype classifica o tipo de pacote.

9. Sid e Rev respectivamente se referem ao número de identificação da regra e ao número de


sua revisão.

8.3 Montando regras


Vamos tentar montar uma regra para Snort extremamente simples, mas funcional, para tentarmos
ganhar alguma familiaridade com o desenvolvimento de regras. Aquelas pessoas que gostam de
programar, entendem de protocolos de rede e que gostam do Snort, podem, quem sabe, partir
daqui para uma pesquisa aprofundada de como se desenvolve regras especais para o Snort.
Bom, vamos dizer que gostaríamos de saber quantas vezes em nossa rede parece o nome
do atual presidente do Brasil, Lula, e de que ips vêm os pacotes em que ele aparece. Digamos,
por exemplo, que quiséssemos essa informação para uma pesquisa.
Abra, portanto, o seu snort.conf com qualquer editor de textos e vá até o seu final. Para con-
seguir o que queremos precisamos gerar um alerta, que é uma das ações que uma regra pode
realizar. A, em geral, mais interessante e certamente a mais comum. Nossa regra começa, por-
tanto, com a ação alert.

alert

Note que até a última versão do Snort todas as regras tinham que ser escritas em uma única
linha, mas que agora podemos continuá-las na linha seguinte se ’escaparmos’ o salto de linha
com o caractere ’ ’ ao final de cada linha.
Depois de alert informamos que tipo de protocolo constitui a conexão dos pacotes em que
estamos interessados(as). Como vamos procurar por pacotes relativos a conexões web, a um

35
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

site, então o protocolo dos nossos pacotes será o tcp regular.

alert tcp

Em seguida, como já vimos em nosso exemplo de regra, vem os ips e portas de origem e de
destino dos pacotes. Em nosso caso, queremos encontrar pacotes que saiam de nossa rede,
portanto podemos informar o ip de origem como qualquer um que venha de nossa rede, a defi-
nida em $HOME_NET e o ip de destino como qualquer um que saia de nossa rede, a definida em
$EXTERNAL_NET. A porta de destino é a 80, e a de saída podemos definir como qualquer
uma, any. Veja como está a nossa regra até então:
alert tcp $HOME_NET any -> $EXTERNAL_NET 80
O que acabamos de escrever foi o cabeçalho de nossa regra. Agora precisamos abrir pa-
renteses e escrever as opçoes da regra, que são sempre iniciadas por palavras-chave. Estamos
interessados(as) no uso de duas palavras-chave em particular: a content e a msg. Com ’content’
definiremos que string procurar, e com ’msg’ definiremos que mensagem aparecerá no alerta que
será gerado para nos.
Como procuramos por aparições da string Lula, podemos informar a palavra-chave content
com a string Lula. A mensagem que queremos que apareça pode ser algo como "La vem ’Lula’
pelo cabo de rede!". Adapte esta frase caso esteja em uma rede wireless! Nossa regra fica:
alert tcp $HOME_NET any -> $EXTERNAL_NET 80 (content: "Lula"; msg: "La vem ’Lula’ pelo
cabo de rede!";)
Nossa regra pode ser considerada pronta. Como vimos, podemos adicionar um indicador
do tipo de alerta em que os alvos dessa regra devem se encaixar, podemos dar um valor de
identificação para a regra e setar a sua prioridade frente às outras. Este tipo de informação tem
de ser previa e adequadamente configurada dentro do arquivo classification.config. As pessoas
interessadas realmente deviam dar uma olhada na documentação oficial.
Mais tarde neste curso vamos ter a oportunidade testar nossa regra.

36
Capítulo 9

Rodando o Snort

9.1 Os logs
Uma última configuração que vai nos interessar por hora é o destino dos diagnósticos, os logs. Os
logs, além de poderem ser enviados para o console em tempo real, podem ser tanto armazenado
em arquivos quanto escritos em tabelas de um banco de dados. O arquivo pode ser escrito tanto
em alertas quanto em formato tcpdump. Este formato não é legível sem uma ferramenta como o
ethereal ou o próprio Snort.
Existem outras formas de gerar outputs com o Snort, dêem uma olhada nesta página da
documentação on-line. Aqueles já familiarizados com o syslog podem se interessar em utilizar o
syslog como gerenciador dos logs do Snort. A documentação é bastante completa.
#Para logar os alertas no arquivo de alerta regular, descomente ou escreva a linha a seguir e
substitua os valores:
output alert_unified: filename <arquivo>, limit <tamanho máximo do arquivo, em MB>
#Para logar todos os pacotes, escreva e substitua os valores:
output log_unified: filename <arquivo>, limit <tamanho máximo do arquivo, em MB>
#Para o snort colocar os resultados em um banco de dados mysql, descomente a seguinte
linha e substitua os valores:
output database: log, mysql, user=<usuário> password=<senha> dbname=<nome do banco>
host=<host>

9.2 Os modos de funcionamento


Existem pelo menos quatro modos de funcionamento do Snort. Segundo a própria documentação
oficial, eles são:

• Modo sniffer (Sniffer mode): neste modo o Snort simplesmente lê interpreta os pacotes
capturados da rede e os apresenta no console em tempo real.

• Modo de logger de pacotes (Packet Logger mode): neste modo o Snort loga os pacotes
lidos no disco, de acordo com o método de output anteriormente selecionado.

• Modo detector de intrusão (Network Intrusion Detection System (NIDS) mode): neste modo
o Snort não somente captura e lê pacotes, seja para apresentá-los no console ou para
logá-los em disco, rodando neste modo o Snort analisa e interpreta os pacotes segundo as

37
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

assinaturas e toma as decisões de acordo com as regras definidas. Este é modo completo
do Snort, em que ele realiza aquilo que o temos preparado para realizar.

• Modo Inline (Inline Mode): neste modo o Snort não utiliza a biblioteca de captura de pacotes
libpcap diretamente, mas lê os pacotes capturados pelo Iptables, o que permite a automati-
zação de decisões de IDS ativas, como descartar ou autorizar pacotes. Para tanto existem
regras especiais inline. O uso deste modo não vai ser explicado neste curso.

9.3 Enfim, rodando


Vamos experimentar alguns comandos que fazem o Snort rodar naqueles três primeiros modos
apresentados. Vamos conhecer alguns de seus parâmetros para adequar o Snort aos nossos
interesses. Abra um terminal como root e vamos lá.
Testando o Snort Antes de mais nada, digite:
$ snort -T

Conhecendo os parâmetros
Possivelmente o somando simples ’snort’ vá mostrar uma lista de parâmetros para uso. Caso
não mostre, podemos ver a lista com o comando:
snort –help
Vendo a versão
Para saber a versão instalada do Snort basta, porém, utilizar o parâmetro -V:
$ snort -V
Rodando em modo daemon
Para rodar o Snort automaticamente em background, em modo daemon, podemos utilizar o
parâmetro -D, aliado ao que quisermos fazer com ele. Mas note que não parece fazer sentido
utilizá-lo como um daemon no modo sniffer se nesse modo queremos ver os pacotes em tempo
real e não logarmos eles.
$ snort <uso> -D
Desabilitando o modo promíscuo

38
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

Para utilizar o Snort fora do modo promíscuo setamos o parâmetro -p. Este parâmetro so-
mente será interessante caso a variável $HOME_NET tenha sido definida com o próprio ip da
máquina que serve o Snort, pois nesse caso não interessa a ele os pacotes destinados a outras
máquinas senão o localhost.
$ snort <uso> -p
Indicando um arquivo de configuração a ser carregado
Podemos querer carregar o Snort com um arquivo de configuração alternativo que tenhamos
construído para teste, por exemplo. Neste caso, na chamada do Snort devemos indicar a ele o
caminho do arquivo com o parâmetro -c. Neste caso o Snort funcionaria em modo NIDS, que
conheceremos logo adiante.
$ snort <uso> -c <arquivo>
Vamos conhecer mais parâmetros na medida em que formos conhecendo seus outros dois
modos de funcionamento.
Saia então pressionando ’<Ctrl>+c’ e vamos fazê-lo rodar como queremos.

9.4 Modo sniffer


$ snort -v
Com o comando acima acionamos o Snort para rodar no modo sniffer. Observe como ele
simplismente captura os pacotes que atravessam a interface em modo promíscuo e apresenta o
seus cabeçalhos, seja parte do protocolo TCP, UDP ou ICMP, e somente os cabeçalhos.
Nos cabeçalhos podemos ler os ips e portas de origem e destino, o protocolo e o Snort
também nos informa a hora e data da captura.

Podemos também querer ver, mais do que os cabeçalhos, os dados da camada de aplicação.
Para tanto adicionamos o parâmetro -d:
$ snort -vd
Com este parâmetro enxergamos não somente os cabeçalhos, mas o conteúdos dos pacotes
que podem conter, por exemplo, strings digitadas claras, se conexão não era criptografada.

39
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

Por último, podemos também querer ver os dados dos cabeçalhos da camada de enlace
adicionando o parâmetro -e:
$ snort -dev
$ snort -e

Para terminar a captura de pacotes com o modo sniffer, basta digitar <Ctrl>+c. Ao final de uma
sessão de captura, algumas informações interessantes são apresentadas, como a quantidaed de
pacotes capturados, a porcentagem de aparição de cada protocolo, e quantos alertas e logs foram
gerados.

40
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

9.5 Modo logger


Utilizando o modo logger de pacotes do Snort
Este modo de funcionamento, como foi explicado, se destina a permitir que as informações
que vemos no modo sniffer sejam logadas, seja em arquivos texto, binário ou em bancos de
dados. Este modo se baseia em um único parâmetro a ser adicionado aos parâmetro de sniffing
-v (verbose). É o parâmetro -l de log. O comando mais simples que faz o Snort rodar em modo
logger seria:
Simplismente logando
$ snort -v -l <diretório>
Caso omitisse o <diretório>, o Snort provavelmente logaria a saídas em uma pasta com en-
dereço do localhost ou em pastas de acordo com os ips que originaram os pacotoes. Podemos,
exatamente por causa dessa lógica do Snort, pedir que ele logue as saídas em uma estrutura
de diretórios divida por endereços de origem. Para tanto, passamos o parâmetro -h seguido da
sessão da rede a ser considerada:
Organizando os logs em subdiretórios
$ snort -v -l <diretório> -h 192.168.0.0/24
Logando em tcpdump
Como já sabemos, podemos também arquivar os logs não em arquivos planos, mas em ar-
quivos binários no formato do tcpdump.
$ snort -l <diretório> -b
Quando logamos em formato tcpdump não precisamos nem informar o parâmetro -v nem in-
formar o home network com -h, pois com -b o Snort loga por padrão todo o pacote não precisando
separar em sessões legíveis e automaticamente organiza os logs.

41
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

Lendo arquivos de log em tcpdump com o Snort


Para ler os arquivos em tcpdump gravados podemos pedir que o Snort nos mostre as infor-
mações que queremos de dentro dos logs com o parâmetro -r. Por exemplo:
$ snort -dev -r <arquivo.log>
Mais que isso, podemos pedir que nos mostre somente os pacotes icmp adicionando ICMP
no final do comando:
$ snort -dev -r <arquivo.log> icmp
Logando em ASCII
Quando não especificamos a formatação do texto (com a opção -K), o Snort cria logs usando
PCAP. Dessa forma, não podemos ler os arquivos com um simples editor de texto, temos de usar
programas como o Ethereal. Para podermos ler os arquivos com editores de texto, usamos ’-K
ascii’, como no exemplo:
# snort -b -l /var/log/snort -K ascii

9.6 Modo NIDS


Este é certamente o modo mais complexo do Snort, pois envolve etapas mais sofisticadas do
que aquelas de um simples sniffer de rede. É também exatamente isso que faz do Snort uma
ferramenta especial. As etapas que o modo de NIDS inclui são a análise dos pacotes segundo
as assinaturas, os diagnósticos e as tomadas de decisão sobre o output de acordo com os di-
agnósticos dados. As duas últimas etapas são alta e, em alguns casos, facilmente configuráveis
através das definições de regras contidas no ou apontadas pelo snort.conf.
Como neste modo o Snort consome muito mais processamento, é mais eficiente rodá-lo sem
o parâmetro -v que o faz direcionar as saídas para a tela. Pois o esforço de imprimir em tela as
saídas, além do de escrever os logs, pode fazer com que o Snort deixe passar alguns pacotes
por debaixo do seu nariz por falta de tempo. É bom, portanto, deixar ele se concentrar em sua
função de análise e de log e utilizar outro programa para a vistoria dos logs.
Este modo é inciado a partir do parâmetro -c, que especifica um arquivo de configuração do
Snort a ser lido. O comando, em um formato simples é:
$ snort -d -c snort.conf
Neste caso, como não definimos arquivo de log, os logs irão para /var/log/snort. Como não
definimos o tipo de log, ele será escrito em texto simples. Podemos, no entanto, tornar a chamada
mais elaborada:

$ snort -dev -l <arquivo.log> -h 192.168.0.0/24 -c snort.conf

$ snort -b -l <arquivo.log> -h 192.168.0.0./24 -c snort.conf

Alertas
Por padrão o Snort no modo NIDS arquiva o log dos pacotes e gera de vez em quando logs
especiais chamados alertas, que são logs de aviso de aparentes tentativas de ataque ou visto-
ria para ataque. Esses logs de alerta são gravados por padrão no arquivo /var/log/snort/alert.
Quando não especificamos preferências quanto aos alertas, como nos comandos acima, o Snort
funciona no modo que chamamos de full alert. Por padrão, digitar um comandos comos os digi-
tados acima é o mesmo que digitá-los acompanhados do parâmetro -A full:
$ snort -d -A full -c snort.conf

42
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

Outros modos de alertas interessantes são o modo que desabilita alertas, o ’-A none’, o modo
que envia os alertas para o console (além, possivelmente, dos logs regulares), o ’-A console’, e
modo de análise e log rápidos, o ’-A fast’.

Desabilitando o log de alertas:

$ snort -d -A none -c snort.conf

Enviando os alertas para a tela:

$ snort -d -A console -c snort.conf

Processando pacotes de forma otimizada:

$ snort -d -A fast -c snort.conf

No caso deste último modo, pode ser interessante que se utilize o parâmetro -b para que o Snort
use logs binários, que são mais ágeis, já que se precisa de velocidade. Além disso vale muito a
pena considerar o uso da ferramenta barnyard, que otimiza o Snort fazendo por ele os logs em
arquivos claros e em banco de dados, deixando o Snort livre para a análise de pacotes, afinal o
processo de escrita, especilmente em bancos, pode ser demorado para a velocidade exigida ao
Snort em uma rede de banda larga.
$ snort -b -A fast -c snort.conf

43
Capítulo 10

Notas finais

10.1 Conferindo os alertas


Enfim temos uma boa oportinidade de testar a regra que criamos. Como é uma única regra e foi
escrita dentro do nosso arquivo snort.conf, não precisamos deixá-la na pasta de regras.
Bom, entremos na linha de comando e vamos botar pra rodar nosso Snort no modo NIDS
deixando-o logar no diretório padrão todos os alertas.
$ snort -A full -c snort.conf
Agora, enquanto o Snort roda, abra um navegador qualquer e procure em um site de busca
por notícias sobre o presidente Lula. Abra alguns sites que falem sobre ele, navegue um pouco
nas notícias e depois de um tempo feche a aba do navegador e retorne para o console.
Leia enfim o arquivo com os alertas gerados:
$ cat /var/log/snort/alert

10.2 Outros aplicativos


Como já comentado no curso, existem programas que podem auxiliar e muito o uso do Snort.
Existem basicamente três atividades ou funções em que o Snort pode ser auxiliado:

• Otimização do processo de logging;

• Gerenciamento e organização dos logs;

• Extender o Snort para agir como um IDS ativo.

1 - Barnyard O Snort analisa pacote por pacote, procurando aqueles que se encaixam em
alguma regra configurada. Antes de passar para o próximo pacote, o Snort pode precisar gerar
um log e/ou um alerta sobre esse pacote. Se, por exemplo, o Snort estiver escrevendo no banco
de dados diretamente, ele precisa esperar a confirmação da escrita no banco antes de analisar
o próximo pacote. Em redes de grande tráfego, esse tempo da confirmação pode fazer com que
o Snort deixe de analisar algum pacote, o que deterioraria a confiabilidade do programa. E se o
banco de dados cair, o Snort cai também.
O Barnyard foi feito para contornar esse problema. Você configura o Snort para escrever em
um arquivo, e o Barnyard cuida de jogar os dados desse arquivo para o banco, deixando o Snort
livre para a análise de pacotes.

44
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF

2 - Oinkmaster Oinkmaster é um programa que gerencia as regras usadas pelo Snort. Ele
baixa o arquivo, descompacta, faz backup das regras antigas e oferece outras facilidades. Enfim,
ele nos ajuda a gerenciar as regras.
3 - Guardian Segundo a própria descrição do site oficial, o Guardian é um programa de que
trabalho em conjunto com o Snort para atualizar automaticamente regras de firewall de acordo
com os alertas gerados pelo Snort. As regras de firewall geradas bloqueiam todos dados que vêm
de endereços de máquinas que estão realizando ataques segundo os diagnóstico dos alertas.
Existem recursos, no entanto, que previnem que o iptables termine bloquando o endereço de
máquinas importantes e amistosas.
Com ’ativo’ quero dizer que um IDS poderia tomar medidas de segurança a partir dos resulta-
dos dos logs. O Snort, no entanto, é passivo na medida em que simplismente loga eventos, mas
não bloqueia ips nem normalmente impede de forma alguma que os ataques aconteçam.
Aqui vai pois a sugestão de três programas destinados a satisfazer cada uma das funções
listadas acima. Caso pense em implementar a sério o Snort, considere bem essas ferramentas
pesquisando sobre elas.
O trecho que recortei começa próximo à linha 45, e trata do backend de banco de dados.
Como podemos ver o bdb é considerado o padrão, mas outros podem ser utilizados se informados
no lugar de <other>, como é explicado no trecho acima. Caso queira utilizar outro backend de
banco exclusivamente, comente as linhas padrões do dbd. Outras possibilidades são:

45

Você também pode gostar