Pular para o conteúdo principal

Snort - IDS, Configurações e Assinaturas

1.    Em que consiste um IDS:

A detecção de intrusão tem as suas raízes nos sistemas de auditoria financeira às Mainframes. Os acessos tinham que ser cuidadosamente controlados, dessa forma foram criados mecanismos de segurança capazes de permitir aos administradores analisar logs em busca de anomalias que indicassem mau uso ou alterações aos ficheiros não autorizados. Este é o principio de detecção de intrusões, ou IDS (Intrusion Detection Systems).
A ideia por detrás deste tipo de sistema é simples, um agente monitoriza actividade dos ficheiros num host ou no tráfego da rede e reporta as situações anómalas que possam ocorrer ao administrador.
O mercado encontra-se dividido em duas vertentes: host-based e network-based.

1.1  Host-Based IDS

Adicionam uma camada alvo de segurança a uma aplicação particularmente vulnerável ou a sistemas essenciais. Um agente monitoriza por exemplo um servidor de base de dados, audita e mantém um trilho, logs do sistema de situações anómalas, permissões, etc. O agente pode ainda empregar o checksum regularmente dos principais ficheiros do sistema e regularmente verificar se estes foram alterados, permitindo desta forma parar um ataque se detectado. Apesar da função primária do sistema ser de enviar logs e alertas.

1.1.1        Vantagens:
·        Pode detectar tanto externamente como internamente misuse, algo que as redes e as firewalls não conseguem.
·        Quebras de segurança são mais prováveis internamente que um hacker fora da empresa.
·        Hosts –Agents são uma ferramenta poderosa para endereçar uma autorização e aceder a itens e que tornam a segurança tão complexa.


1.1.2        Desvantagens:
·        Os agentes instalam-se directamente no host a ser monitorizado, consumindo dessa forma recursos, tendo que ser compativel com o OS do host.
·        Pedir quais as exigencias do agente em termos de memória e de CPU, pois variam de vendedor para vendedor.

1.2  Network – based IDS

Este localiza-se na LAN, ou num segmento, e monitoriza o trafego da rede pacote a pacote em tempo real (se possível), por forma a verificar se um qq ataque coincide com as assinaturas já predeterminadas, padrões de ataque já conhecidos.
Exemplo, o TearDrop Denial of Service envia pacotes fragmentados duma maneira que crash o sistema alvo. O agente reconhece este padrão e toma-o em consideração.
O Vendedor fornecerá a base de dados das assinaturas dos ataques, bem como os administradores podem personalizar determinadas assinaturas. O IDS alerta o administrador e nalguns casos pode tomar acção de terminar a ligação. Também guarda os ataques para posterior analise. Poderá ainda ser ligado a outros sistemas, por exemplo FireWall por forma a garantir que estes não apresentam brechas.

1.2.1        Vantagens:
·        acompanhamento Real time do alarme. Valioso para ataques DoS.
·        Colecção. Os administradores poderão analisar não apenas o que poderia saír danificado, como poderão indicar falhas na segurança para correcção. Muitos hacker, primeiro fazem um scan à rede para detectar vulnerabilidades
·        São independentes do OS
·        Requer um nó dedicado que assente no segmento a monitorizar e uma NIC configurada em modo promiscuo. Requer ainda uma ligação segura entre o monitor e a consola.

1.3  Como implementar um IDS

