Sobre Mim

Campo Grande, Ms, Brazil
Estudante de Ciências da Computação, Campo Grande - Ms Anhanguera/Uniderp

terça-feira, 31 de março de 2009

Livros Gratuitos


Estive procurando por alguns artigos e livros sobre otimização de sistemas quando me deparei com esse link: http://freecomputerbooks.com. Precisa saber algoritmos cabeludos? Tem lá. Livros para programação de sockets, Matemática, Linguagens de Programação, etc. Muito útil para os alunos de exatas que fazem trabalhos baseados na wikipedia e não acham outras fontes de informação melhores online.

Só uma coisa, tudo em inglês. Mas você seguiu a nossa recomendação e está estudando, não é mesmo? Se alguém aí souber de uma iniciativa semelhante em português, ficaremos felizes em divulgar, mas só encontrei lixo.


quinta-feira, 19 de março de 2009

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.
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 relevantes 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.
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 concentrar para entender o Snort por ele mesmo, para aqueles que quiserem experimentar posteriormente outras ferramentas tenham um bom conhecimento do Snort.




Funcionamento

Figura 1 - Funcionamento

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 conteú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 encaminham 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).
Primeiramente, vamos adquirir o código 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 é 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 funções com expressões regulares compatíveis 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//Desktop/snort-.tar.gz /etc/snort

$ cp /home//Desktop/pcre-.tar.gz /etc/snort

$ cp /home//Desktop/libpcap-.tar.gz /etc/snort

$ cd /etc/snort

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


Descompacte os arquivos:

$ gzip -dc snort-.tar.gz | tar xvf -

$ gzip -dc pcre-.tar.gz | tar xvf -

$ gzip -dc libpcap-.tar.gz | tar xvf -


Entre na pasta do pcre e digite os comandos:

$ cd pcre-
$ ./configure
$ make
$ make install

Entre na pasta do libpcap e repita os comandos:

$ cd ../libpcap-
$ ./configure
$ make
$ make install


Agora, entre na pasta do código descompactado do Snort e instale o Snort, ele mesmo

$ cd ../snort-

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 à pasta pai e remova as fontes utilizadas:

$ cd /etc/snort

$ rm snort-.tar.gz

$ rm pcre-.tar.gz

$ rm libpcap-.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

Vamos conhecer melhor o tal arquivo de configuração do Snort. Entre no seu diretório, /etc/snort, e abra o arquivo snort.conf com 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 simplesmente 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 ' # '. Observe 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 descomentado para ser habilitado. Para ter uma boa visão da parte operante do arquivo e assim modificá-la, crie um novo arquivo de configuração com todas e somente as linhas descomentadas do snort.conf padrão. O 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. Digitemos, 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 parasnort.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 arquivo que criamos. No quarto comando removemos todas as linhas comentadas, chamando o arquivo resultante de original.sem.comentarios. Esse 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.
Antes de conhecermos a estrutura e a sintaxe de uma regra ou de montarmos a nossa própria, nos preocuparemos em manter o 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 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. Lembre-se 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.confcom os arquivos que vemos no diretório /etc/snort/rules/.

Fizemos, 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 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.
Este script comenta automaticamente as linhas do snort.conf que apontam para arquivos de regras que não existem.
Copie seu conteúdo para um arquivo de nome, por exemplo, "comentador.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
rm $ARQ_LISTA1 $ARQ_LISTA2 $TEMPORARIO


--------------------------FINAL DO COGIDO----------------------------

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, "inclusor.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--------------------------------
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/24,
205.188.5.0/24,
205.188.7.0/24,
205.188.9.0/24,
205.188.153.0/24,
205.188.179.0/24,
205.188.248.0/24]


var RULE_PATH rules

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 <> \
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

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
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

Conhecendo as variáveis


Antes de mais nada, abra seu respectivo snort.conf, que deve 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 osnort.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 arquivo snort.confcom qualquer editor de textos.

No arquivo que foi apresentado 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.188.7.0/24,

205.188.9.0/24,

205.188.153.0/24,

205.188.179.0/24,

205.188.248.0/24]

var RULE_PATH rules

As variáveis básicas vitais