Será incluir na política de segurança do sistema. Uma política de segurança definirá a arquitectura básica da rede, e descreve como a rede será segura, estabelecendo uma hierarquia de acessos por parte dos utilizadores e de recursos.
Verificar muito bem, definir, os recursos necessários (humanos, técnicos, software, hardware, necessários à implementação de um IDS. Poder-se-á optar por uma implementação ou outra ou uma mistura de ambas. Tudo depende do grau de segurança requerido para a informação, do orçamento disponível, e os recursos diponíveis para gerir o sistema.
Host based estão limitados a um servidor e custam menos que um Network based, no entanto estes últimos cobrem uma vasta área da rede.
Network monitors tem dificuldade com o transito encriptado. Se a information estiver encriptada IDS não conseguem decifrar o pacote, não prevenindo dessa forma um eventual ataque.

A encriptação não impede os agentes de host, porque os dados são decifrados antes que um agente de host os veja.

Sensores de rede poder-se-ão tornar num ponto de estrangulamento numa rede de elevado débito, degradando dessa forma a performance e frustando os utilizadores. De acordo com um white paper da ICSA, uma network based IDS poderá gerir até 65 Mbits/sec do tráfego antes que a performance do motor de analise decresça.

1.4  Manutenção

A questão dos logs, preparar o sistema, dependendo do número de agentes de monitorização, dedicar bastante espaço de armazenamento para os logs. Terá que assegurar uma elevada segurança ao armazenamento dos logs por forma a que os hackers não possam alterar, ou apagar, esses logs que evidenciam as intrusões.
Como os produtos anti-vírus, uma assinatura de um ataque identificável por um IDS conduz a que a base de dados de assinaturas do IDS esteja actualizada com a mais recente informação, tenha a certeza que está a questionar por updates com a frequência necessária. Pequenas variações podem ser o suficiente para alterar uma eficaz detecção.

1.5  Lidando com os incidentes.

Quando instalar um IDS, esteja preparado para o caso dele funcionar. Tenha preparado um plano para lidar com intrusões assim que as detectar. Criar uma equipe capaz de lidar com os incidentes é um importante primeiro passo. Esta equipe dependerá do tamanho e recursos da empresa, mas cada membro da equipa deverá ter bem definido as suas funções e responsabilidades.
Deverá ser criada uma politica incident-handling que esteja orientado para os contactos da equipe e informações desta. Procedimentos incluem Backup um determinado disco, ou determinar se é necessário contactar um especialista externo ou as forças da lei.
Neste último caso trona-se um pouco complicado tomar esta decisão, pelo que se torna necessário criar uma politica bem definida.

1.6  Será um IDS o mais certo para a sua empresa

IDS ainda é uma tecnologia em maturação, em desenvolvimento, e nem toda a comunidade está convencida da sua viabilidade. Comparado por vezes à guerra das estrelas – caro e ineficaz.
É claro que caro é um pouco relativo, pois um IDS pode não ser barato, o custo de um ataque de DoS e a má imagem que provoca podem facilmente justificar o investimento.

Quanto à eficácia um IDS não é uma solução implementa e esquece, é uma solução que exige constante actualização, uma politica de segurança rigida, um constante acompanhamento dos logs, por forma a retirar o máximo partido deste esquema.
Desta forma IDS será uma mais valia na segurança do sistema.

O principal objectivo deste documento é dar uma visão global do que é o SNORT, um IDS do tipo Host-based,  fornecendo as indicações necessárias, os passos a dar para instalar e configurar o produto.

2.    O que é o SNORT?

  1. É um Sistema de Detecção de Intrusões (IDS)
  2. Suporta inspecção tanto ao header como payload, permitindo desta forma reduzir os falsos positivos.
  3. Capacidades de alertas/logs bastante fléxiveis
  4. Capacidade de resposta bastante limitada
  5. Corre na maioria dos sistemas UNIX, Windows e MacOSx (desde que o OS permita a compilação e instalação da livraria libpcap).
  6. Free (GPL) – disponível o código fonte segundo o standard GNU general public license.
  7. Adaptação via a sua arquitectura plug-in, permitindo desta forma criar uma funcionalidade que necessitemos.

2.1. Instalação do SNORT para Linux/Unix

1. Instalar pré-requisitos:
a. Libpcap – verificar se já se encontra instalada
b. Se não estiver instalada obter por:
                ftp://ftp.ee.lbl.gov/libpcap.tar.Z ou http://www.tcpdump.org

2. Obter o package SNORT disponivel em: http://www.snort.org

Nota: para verificar se a libpcap (uma aplicação capaz de capturar pacotes da rede), se encontra instalada utilizar os comando “locate” ou “find” ou mesmo “whereis”. Se se encontrar instalada mas o sistema ainda reporta erros, verificar se as livrarias pertencentes à libpcap podem ser encontradas via as variáveis de ambiente (variável de ambiente LD_LIBRARY_PATH )

3. gunzip e untar o código fonte:

    a. mv /home/myself/snort-1.8.6.tar.gz  /usr/local/src
    b. cd /usr/local/src
    c. gunzip –c snort-1.8.6.tar.gz | tar xvf –

4. Configurar o código fonte:

    a. cd snort-1.8.6
    b. ./configure [mais as opções desejadas]

Nota: o SNORT permite a configuração de várias opções que activa determinadas capacidades e instala plug-ins fornecidos por outros utilizadores. Quando se utiliza o SNORT pela primeira vez é recomendável a não activação de qualquer destas opções, permitindo desta forma a instalação correcta do SNORT e a certeza de que tudo funciona correctamente.

5. make – no caso de haver o relatório de erros no fim, uma das causas mais frequentes é o facto do directório que contem as livrarias do libpcap não constar das variáveis de ambiente LD_LIBRARY_PATH.

6. make install

7. Construção das regras:
    a. As regras são utilizadas pelo programa por forma a saber o que tem que procurar, ou estar atento.
    b. Disponíveis em vários sites:

                                      http://www.snort.org e em http://www.whitehats.com

Deve-se indicar ao programa, a que é que ele deve estar atento, isto é feito através de linhas de comando únicas num ficheiro. Cada linha contém o que é denominada por regra, também conhecida por assinatura. Cada regra define que acção deverá ser tomada (alerta, log, etc) quando determinado tipo de assinatura é encontrado. As default rules podem ser obtidas através de diferentes fontes e são um óptimo começo. O descarregamento de um conjunto de regras pré-definidas permitem rapidamente configurar o SNORT e colocá-lo em funcionamento até o utilizador se sentir confortável para escrever as suas próprias regras.

Para utilizar um conjunto de regras, fazer o download das mesmas e realizar algumas alterações no topo do ficheiro. As alterações típicas necessárias fazer no SNORT são as indicações da ‘home’ subnet ou IP são, que IP’s pertencem aos Servidores Web, etc.

8. Executar o SNORT:

    Snort –c <ruleset>

Execução do Snort especificando o conjunto de regras que se fez o download, utilizando a opção ‘–c ‘ e o nome do ficheiro de regras.

9. Notas finais:
    a. A versão final encontra-se disponível via CVS (Concurrent Version System).
    b. É fácil de se manter a par das últimas versões e patches bastando para tal a execução do seguinte comando:

i.    Cvs –
ii.    d:pserver:anonymous@cvs.snort.sourceforge.net:/cvsroot/snort login
iii.    cvs –z3 –
iv.    d:pserver:anonymous@cvs.snort.sourceforge.net:/cvsroot/snort co snort

No caso de se pretender fazer a instalação utilizando RPM basta para tal fazer:


  • Fazer:

    rpm –Uvh snort*.rpm libnet*.rpm

  • Temos agora os binaries snort-plain+flexresp na directoria /usr/sbin
  • Sendo como no anterior, criada a directoria /var/log/snort.


10 .Instalação na versão para Windows
    a. Instalar a Winpcap fazendo o download de: http://netgroup-serv.polito.it/winpcap

    b. Fazer o download e descomprimir a versão SNORT para Windows e de seguida executar snort.exe
  • Quando se instala o Snort pela primeira vez, utilizar a flag ‘-W’ por forma a identificar a placa de rede em que o SNORT irá escutar.
  • A flag ‘-W’ irá mostrar uma lista contendo as várias interfaces de rede por forma a selecionar a que queremos. Desta forma, quando executarmos o Snort podemos faze-lo recorrendo à opção ‘–i <inteface>’ para indicar qual o interface que o Snort irá utilizar.


3. Modos de utilização

Existe três níveis básicos de operação do Snort, como:
1. Sniffer
2. Packet logger
3. NIDS – Network Intrusion Detection System

Cada um destes modos prende-se com um modo particular para análise de tráfico. O modo de operação é definido pelos switches em modo de linha de comando.


3.1  Em modo de Sniffer

Em modo de Sniffer o programa lê todos os pacotes de uma rede e faz o dump de cada pacote num modo descodificado e capaz de ser compreendido, para um dispositivo de saída.
Para activar o modo de sniffer, temos os seguintes switches:

3.1.1        –v: verbose mode
3.1.2        –d: dump packects payloads com os headers
3.1.3        –a: mostra os pacotes ARP da rede.
3.1.4        –e: display link-layer data

O modo ‘-e’ display o link-layer data que para o Ethernet é o header do pacote, no entanto o Snort suporta também os header do Token Ring e do FDDI.
Combinando todos os switches temos uma visão muito detalhada do tráfego da rede.


3.2  Em modo de Packet Logger

Neste modo o Snort regista todos os pacotes que se encontram relacionados com um ficheiro ou directório. O switch que permite activar este modo é ‘–l’, e quando activado permite registar os pacotes das directorias em vigilância bem como os endereços IP dos hosts envolvidos, colocando os pacotes em ficheiros por protocolo e número das portas.
Os pacotes podem ser registados ou logged no formato binário se for especificado o switch ‘-b’, podendo desta forma preservar os pacotes para que uma aplicação capaz de manusear ficheiros em raw TCPDump.

3.2.1        Linhas de comando:
·        –l <logdir>: Despeja os pacotes no ficheiro <logdir>
·        –b: Regista os pacotes no formato binário (tcpdump)
3.2.2        Exemplo:
‘snort –l /usr/var/log’
‘snort –b –l /var/log/snort’



3.3  Em modo Plain text logging

Quando os pacotes são registados utilizando a funcionalidade disponibilizada por defeito, estes são registados num formato human-readble idêntico ao formato no modo verbose. Os pacotes são registados em ficheiros e directórios baseados nos endereços IP.

3.3.1        Se for utilizado o modo ‘-h’ “homenet”, por forma a especificar os termos de registo da rede interna:
·        Pacotes são registados em directórios com nomes que são os endereços IP dos hosts não pertencentes à rede interna.
·        Muito útil para ver de relance quem está a “bater à porta” da nossa rede.

Inconvenientes:
·        Ao gerar um ficheiro por protocolo/porta temos um problema, e se alguém fizer um port scan aos 65.536 ports?
·        Temos 65.536 TCP + 65.536 UDP = 131.072 ficheiros criados, é possível numa única directoria, mas será possível analisar?
·        Talvez seja boa ideia utilizar o log em modo binário.

3.3.2        O que fazer com os logs em modo binário?
Velocidade e portabilidade, são as palavras chave para se optar por esta configuração.
·        Ficheiros em modo binário estão no formato de TCPDump
·        Podem ser lidas pelo SNORT utilizando o switch ‘-r’:
Exemplo: snort –dvr /var/log/snort/snort.log




3.4  Em modo NIDS

Esta é a parte interessante do Snort, quando em modo NIDS é carregado com uma configuração contendo uma data de regras e directivas em run-time. Uma vez a correr neste modo, é capaz de analisar o tráfico de uma rede em real-time procurando condições que permitem gerar alertas e logs dos pacotes ofensivos.

3.4.1        Carregar um conjunto de regras, configurando os plug-ins da análise dos pacotes, permitindo monitorizar a rede por indícios hostis.

3.4.2        É o Snort ao nível mais complexo.

3.4.3        Configuração básica consiste em especificar meramente o ficheiro de configuração:
Snort –c snort.conf

3.4.4        Configuração por defeito:
·        Output para o directório: /var/log/snort
·        Alert mode: full
·        Logging mode: ASCII dump

3.4.5        Opções a nível da linha de comandos:
Existe uma variedade de opções de comandos disponíveis neste modo, que irão ser apresentados nesta secção. Os alertas podem ser desactivados ao mesmo tempo utilizando o switch “none”, no entanto o logging decorre normalmente.

3.4.5.1  Com o ‘-l’ é possível especificar uma directoria alternativa para o log

3.4.5.2  Especificar um modo de alerta alternativo:

 a. ‘-A <mode>’: fast, full, none, console, (unsock)
O modo ‘unsock’ é ainda um tanto experimental, e coloca o Snort a escrever os pacotes e alertas para um socket UNIX por forma que um ouvinte externo possa receber os dados.

b. ‘-s’: alertas são descarregados no syslog
Por defeito a funcionalidade syslog e nível é LOG_AUTHPRIV e LOG_ALERT.

  c. ‘-M <wrkstation>’: envia alertas SMB para uma máquina com o SO Windows a correr o WinPopup. De realçar que é necessário, explicitamente, activar este modo no script de configuração, uma vez que é um tanto ou quanto perigoso a sua utilização num sensor.

3.4.5.3  Especificar um modo de alerta alternativo

·        ‘-b’: modo de log binário (tcpdump)
·        ‘-N’: desactivar os logs

3.4.6        Exemplos de utilização do modo NDIS

3.4.6.1  Log para um determinado directório:
‘snort –c snort.conf –l /var/snort’

3.4.6.2  Log em modo binário para um directorio com alertas em modo fast
‘snort –c snort.conf –l /var/snort –b –A fast’

3.4.6.3  Desligar o logging mas deixar os alertas para o syslog
‘snort –c snort.conf –N –s’




4.    Configuração do SNORT como um IDS

Nesta secção irá ser tratada de um modo exaustivo a configuração do SNORT e os ficheiros de configuração a utilizar por forma a integrar um sistema de detecção de intrusões numa rede. O ficheiro de configuração (snort.conf) é o principal mecanismo para configurar todo o conjunto de opções disponíveis. No ficheiro snort.conf estão incluídas variáveis, opções de saída, e regras são especificadas.

4.1  Configuration file settings
Existem algumas palavras reservadas no que respeita à configuração.

4.1.1        INCLUDE
·        Faz com que um ficheiro seja incluído no ficheiro de configuração
·        Os caminhos absolutos tem que ser especificados, se os ficheiros não se encontrarem no mesmo directório que o ficheiro de referencia. O Snort não segue qualquer variável de ambiente.
·        Includes – são utilizados no ficheiro snort.conf por forma a incluir regras dos ficheiros ou a configuração local.
·        Primáriamente utilizada na ‘master’ config
·        Pode ser utilizada em qualquer ficheiro config/rule
·        O formato é do género: Include <ficheiro>
·        Exemplo:
Include web_exploits
Include /etc/snort/buffer_exploits


4.1.2        Adicionando livrarias aos ficheiros de configuração
Geralmente o ficheiro ‘master’ config é denominado snort.conf, e os ficheiros contendo as regras são carregadas através do mecanismo ‘include’.




4.1.3        Variáveis
Outras das palavras reservadas no Snort é ‘var’, e permitem ao utilizador especificar um valor e vê-lo propagado pelo resto do ficheiro de configuração do sistema em run-time.

·        Especificando uma variável, permite modificar num único local um valor que se propaga por toda a configuração config/rule.
·        Aumenta a portabilidade de um determinado conjunto de regras.
·        Especificada a nível da linha de comando pelo switch ‘-S’, a variável será passada ao ficheiro de regras.
·        Exemplo:

‘var HOME_NET 10.1.1.0/24’

·        Existe uma variável especial que permite ao utilizador detectar automaticamente e configurar o endereçamento da rede de uma variável. Normalmente, essa variável é definida referenciando ‘$<intf>_address’, que automaticamente procura o IP e a netmask de um interface específico e retorna esse valor para a variável de referencia.

‘var HOME_NET $eth0_address’

·        Se atribuir simultaneamente um valor a nível da linha de comando e a um conjunto de regras à mesma varíavel, a variável definida ao nível de comando irá sobrepor-se à mesma variável definida no conjunto de regras.
·        Formato:
‘var <nome_da_variavel> <valor>’
‘var HOME_NET 192.168.5.0/24’
alert tcp any >$HOME_NET 6666 \ (msg: “IRC”;)

·        As variáveis poderão ter valores por defeito definidas, o que traz vantagens e desvantagens. As vantagens é permitir o utilizador não se preocupar em definir a nível de comando a variável, Para definir o valor por defeito de uma variável basta:
$<nome_da_variavel>:-<valor_por_defeito>
‘var HOME_NET $(HOME_NET:-10.1.1.0/24)

4.1.4        Mensagens – opções das variáveis:

Pode-se definir uma mensagem a ser exibida se uma determinada variável não estiver definida.
 Formato:

$(<var_name>):?<message>)
var HOME_NET $(HOME_NET:?HOME_NET não definida!)

Saída:
Initializing rule chains…
ERROR test-lib(3) : HOME_NET não definida!

4.1.5        Linha de Comando Overrides
Para definir variáveis a nível de comando deve-se especificar a opção ‘-S’, de seguida especificar o nome da variável que se quer definir seguido de um sinal de igual e depois o valor:

‘snort –c snort-lib –S HOME_NET=192.168.5.0/24’
‘snort –c snort-lib –S HOME_NET=192.168.5.0/24 –S WEB_SERVER=192.168.5.44

aqui mostra como definir multiplas variáveis numa única linha de comando.

4.1.6        SNORT Data Flow
No diagrama a seguir apresentado, é demonstrado o percurso que um pacote é sujeito quando tratado pelo Snort:


            Nesta imagem temos a forma como o pacote é tratado pelo Snort.

·        O pacote é capturado pela Libpcap e é enviado para o descodificador (decoder). O descodificador pega no pacote e preenche uma estrutura de dados com o conteúdo do pacote, preenchendo as porções que definem o tipo de pacote.
·        Os Preprocessadores pegam na estrutura criada pelo descodificador e podem dessa forma manipular o conteúdo da estrutura.
·        A estrutura é então passada ao motor de detecção onde as regras são aplicadas por forma a determinar se o pacote gera um alerta, ou só é feito o log, etc.
·        O estado de saída, se atingido, é onde o pacote pode ser logged ou alertar.

4.1.7        A função do Preprocessador (Preprocessors)
Permitem ao Snort analisar e manipular o tráfego de pacotes em muitos aspectos tais como: Normalização do tráfego, IP defragmentation, TCP stream reassembly, etc

Executam na ordem com que são referenciados no ficheiro de configuração ou seja se aparecer um fragmento IP, significa que deverá ser tratado pelo desfragmentador antes de ser passado ao TCP stream reassembler.

Significa isto que os preprocessadores a nível de protocolo deverão ser especificados antes dos que se situam a nível aplicacional.

Exemplo:
‘preprocessor http_normalize:80 8080’

Os preprocessors são activados e configurados via directives no ficheiro de configuração

Formato:
Preprocessor <nome>:<argumentos>
<nome>= nome do módulo do preprocessador
<arguments>= lista de argumentos do preprocessador

Exemplo do ficheiro de configuração:

Os argumentos são únicos para cada um, é ler o comentário no snort.conf acerca dos formato correcto.

‘preprocessor portscan: $HOME_NET 3 4 portscan.log’

A configuração funciona de modo muito simples, o preprocessador directive instrui o ficheiro de configuração do Snort a procurar na lista disponível dos preprocessadores pelo nome que cumpre a directive. Se esse nome for encontrado, dá-se a iniciação da função do preprocessador por forma a tratar dos argumentos, neste ponto configura-se e é adicionado à execução da lista de preprocessadores dentro do Snort.

Notar que se um dado preprocessador é compilado mas não activado pelo Snort, não existe qualquer CPU overhead, pode ser considerado dead code.


4.1.8        Plug-Ins (Preprocessors)

Os plug-ins permitem aos autores manipularem e analisarem os pacotes do tráfego. Snort manuseia pacotes completamente descodificados para o preprocessador a um nível que este pode fazer quase tudo com o pacote antes de o enviar para o motor de detecção ou detection engine.

Existe grande número de preprocessadores disponíveis e muitos mais estão a ser neste momento escritos, no entanto fica aqui a referência a sete dos que fazem parte da instalação por defeito:

·        http_decode: normaliza o tráfego web para analise de assinaturas
·        PortScan: detecta portscans
·        Degfrag: efectua a desfragmentação dos IP
·        Stream: efectua a reassemblagem do TCP Stream
·        Minfrag: analiza os pacotes por pequenos fragmentos
·        SPADE: Statistical Packet Anomaly Detection Engine
·        Unidecode: normaliza o trafego UNICODE HTTP
·        Outros disponíveis são: ARP watch, traceroute analisys, etc


4.1.9        Saída de dados
O Snort permite uma configuração muito fléxivel no que respeita à apresentação dos resultados. Dentro do ficheiro de configuração as opções de saída podem ser activadas pela especificação duma directive de saída, seguido do nome do modulo que se quer utilizar.

4.1.9.1  Output:
·        Especifica alertas e logging plug-ins a serem utilizados
·        Podem ser especificados vários (‘stacked’)
·        Switches em modo de linha de comandos adicionam regras especificadas no ficheiro de configuração.
      
‘output log_tcpdump: snort.log’

4.1.9.2  Se for especificado um plug-in de saída output, dentro do ficheiro de configuração, não é necessário especificar o correspondente switch na linha de comando para esse mecanismo de saída, no entanto é de realçar que o modo de linha de comando sobrepõe-se ao definido no ficheiro de configuração.

4.1.9.3  Configuração:
·        Os plug-in de saída são configurados com directivas, tal e qual os preprocessadores.
·        Os argumentos variam conforme o plug-in de saída que utilizarmos.

‘output database: log, mysql, user=snort dbname=snort host=localhost’

4.1.9.4  Plug-ins:

Por defeito acompanham o Snort na instalação os seguintes plug-ins:
·        Alert_fast: Alertas rápidos em modo de texto
·        Alert_full: Alertas em texto com os full headers
·        Alert_smb: SMB (WinPopup)
·        Alert_syslog
·        Alert_Unixsock
·        Log_tcpdump: logs dos pacotes em modo binário tcpdump
·        Database
·        XML: alertas ou logs para um ficheiro em XML

Outros módulos que se poderá encontrar incluem SNMP, CIDF (Common Intrusion Detection FrameWork) e IDMEF (Intrusion Detection Message Exchange Format)

4.1.10    Plug-ins de Detecção (detection)
Menos visíveis que outros módulos, são parte integrante das regras em vez de terem linhas na configuração dedicadas a estes. Serão discutidos mais adiante.

4.1.11    Mexendo o caldeirão
Após juntar todas as opções, é uma missão relativamente facilitada. A sequencia de desenvolvimento do ficheiro de configuração começa por especificar as variáveis, depois os pré-processadores e as directivas de saída, e depois as regras. Uma vez configurado, as opções em modo linha de comando serão pois utilizadas por forma a optimizar a configuração.

4.1.12    Uma configuração exemplo:
#var HOME_NET $eth0_ADDRESS
var HOME_NET 10.1.1.0/24
var EXTERNAL_NET any
var DNS_SERVERS 10.1.1.253/32

Preprocessor defrag
Preprocessor stream: timeout 10, ports 21 23 80, maxbytes 8192
Preprocessor http_decode: 80 8080
Preprocessor portscan: $HOME_NET 4 3 portscan.log
Preprocessor portscan_ignorehosts: $DNS_SERVERS

Output log_tcpdump: snort.log
Output alert_syslog: LOG_AUTH LOG_ALERT
Output database: log, mysql, user=fernando dbname=snort host=dbhost

Include web.rules



4.2  Regras do SNORT (RULES)


A linguagem de escrita das regras foi desenvolvida de modo a ser simples de ler, escrever e entender. São relativamente simples, no entanto, bastante flexível e parametrizável. Esta simplicidade não permite por vezes, detectar determinado tipo de ataques como por exemplo portscan, nestes casos deve-se usar um pré-processador. O sistema de regras do snort em si, é completamente stateless, os pré-processadores foram acrescentados por forma a permitir a stateful packet analysis.

·        As regras são suficientes para detectar a maioria dos ataques
·        Para eventos/ataques de multi-pacote são geralmente detectados com pré-processadores

4.2.1        O que são as regras?

Ao definir as regras estamos a dar indicação de qual o tráfego na rede vai ser hostil. Regras definem quem está envolvido (origem e destino das máquinas), até ao que é considerado hostil (por exemplo um ataque smurf ou má configuração das flags TCP). Podem ser escritas por forma a serem muito específicas, à procura de um determinado pacote de dados, ou de atributos específicos dos pacotes, inclusive especificar um determinado IP ou porta.


4.2.2        Anatomia básica

Uma regra é dividida em duas partes. A primeira, rule header, define quem está envolvido por forma ao tráfego ser considerado pelas opções das regras. A segunda, rule options, define o que deve estar envolvido. Aqui está incluída a informação do header do pacote (tais como as flags do TCP) ou o conteúdo do pacote (payload).

·        Sintaxe especifica para cada parte.
·        É necessário ter sempre a rule header, ao passo que as rule options não.
·        As regras podem conter múltiplas linhas se for usado o “\”.

4.2.3        Rule header

O cabeçalho é a primeira porção de cada regra. Define o protocolo de rede e ‘quem’ (who) está envolvido. Para cada campo individual, existe muitas opções, com uma sintaxe definida, que poderá ser utilizada por forma a especificar valores simples, conjunto ou grupos.

Notar que o motor de detecção do Snort parte o pacote para comparação em duas partes, correspondendo a cada uma da parte da regra. A primeira compara o cabeçalho da regra com a do pacote. Se o pacote não encaixa no perfil de um dos cabeçalhos das regras o motor de detecção passa para o pacote seguinte. Se o pacote não encaixa com o perfil do cabeçalho da regra, o motor de detecção continua a testar o resto das opções da regra.


O primeiro cabeçalho da regra é o campo de acção ‘action field’. Este instrui o Snort sobre o comportamento a ter se a regra é disparada. Existem actualmente cinco tipos de valor para a acção a tomar:

  • Alert: cria uma entrada no ficheiro de alertas e faz o log do pacote. O ficheiro de alerta é único e contém registo de todas a detecções realizadas. A informação escrita para este ficheiro no modo por defeito consiste apenas no cabeçalho do pacote.
  • Log: este instrui o Snort a criar apenas um registo no log, não realizando qualquer registo do tráfego no ficheiro de alertas.
  • Pass: quando a regra é disparada mas tem ‘pass’ especificada na acção, o Snort irá fazer o drop do pacote, e não fará qualquer tipo de processamento do pacote. É útil para fazer a monitorização de tentativas anónimas de ftp para um servidor ftp anónimo.
  • Activate: estas regras quando disparadas não se limitam a alertar, mas também são utilizadas para activar outras regras (dynamic) que ficam em modo suspenso até serem activadas.
  • Dynamic: permanecem suspensas até serem activadas por uma regra de activação. Uma vez activadas o seu comportamento é idêntico às das regras “log”.
  • É possível ainda definir, parametrizar, tipos de acção, que podem ser utilizados por forma a mapear uma saída para vários destinos.
  • Nota: A ordem normal das regras é processada nas regras de alerta primeiro, Pass em segundo e log por fim. Se quisermos modificar o comportamento por defeito, é necessário especificar a opção ‘-o’ que permite modificar a ordem que as regras são processadas. A opção ‘-o’ foi desenvolvida para o modo “expert”.

4.2.3.1  Acção : Rule Header Action

O primeiro campo do rule header é o campo correspondente a uma acção. Este instrui o Snort ao que é suposto fazer caso a regra seja activada. Existe três valores que poderá assumir:
  • Alert: instrui o Snort a criar um registo no ficheiro de alertas e a fazer o log do pacote. A informação escrita neste ficheiro no modo por defeito consiste apenas na informação do cabeçalho do pacote. Para o registo de log, a mesma informação que é feita para o ficheiro de alertas, também é escrita para uma estrutura de directórios e colecção de ficheiros individuais.
  • Log: não é feito qualquer registo do tráfego no ficheiro de alertas apenas é criada uma entrada no log.
  • Pass: quando uma regra é activada com a acção ‘pass’ o Snort deixa cair, ‘drop’, o pacote e não fará qualquer outro tipo de processamento. Útil para monitorizar por exemplo tentativas anónimas de ligações ftp a servidores ftp não anónimos.
  • Activate: quando disparadas estas regras não só alertam como são utilizadas para activar outras regras (dinâmicas).
  • Dynamic: são activadas pela acção da regras ‘activate’ e quando activas comportam-se como as de ‘log’.