As variáveis que Snort reconhece, como podemos esperar, são predefinidas. 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

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

Entendendo e definindo as variáveis


HOME_NET

Quando o valor declarado é any, significa que qualquer valor de tipo compatível com o da 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 exemplos 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

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 reconhecidos como externos para o Snort. Podemos, seguindo as mesmas regras sintáticas da definição da HOME_NET, defini-la selecionando a rede ou mesmo mantendo-a como "any". O ideal, no entanto, talvez fosse simplesmente definir EXTERNAL_NET como tudo aquilo que não é considerado 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_NETcomo sendo aquilo que não é HOME_NET, basta defini-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 configuraçã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

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

Algumas portas também devem ser informadas, como a porta em que o serviço Web roda:

var HTTP_PORTS [80,8080]
var SHELLCODE_PORTS !80

Introdução às regras


Tudo o que preparamos até então dentro do arquivo snort.conf, que foi adequar as variáveis as 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 utilizarão das variáveis que definimos. Essas regras têm a função de decidir que processamento um pacote sofrerá e que caminho o dignóstico 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 ainda 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.

O funcionamento das regras:


Assim como essas linhas de 'includes' estão apontando para outros arquivos, poderíamos perfeitamente simplesmente 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 arquivo de configuração mais organizado e regras mais fáceis de se manter e desatualizar. Fica claro porque utilizar linhas que apontam para arquivos
separados e não simplesmente 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 pode imaginar, as regras desses arquivos se destinam a reconhecer 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 saber se seus filhos vêem pornografia na internet. O exemplo é interessante, pois é um 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:

alert tcp $EXTERNAL_NET $HTTP_PORTS -> $HOME_NET any (msg:"PORN erotica"; content:"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.
  • Com alert, esta regra diz ao Snort para gerar um alerta e logar;
  • tcp informa o protocolo do pacote;
  • $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);
  • 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";
  • content informa ao Snort que string será procurada dentro do payload do pacote;
  • nocase desabilita a sensibilidade da regra a se as letras são minúsculas ou maiúsculas;
  • 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;
  • classtype classifica o tipo de pacote;
  • Sid e Rev respectivamente se referem ao número de identificação da regra e ao número de sua revisão.

  • 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.


    Vamos dizer que gostaríamos de saber quantas vezes em nossa rede aparece 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 conseguir 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, portanto, 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 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 definida 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 parenteses e escrever as opções 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 nós.


    Como procuramos por aparições da stringLula, podemos informar a palavra-chave content com a stringLula. 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 de testar nossa regra.

    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 , limit

    #Para logar todos os pacotes, escreva e substitua os valores:

    output log_unified: filename , limit

    #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= password= dbname= host=


    Conferindo os alertas



    Enfim temos uma boa oportunidade de testar a regra que criamos. Como é uma única regra e foi escrita dentro do nosso arquivosnort.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

    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:
    1. Otimização do processo de logging;
    2. Gerenciamento e organização dos logs;
    3. Estender o Snort para agir como um IDS ativo.
    Com 'ativo' quero dizer que um IDS poderia tomar medidas de segurança a partir dos resultados dos logs. O Snort, no entanto, é passivo na medida em que simplesmente 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.

    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.


    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 que trabalha 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 bloqueando o endereço de máquinas importantes e amistosas.


segunda-feira, 9 de fevereiro de 2009

Remoção do Virus Kido, resolvendo problemas de atualização do windows xp e antivirus

Remoção do Virus Kido


O kido impede a atualização do seu antivirus e do Sistema operacional, ele edita o arquivo host, que no windows xp fica em C:\WINDOWS\system32\drivers\etc, ele aponta todos os repositorios de atualizaçao dos sites das fabricantes de antivirus e da propria Microsoft, apontando pala localhost, impedindo assim o update.




Primeiro execute o path para corrigir a falhar RPC, da microsoft





Depois executo o path para remover o Kido

Depois faça o Windows Update para a ultima atualização no site da Microsoft.

Depois faço update Kasperky, loga após concluir, efetue uma varredura no seu sistema.


É Recomendavel que as atualizações automaticas do windows estejam ativadas.


Seguidores

CreativeZ3ro