É possível definir tipos de acções que podem ser utilizadas para dirigir a saída da regra para vários destinos. A ordem com que as regras são processadas é a mesma descrita no ponto anterior.


4.2.3.2  Protocolo : Rule Header Protocol


O campo referente ao protocolo indica ao Snort qual o tipo de tráfego na rede a que a regra se destina ou aplica.
Suporta normalmente três tipos diferentes de tráfego: TCP, UDP e ICMP.


4.2.3.3  IP origem : Rule Header Source IP


Neste campo é especificado qual a origem do trafego. É possível especificar uma origem IP desde algo genérico como uma subnet até a um host especifico. É possível também especificar múltiplos endereços ou subnets como a origem, quando necessário, utilizando uma sintaxe especial introduzida no Snort versão 1.7. Especificar múltiplos endereços IP é feito recorrendo a uma IP List.

Os endereços são especificados na notação CIDR (Classless Inter Domain Routing), incluindo dessa forma os endereços IP bem como o numero de bits da mascara de rede.
Em situações em que a regra usa as duas direcções de tráfego (inbound/outbound) o campo de direcção deve ser ‘<->’, representando a origem como o destino do tráfego sendo emparelhado com a porta do mesmo lado do campo de direcção.

Exemplos:

24.0.0.0/8= Classe A
135.1.1.0/16= Classe B
192.168.5.0/24= Classe C
192.168.5.5/32= Endereço do Host

Keywords:
Any – corresponde a todos endereços
! – nega endereços (!192.168.5.5/24 – todos excepto o 192.168.5.5)
$HOME_NET – variável definida algures no ficheiro de regras

Para especificar uma lista de endereços IP na notação CIDR, deve-se separá-los por uma virgula ‘,’ e colocar toda a lista utilizando para tal parêntesis rectos ‘[endereçoIP/netmaks,endereçoIP/netmask]’, não deixando espaços.


4.2.3.4  Porta de origem : Rule Header Source Port


Define de que porta de origem no host de origem é que o tráfego é originado. Pode ser especificado como um número, um conjunto, ou ainda a palavra chave ‘any’ representa todos as portas possíveis.

De notar que o protocolo ICMP não utiliza portas definidas como o TCP ou o UDP. Como a regra requer sempre uma lista de portas para origem e para destino, no entanto elas deverão ser incluídas para regras destinadas ao protocolo ICMP. No entanto o Snort para este protocolo irá ignorar o valor das portas, mas tradicionalmente especifica-se sempre ‘any’.

Formatos válidos:
Portas estáticas:                110
Todas as portas:                any
Range:                              33000:34000
Negação:                          !80
Menor que ou igual a:        :1023
Maior que ou igual a:         1024:


4.2.3.5  Direcção do tráfico: Rule Header Traffic Direction
O campo de direcção permite especificar o sentido da direcção do pacote. Duas opções estão disponíveis, permitindo especificar a direcção do fluxo ou que determinada direcção não interessa. As opções válidas são:
·        ->, define a origem e o destino
·        <>, direção do pacote não interessa (bidirecional)

Utilizando a notação ‘->’, especificamos que o pacote deverá viajar da origem para o destino. A origem é especificada à esquerda e o destino à direita. Se o pacote se encontra em transito na direcção oposta o pacote não passa no teste do cabeçalho da regra pelo que não será inspeccionado mais pelo resto da regra.

4.2.3.6  Endereço IP de destino : Rule Header Destination Address


O endereço de destino especifica para onde o tráfego hostil se dirige. É especificado da mesma forma que o formato utilizado para o endereço de origem.

4.2.3.7  Porta de destino : Rule Header Destination Port


Define a porta de destino na máquina de destino a que o pacote se destina. É utilizado o mesmo formato que no caso da porta de origem.

4.3  Opções disponíveis nas regras – rule options

As opções são uma segunda porção na definição da regra. Define ‘o quê’ da regra – que atributos do pacote devem ser inspecionados e quais os valores que devem conter para ser considerado hostil. Esta porção é somente usada se o pacote cumpre com os requisitos do cabeçalho da regra.

Se o pacote cumpre com os requisitos do cabeçalho bem como o das opções, então a regra é activada ‘triggered’. Dependendo do tipo da regra, podem ser tomadas diversas acções. A mais comum é a de uma mensagem de alerta escrita para um ficheiro de alertas e o pacote ser registado no ficheiro de log. Temos assim que as opções:

·        Definem ‘o que’ está envolvido
·        Indica ao Snort que pacotes devem ser inspecionados
·        Designa uma assinatura de um ataque ou sonda especifica.

4.3.1        Sintaxe
As opções deverão estar limitadas pelos parentsis ‘( )’, permitindo desta forma identificar mais facilmente as duas partes da regra, não são opcionais.

O conteúdo das opções é feito por pequenas partes individuais. Constituindo primeiramente dos atributos e valores do pacote, consiste também de acções que queremos que o Snort tome (alert, log ou pass).

A sintaxe utilizada é a mesma para os atributos do pacote e acções a tomar. Geralmente consiste num atributo ou acção keyword seguido de um valor. Tudo aparece emparelhado e utiliza uma estrutura de sintaxe simples que deve ser seguida para cada item.
·        As opções das regras são formadas por vários atributos individuais dos pacotes de acções a tomar.
·        Combina atributos múltiplos do pacote por forma a constituir uma assinatura.
·        Especifica, sintaxe simples deve ser utilizada.

Os atributos devem estar separados por ‘;’. Por uma questão de facilitar a leitura podem ser usados espaços entre as partes. Notar que mesmo o último atributo deverá estar encerrado por parêntesis ‘)’ caso contrário irá causar um erro quando o Snort processar a regra durante o arranque.

Quando se fizer alterações a regras ou ficheiro de regras, não arrancar o Snort com a opção ‘-D’, pois quando o Snort arranca em modo daemon não irá exibir mensagens de erro que encontre no arranque.


Quase tudo na opções deve existir aos pares. O primeiro item é o atributo ou o nome da acção e o segundo o valor do item.
·        É necessário especificar a keyword
·        Não é necessário especificar sempre o valor
·        A keyword e o valor dever estar separadas por ‘:’

Existe uma lista de atributos ou de keywords que podem ser utilizadas e que irá ser mostrada mais adiante. As keywords ou action keywords, indicam ao Snort que acções devem ser tomadas (em adição às acções definidas no cabeçalho da regra). Atributos do pacote dizem ao Snort para prestar atenção a um determinado atributo do pacote, como por exemplo as TCP flags ou payload. De notar que nem todos os atributos de um pacote se encontram acediveís via keyword. Para tal deve-se utilizar filtros do estilo tcpdump.

O valor que deve acompanhar cada keyword atributo/acção depende dum atributo/acção especifico. Alguns requerem valores numéricos outros texto. A sintaxe e formato dos valores varia com cada um, recomendo a visita ao site http://www.snort.org/snort_rules.html para mais informações de todas as keywords formatos e argumentos. Na secção 4.4 deste trabalho é possivel encontrar um documento escrito pelo autor do Snort, com informações acerca da escrita de regras.

4.3.2        Atributos
De seguida apresento uma tabela de algumas senão a maior parte, das opções utilizadas pelas keywords:

IP TOS ICMP Type
IP TTL ICMP Code
IP ID ICMP Echo ID
IP Fragbits ICMP Echo Seq
IP Options Payload content
TCP Flags Payload size
TCP Seq/Ack # Session logging
Session/Host Tagging Active response
Logto Active reaction

4.3.2.1  Atributo: msg
A opção msg permite anexar uma mensagem ao tipo de actividade que aparece nos ficheiros de alertas ou de log. Obviamente, passa por caracterizar a descrição de uma forma relevante e capaz de identificar o que foi detectado quando se examina os logs. Pode-se atribuir uma qualquer descrição, mas é preciso ter em conta que deverá ser relevante para o que foi encontrado.

As mensagens são impressas para facilitar a leitura dos alertas e o log em ASCII dos pacotes. Por exemplo para a seguinte regra que tem por missão detectar o trojan BackFire, ou BackOrifice BO, ou o DeepBo teríamos algo como:

Alert udp any any-> $HOME_NET 31337 \
(msg: “Possivel trafego BackOrifice”;)
No ficheiro de alertas teriamos algo como:
[**] Possivel trafego BackOrifice [**]
30/04-18:34:26.886525 10.1.1.4:4802 -> 10.1.1.3:31337
UDP TTL:64 TOS:0x0 ID:12348 IpLen:20 DgmLen:31
Len:11

4.3.2.2  Atributo: content
O atributo da keyword content pode ser utilizado por forma a examinar o payload por uma determinada cadeia de caracteres ou valores hex. Ter em linha de conta que este tipo de analise é, em termos computacionais, bastante pesado e é provável que abrande o Snort se for usado de uma forma insensata.

·        Examina o payload do pacote por um conteúdo especifico: O conteúdo pode ser texto, hex data, ou uma mistura de ambos
·        Pode ser efectuado uma verificação múltipla de conteúdos por regra
·        Pode ser efectuada a correspondência através da excpção ‘!’
·        Modifiers estão disponíveis como outras opções da regra: offset, depth, nocase.

O payload pode ser examinado por dados de texto ou binários. Isto é útil para detectar tentativas de buffer overflow e análise a protocolos não-textuais.

Tomar em consideração que determinadas aplicações TCP, tais como telnet, os caracteres são enviados cada um e depois ecoados de volta. Se se quiser procurar pela string ‘root’ num acesso telnet, não iremos encontrar nada pois cada carácter viaja sozinho (‘r’, ’o’, ’o’, ‘t’). Não é efectuada qualquer agrupamento da stream capaz de avisar o Snort que a palavra é ‘root’. Se activar a stream pré-processador que acompanha a instalação do Snort, sendo desta forma capaz de realizar o agrupamento podendo desta forma procurar por strings em sessões telnet.
Notar ainda que a opção é case sensitive. Para tal existe a opção ‘nocase’ que permite ser insensível ao case sensitive no match do conteúdo.

De seguida apresenta-se alguns exemplos relativos ao atributo content:

Regra de match do conteúdo em plain text:


        Alert tcp any any-> $HOME_NET 21 \
(content:”anonymous”; msg: “login FTP anonimo”;)

nesta regra procuramos a keyword ‘anonymous’ no tráfego ftp.

Regra de conteúdo misto:

    Alert tcp any any -> $HOME_NET 143 \
(content:”|C0E8 C2FF FFFF|\bin\sh”; msg: “IMAP Buffer Overflow”;)

nesta regra temos uma mistura entre conteúdo hex e texto no campo de argumento. Notar que os dados em hex estão dentro ‘|’ por forma a indicar o parser que é dados em hex. Se for necessário escrever uma regra que inclui o pipe ‘|’, tem que se acompanhar o pipe com “\”.

Regra capaz de verificar múltiplos conteúdos:

Alert tcp any any-> $HOME_NET 21 \
(content:”anonymous”; content:”USER”; msg: “login FTP anonimo”;)
nesta regra temos uma situação em que é feito o match de dois conteúdos. Estes matches são realizados de forma separada de cada um e podem ocorrer em qualquer lugar do pacote. Se a procura necessita de ser localizada, as opções depth e offset podem ser utilizadas por forma a localizar no payload do pacote.

Regra contendo o conteúdo por excepção:

Alert tcp any any-> $HOME_NET 21 \
(content:!”anonymous”; msg: “login FTP nao-anonimo”;)

nesta regra apenas é indicada com sucesso se não corresponder a um determinado padrão. É muito útil para procurar pacotes que não correspondem a um critério especifico.

4.3.2.3  Content helpers
Existem três “helper options” para o content keyword:
·        Offset
·        Depth
·        Nocase
Devem ser especificados após um determinado conteúdo da regra. Se existirem múltiplos content options numa única regra com helpers, estas deverão ser agrupadas com as opções dos conteúdos que estão associadas a um serviço, por forma a que o parser saiba que conteúdos estão a ser modificados.


4.3.2.3.1        Offset
Define o ponto no payload do pacote por onde começa a procurar o match do conteúdo. Notar que o conteúdo matching começa a contar no primeiro byte payload com o número 0, portanto necessito contar a partir do zero quando calculo o principio do offset.
Limita a quantidade de dados a procurar por pacote, melhorando desta forma a performance.

Exemplo:
Regra:
Alert tcp any any-> $HOME_NET 21 \
(content:”anonymous”; offset:5; msg: “login FTP anonimo”;)
pacote a interceptar será:

   03/04-23:22:22.202506 10.1.1.4:2056 -> 10.1.1.1:21
   TCP TTL:64 TOS:0x10 ID:16221 IpLen:20 DgmLen:56 DF
   ***AP*** Seq OxE41CAAFB Ack: 0x6F19F37D Win: 0x4470 TcpLen:20
   55 53 45 52 20 61 6E 6F 6E 79 6D 6F 75 73 0D 0A  USER anonymous …
Neste caso o Snort irá começar a analisar a partir do sexto byte pois começa a partir do zero no payload. Neste caso começaria no valor hex 61 que corresponde ao ‘a’ em ‘anonymous’.


4.3.2.3.2        Depth
Limita o número de bytes a partir do começo do offset que irá fazer a pesquisa do padrão. Se não for especificado qualquer offset, o valor depth indicará a distancia no payload desde o primeiro byte do conteúdo que irá examinar. Como limita a quantidade de dados a analisar melhora uma vez mais a performance.

Exemplo:
Regra:
Alert tcp any any-> $HOME_NET 21 \
(content:”anonymous”; depth: 13; msg: “login FTP anonimo”;)
pacote a interceptar será:

   03/04-23:22:22.202506 10.1.1.4:2056 -> 10.1.1.1:21
   TCP TTL:64 TOS:0x10 ID:16221 IpLen:20 DgmLen:56 DF
   ***AP*** Seq OxE41CAAFB Ack: 0x6F19F37D Win: 0x4470 TcpLen:20
   55 53 45 52 20 61 6E 6F 6E 79 6D 6F 75 73 0D 0A  USER anonymous …

neste caso o Snort irá pesquisar os 13 primeiros bytes do pacote, que corresponde à cobertura de um pacote típico.

4.3.2.3.3        Nocase
O conteúdo das regras é normalmente case sensitive. A opção nocase desactiva a pesquisa case sensitive para um determinado conteúdo. É utilizado para protocolos onde o servidor pode ser case insesitive para os comandos de entrada como muitos servidores FTP e http.

Exemplo:
Regra:
Alert tcp any any-> $HOME_NET 21 \
(content:”anonymous”; nocase; msg: “login FTP anonimo”;)
pacote a interceptar será:

   03/04-23:22:22.202506 10.1.1.4:2056 -> 10.1.1.1:21
   TCP TTL:64 TOS:0x10 ID:16221 IpLen:20 DgmLen:56 DF
   ***AP*** Seq OxE41CAAFB Ack: 0x6F19F37D Win: 0x4470 TcpLen:20
   55 53 45 52 20 41 6E 4F 6E 59 6D 4F 75 53 0D 0A  USER AnOnYmOuS …

4.3.2.3.4        Misturando tudo

Suponhamos a seguinte regra:

Alert tcp any any-> $HOME_NET 21               \
(flags: A+; content:”user”; depth:5; nocase;          \
content: !”anonymous”; offset:5; depth:8; nocase;     \
msg: “login nao-anonimo ao servidor FTP anonimo”;)
Esta regra demonstra todos os conceitos anteriormente apresentados no contexto desta secção. Esta regra incorpora múltiplos controlos de conteúdos, um controlo por excepção, offsets, depths e nocase. Quando combinados e utilizados em conjunto, podem conduzir a um poderoso padrão de matching.

Nesta regra uma atenção para a opção flags antes do matching do conteúdo. Utilizando uma simples flag TCP, posso verificar se a sessão se encontra estabelecida, permitindo desta forma reduzir a quantidade de tráfico que o Snort tem que analisar e que não tem as correspondentes flags.


4.3.2.4  Atributo: Flags
Uma das principais regras é a TCP flag. Este código é utilizado frequentemente por forma a testar por várias condições dos pacotes TCP e sessões que completam as ligações TCP, stealths portscans e IP fingerprints.

·        A opção flags verifica as flags TCP por determinadas configurações.
·        Lógica booleana disponível para as opções
·        Utilizada para detectar actividades de scanning, fingerprinting, verificar se a ligação é estabelecida antes de efectuar a verificação do conteúdo, etc.

Argumentos dísponiveis para o atributo flags:

S = Syn + - Match do argumento mais alguns outros
F = Fin
R = Rst * - Matching de um argumento especifico
A = Ack
P = Push ! – match apenas se a flag especificada não estiver activa
U = Urg
2 = 2º bit mais significativo
1 = bit mais significativo

Suponhamos a seguinte regra:

Alert tcp any any-> $HOME_NET any \
(flags: SF; msg: “SYN FIN scan”;)
Esta regra matches qualquer pacote que se destinem à nossa rede com as flags Syn e Fin activas.

 A regra:

Alert tcp any any-> $HOME_NET 21 \
(flags: A+; content:”anonymous”; msg: “login FTP anonimo”;)
Esta regra matches todos os pacotes que tenham a flag Ack active bem como outra qualquer flag active.

4.4 Em conclusão
Em jeito de comentário final a esta secção, descrevi aqui alguns dos aspectos mais utilizados e que servem de base ao entendimento de como as regras funcionam e como podem ser exploradas. Em anexo apresento um documento elaborado pelo autor do Snort acerca do método de escrever regras para o Snort intitulado "Writing Snort Rules".
 


5.    Na práctica

Básicamente em termos de conteúdos e atributos é tudo. Irei agora debruçar-me um pouco acerca da implementação prática do Snort. Pode ser utilizado das mais diversas formas e feitios, para medir o número de acessos a um servidor, para estar atento à procura de vulnerabilidades, possíveis ataques de DDoS ou de DoS (mas isto é outro trabalho) enfim, uma utilização quase ilimitada para os administradores de uma rede.

5.1  O posicionamento do sensor.
Passarei a designar a placa de rede onde o Snort se encontra instalado como “interface detecção”. Num ambiente típico o Snort opera ao examinar todos os pacotes que passam no seu “interface de detecção”. Este modo consegue-se colocando a placa de rede em modo promíscuo, por forma a que o Snort seja mais eficiente é necessário colocá-lo num local onde ele possa ver a maior parte do tráfego. Num rede ethernet, basta ligá-lo a um ponto de acesso à rede partilhada. Num rede baseada na comutação (switchs), o “interface de detecção” deverá ser ligado ao “monitor port” do comutador. O “monitor port” é uma porta do comutador que se encontra configurado por forma a receber todo o tráfico que passa no comutador (switch).
No caso de switchs mais antigos seria possível ligar o “interface de detecção” numa port denominada Port SPAN (Switch Port Analyzer), neste caso teríamos portas a 10Mbps e uma porta a 100Mbps por onde recebe todo o tráfego do switch, no entanto em situações extremas, isso levaria a uma degradação na performance do switch.



Figura referente à configuração em Port Span


Figura referente ao uso de um monitor port


Outra forma de posicionar, é num ponto onde é possível monitorizar todo o tráfico que entra e sai da rede. O exemplo típico desta implementação é o de uma empresa que se encontra ligada à Internet através de uma linha de alto débito. Colocando o sensor onde possa examinar todo o tráfego que entra e que sai, através dessa ligação, o Snort pode ser usado como uma forma de monitorizar possíveis ataques. Uma forma de conseguir esta monitorização, passa pela colocação de um concentrador (hub), entre o router fronteira e a rede interna (ou mesmo a placa externa da FireWall), permitindo desta forma ao sensor examinar todos os dados associados à placa exterior.

Outro método interessante é utilizar como uma escuta, por forma a replicar os dados da ligação.
Outra ligação em que é aconselhável o uso do Snort, é numa rede caseira, em que existe apenas uma máquina que actua como uma gateway para o resto da rede. Colocando o Snort activo na placa externa da gateway, é possível monitorizar possíveis ataques.


5.2  O Snort como ferramenta de defesa
Um dos aspectos interessantes do Snort, é o poder que fornece a um administrador para analisar os tipos de ataques que são perpetrados à sua rede. Nesse sentido o Snort tem vindo a ser utilizado em projectos de auditorias e segurança como por exemplo o projecto honeynet, ou mesmo por empresas prestadoras de auditorias informáticas como forma de identificar os tipos de ataques ou acessos indevidos e quem os faz.
De seguida apresento a topologia usada num desses projectos nomeadamente de analise aos ataques feitos a uma rede


5.2.1        Descrição da rede:


Desenho da rede e seus componentes
Existem três redes neste diagrama, a Internet, a Rede interna e a rede honeynet, todas separadas pela FireWall. A Internet é a rede untrusted, de onde os maus da fita aparecem. A honeynet é uma colecção de potes onde esperamos que venham a ser comprometidos. A rede interna, é onde iremos monitorizar o tráfego e administrar a rede honeynet. Todo o tráfego tem que passar pela FW, segmentação e controlos são cruciais. De seguida apresenta-se os scripts utilizados na configuração do Snort para a monitorização das redes.

5.2.2        Snort start-up script

#!/bin/ksh
#
# snort.sh
#
# Created by Honeynet Project <project@honeynet.org>
# March 18, 2000
#
# Used to rotate snort for daily for automated IDS
#
PATH=/bin:/usr/local/bin
PID=`cat /var/run/snort_qfe0.pid`
DIR=/opt/ids/snort
DATE=`date +%b_%d`
SNORT=/usr/local/bin/snort
USER=snort
### Kill snort
echo "\nKilling snort, PID $PID\n"
kill $PID > /dev/null 2>&1
### Create daily directory to archive log files
if [ -d $DIR/logs/$DATE ];then
        :
else
        mkdir $DIR/logs/$DATE
fi
### launch snort
$SNORT -b -c $DIR/snort.conf -D -i qfe0 -l $DIR/logs/$DATE -s -u $USER
5.2.3        Configuração do snort.conf
##### Set variables for your own Honeynet network
var HOME_NET 172.16.1.0/24
var INTERNAL 172.16.1.0/24
var PORTS    5
var SECONDS  15
##### Preprocessors
preprocessor http_decode: 80 443 8080
preprocessor minfrag: 128
preprocessor portscan: $HOME_NET $PORTS $SECONDS /var/adm/snort/portscan
### Log all TCP connection
# Log all ASCII TCP activity to session breakout files
log tcp any any <> $INTERNAL any (session: printable;)
# Log all TCP activity to binary file
log tcp any any <> $INTERNAL any
### Log all UDP connections
# Log all ASCII UDP activity to session breakout files
log udp any any <> $INTERNAL any (session: printable;)
# Log all UDP activity to binary file
log udp any any <> $INTERNAL any
### Log all ICMP activity
# Log all ASCII ICMP activity to session breakout files
log icmp any any <> $INTERNAL any (session: printable;)
# Log all ICMP activity to binary file
log icmp any any <> $INTERNAL any
### Standard snort signatures begin here ###

5.2.4        Análise dos dados recolhidos
Depois de estar a funcionar toda a parametrização referente ao Snort e à rede, basta escrever as nossas próprias regras, que podem ser vistas em anexo, e começar a analisar os dados recolhidos quer pela FireWall quer pelo IDS. Um script perl pode ajudar a extraír os dados do Snort por forma a podermos analisar os alertas gerados. De seguida passo a apresentar o script em perl desenvolvido uma vez mais pelo próprio criador do Snort.

#!/usr/bin/perl
# Syslog analysis script orignially written by
# Angelos Karageorgiou <angelos@StockTrade.GR> and
# tweaked by Martin Roesch <roesch@clark.net>
if($ARGV[1] eq undef)
{
print "USAGE: snortlog <logname> <machinename>\n";
print "EXAMPLE: snortlog /var/log/messages sentinel\n";
print "Note: The machine name is just the hostname, not the FQDN!\n";
exit;
}

$HOST={}; # DNS table
$timeoutalarm=1; # in 5 second the DNS resolver should timeout
$machine = $ARGV[1];
$targetlen=25;
$sourcelen=35;
$protolen=12;
use Socket;
$SIG{ 'ALRM' } = "cannotresolve";
open(LOG,"< $ARGV[0]") || die "No can do";
printf("%-15s %-35s %-25s %-25s\n","DATE","WARNING", "FROM", "TO");
print "=" x 100;
print "\n";
while(<LOG>) {
chomp();
if (
( ! /$machine snort/gi )
) { next ; }
$date=substr($_,0,15);
$rest=substr($_,16,500);
@fields=split(": ", $rest);
$j=1;
$text=$fields[$j++];
if ( $text =~ /spp_http_decode/ ){
$text=$fields[$j++];
}
$fields[$j] =~ s/ \-\> /-/gi;
($source,$dest)=split('-', $fields[$j]);
($host,$port)=split(':',$source);

$skipit=0;
($shost,$sport)=split(':',$dest);

$sport =~ s/ //gi;
$name=resolv($host);
$name = $name . ":" . $port;
$sname=resolv($shost);
$sname = $sname . ":" . $sport;
if ( $text =~ /portscan/i ) {
$rest =~ s/$machine snort.*\]\://gi;
$rest =~ s/ spp_portscan\://gi;
$mystring=sprintf("%15s %s\n", $date, $rest);
push(@PSCAN,$mystring);
} else {
printf("%15s %-35s %-30s %s\n", $date, $text, $name,$sname);
}
}
close(LOG);
print "\n\n";
print "=" x 100;
print "\n";
print " " x 40;
print "PORTSCANS\n\n";
#printf("%-15s %-35s %-25s %-25s\n","DATE","WARNING", "FROM", "TO");
print "=" x 100;
print "\n";
foreach $sc (@PSCAN) {
print $sc;
}

sub cannotresolv
{
print "cannot resolve\n";
alarm($timeoutalarm);
return 1;
}


sub resolv #resolv and cache a host name
{
local $mname,$miaddr,$mhost;
$mhost=shift;
$miaddr = inet_aton($mhost); # or whatever address
if (! $HOSTS{$mhost} ) {
$mname='';
eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB \n required
alarm $timeout;
$mname = gethostbyaddr($miaddr, AF_INET);
};
die if $@ && $@ ne "alarm\n"; # propagate errors

if ( $mname =~ /^$/ ) {
$mname=$mhost;
}
$HOSTS{$mhost}=$mname;
}
return $HOSTS{$mhost}
}


E com estas ferramentas disponibilizadas, já não existe desculpas para um administrador de rede não estar alerta ao que se passa na sua rede, pelo menos alertando-o para o que de mais grave se possa passar.
Ainda por cima o programa é gratuito, não é necessário pagar para se utilizar uma ferramenta com esta utilidade, no entanto já se pensa em fazer uma versão comercial podem ser consultado detalhes em: http://online.securityfocus.com/news/332

5.3 Resultados

Por forma a provar que é uma boa ferramenta e que isto não é só teoria, a seguir mostro os resultados por mim obtidos, nos testes realizados à minha rede. Para tal utilizei os programas da suite TigerSuite http://www.tigertools.net e Cerberus Internet Scanner em http://www.cerberus-infosec.co.uk/cis e após a instalação do snort versão RPM 1.8.4 utilizando as assinaturas de ataque (regras) disponíveis em http://www.snort.org/dl/signatures, foi só descomprimir e untar o ficheiro, alterar o snort.conf que acompanha as regras para identificar a minha rede ($HOME_NET) e obtive o ficheiro de alertas em anexo. A máquina agressora, facilmente se identifica como sendo o IP 192.168.1.113.

Da análise ao ficheiro pude no entanto detectar alguns falso positivos, que com uma parametrização correcta do snort.conf a par de algumas regras poderiam ser amenizadas. No entanto é de salientar que o Snort é capaz de identificar qual a vulnerabilidade que o scanner agressor está à procura.

Recomendo a leitura do documento "Building an IDS Solution using SNORT" escrito por Aidan Carty, em que descreve todos os passos desde a instalação do Linux, MySQL, Apache, um documento muito bem escrito.

Publicado originalmente em: http://paginas.fe.up.pt/~mgi98020/pgr/snort.htm



6. Sites com interesse:
·        Snort: http://www.snort.org
·        Whitehats.com e arachNIDS rules database: http://www.whitehats.com
·        Libpcap: ftp://ftp.eecs.lbl.gov
·        Libnet: http://www.packetfactory.net
·        Incident.org (database plug-ins): http://www.incident.org
·        Silicon Defense (boas ferramentas para o Snort): http://www.silicondefense.com
·        Snort para Win32: http://www.datanerds.com/~mike
·        Snorticus: http://www.snorticus.baysoft.net
 

Comentários

Postagens mais visitadas deste blog

Upgrading Iomega ix2-200 to Cloud Edition

You just got your ix2-200 from eBay and there are no disks inside the NAS. Or you have a brand new ix2-200 -yet you could not afford Cloud Edition. No problem. With just a USB stick and a SATA adapter or desktop PC, you will easily upgrade your ix2-200 to ix2-200 Cloud Edition. Not only your ix2-200 will have a brand new interface and Cloud options, but also will become Mac OS X Lion compatible! What do we need? Decrypted! ix2-200 Cloud Edition Firmware 3.1.12.47838 S endSpace or RapidShare * USB Flash Drive with at least 2 GB capacity and LED indicator** SATA to USB adapter or desktop PC Toothpick or paperclip Preparing Hard Drives Preparing hard drives is the first step because you have to wipe all the data inside the hard drives and make them just like brand new. We used 2 x Seagate 2 TB 5900 RPM Drives. Backup any files if you have and then remove both disks from ix2-200 and attach them to SATA to USB adapter or your desktop PC's SATA port. Using

Cuckoo com Vmware Esxi

Cuckoo is an open-source malware analysis platform using sandboxing technology. The tool allows people like us to analyze malicious binaries in an isolated environment. Since Cuckoo is commonly used with Oracle VirtualBox as its virtualization platform, a majority of online documentation is focused on configuration using VirtualBox. PlantainStan and I decided to test running Cuckoo on ESXi and document our success. This guide will help with the basic configuration of ensuring Cuckoo properly interacts with ESXi. We will continue to update this post as we make continue to make an even more baller Cuckoo environment! Note: In order to successfully interact with vSphere's API, you will need the VMWare ESX Standard license. API functionality is required for Cuckoo to work with ESX. Configure ESX Since this guide is not a "how to" on installing ESXi, we will assume that you have successfully installed the hypervisor on your system. There

CentOS7 with Snort Barnyard2 Snorby PulledPork SElinux

This post is about how to install Snort "stack" on CentOS7 with potentially all the latest libs an stuff. Here I will install and configure everything to run Snort as IDS. I will write another post shortly how to run it as IPS - INLINE. System details: [ root@nfsec-ids-01 ~ ] # cat /etc/redhat-release CentOS Linux release 7.3.1611 ( Core ) [ root@nfsec-ids-01 ~ ] # uname -a Linux nfsec-ids-01.nfsec.co.uk 3.10.0-514.2.2.el7.x86_64 #1 SMP Tue Dec 6 23:06:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux Snort 2.9.9.0 Installation of snort is very basic: yum install https://www.snort.org/downloads/snort/daq-2.0.6-1.centos7.x86_64.rpm yum install https://www.snort.org/downloads/snort/snort-2.9.9.0-1.centos7.x86_64.rpm Register at Snort and download registered rule set: mkdir /usr/local/src/snortrules cd /usr/local/src/snortrules wget https://www.snort.org/rules/snortrules-snapshot-2990.tar.gz?oinkcode = < oinkcode > tar -zxvf snort