Snort avançado: Projetando um perímetro seguro

Neste artigo veremos algumas características avançadas do sistema de detecção de invasão Snort e também como utilizar a criatividade para elaborar firewalls integrados com o IDS. Vamos montar uma central de análise utilizando Snort Snarf. Leitura recomendada para administradores e afins.

[ Hits: 171.646 ]

Por: Anderson L Tamborim em 06/01/2005 | Blog: http://y2h4ck.wordpress.com


Proof of Concept: Projeto sob fogo



Agora iremos testar nossa montagem de perímetro, assim precisamos verificar se o mesmo está atendendo as nossas necessidades e gerando os logs que necessitamos.

Para isso vamos utilizar algumas ferramentas simples para gerar pacotes que não são aceitos dentro da nossa rede.
  • Telnet
  • Hping

Com o Hping vamos gerar protocolos em determinadas portas diferentes das liberadas.

Primeiro verifique se tudo está funcionando de acordo:

# ps aux | grep snort
root      2079 77.8 12.9 37392 32208 ?       R    13:34   0:06 snort -c /etc/snort/snort.conf -o -i ppp0 -D
root      2081  2.0  0.4  3240 1104 pts/0    S    13:35   0:00 grep snort

# ps | grep Guardian
2084 pts/0    00:00:00 Guardian.pl

Bom, estamos prontos:
Primeiramente vamos gerar tráfego normal e permitido para ver se o Snort não vai gerar logs desnecessários:

(Como permitimos o FTP, vamos nos conectar ao servidor FTP)

$ ftp 192.168.11.1
Connecting...
Hello Welcome to the New World FTP
192.168.10.2:root:(user): fulano
Password for (fulano): ****
Welcome!!
Unix system type.
ftp>

Muito bem, conectamos no servidor ftp, vamos ver se o Snort gerou algo diferente:

# tail /var/log/snort/alert

Por enquanto tudo sob controle!

Agora que tal tentarmos algo diferente? Vamos simular uma tentativa de conexão em um servidor FINGER:

# hping --syn 192.168.11.1 -p 79
HPING 192.168.11.1 (eth0 192.168.10.2): S set, 40 headers + 0 data bytes
len=40 ip=192.168.11.1 ttl=64 DF id=0 sport=79 flags=RA seq=0 win=0 rtt=5.0 ms
len=40 ip=192.168.11.1ttl=64 DF id=0 sport=79 flags=RA seq=1 win=0 rtt=0.5 ms
len=40 ip=192.168.11.1ttl=64 DF id=0 sport=79 flags=RA seq=2 win=0 rtt=0.5 ms
len=40 ip=192.168.11.1ttl=64 DF id=0 sport=79 flags=RA seq=3 win=0 rtt=0.5 ms

Como vimos, o pacote voltou com Flag RA (ou seja foi rejeitado), primeiro porque, mesmo que houvesse um servidor fingerd rodando, o iptables não deixaria o tráfego passar. E agora vamos olhar o log do Snort:

[**] Snort Alert! [**]
[Priority: 0]
11/23-13:49:09.475269 192.168.10.2.154:32793 -> 192.168.11.1:79
TCP TTL:57 TOS:0x0 ID:52727 IpLen:20 DgmLen:60 DF
******S* Seq: 0xACD76464 Ack: 0x0 Win: 0x16D0 TcpLen: 40
TCP Options (5) => MSS: 1412 SackOK TS: 60598675 0 NOP WS: 0

BINGO!!!

Viram como ele gerou um alerta contendo o IP que tentou acessar o serviço bloqueado e também várias informações sobre o pacote?

Com isso temos que nosso sistema de IDS está bem adequado e sugiro que cada um teste todos os serviços que estão discriminados no IDS para evitar surpresas depois.

Agora vamos ver no Snort Snarf como ficou o alerta:


Com isso encerramos este capítulo.

Página anterior     Próxima página

Páginas do artigo
   1. Prólogo
   2. Introdução: Sistemas de detecção de invasão
   3. Tabela simbólica
   4. Projeto de perímetro seguro
   5. Instalação e configuração
   6. Adaptando o IDS ao nosso projeto
   7. IDS Center: Criando uma central de alertas unificados
   8. Proof of Concept: Projeto sob fogo
   9. Conclusão
   10. Apêndice
Outros artigos deste autor

SECtool - Análise Local para Linux

Race condition - vulnerabilidades em suids

Security Hacks: Linux & BSD

Libsafe: Protegendo Linux contra Smashing Overflow

Jails em SSH: Montando sistema de Shell Seguro

Leitura recomendada

Intrusão simples com Metasploit

Incron - supervisionando sistemas de arquivos

Entendendo o que é Engenharia Social

Integridade dos arquivos do sistema

Rede Tor para iniciantes

  
Comentários
[1] Comentário enviado por fabio em 06/01/2005 - 04:16h

Momento do samba carioca:

"Sobre o artigo, dizer o quê...
O Anderson Tamborim, caprichou pra valê!

I ô lê lê... onde há segurança
a gente nunca perde a esperança

E diz!

REFRÃO..."

Meus parabéns!

[2] Comentário enviado por naoexistemais em 06/01/2005 - 04:24h

Caro Anderson,

Mais um artigo de qualidade e mantendo a qualidade do VOL, por isso digo para o zangado o VOL é o melhor e sempre será.

Parabéns,

[3] Comentário enviado por sUxSyS em 06/01/2005 - 06:53h

Meu po... muito bom teu artigo!
Como sempre muito profissional... meus parabens!!!

flws

[4] Comentário enviado por dudu_away em 06/01/2005 - 11:06h

Ae anderson.. naum precisava nem comentar né? haushahs

Tah perfeito como sempre! Continue assim kra....

Parabéns!

[]'s
Eduardo

[5] Comentário enviado por jeffestanislau em 06/01/2005 - 12:46h

Anderson,

Realmente está ótimo!!! Parabéns por seu trabalho!!!

PS: Ainda bem que o fábio não depende de samba para sobreviver!!!
hehehe

[]´s

[6] Comentário enviado por peregrino em 06/01/2005 - 13:53h

opa cara esse é mais um artigo daqueles que dispensa comentarios muito bommesmo continue assim fazendo varios artigos e tutorias para acomunidade

queria falar aqui que vc poderia fazer um tutorial sobre iptables+pom com regras avançadas e tambem algum falando sobre teste de fogo para testar o servidor se esta vuneravel

falow

[7] Comentário enviado por y2h4ck em 06/01/2005 - 14:00h

Obrigado a todos pelos comentarios e por terem apreciado meu artigo.
Peregrino gostei da Ideia ... e posso futuramente escrever um artigo sobre testes de penetração. :)

Abraços a todos.

Anderson Luiz Tamborim ( Spawn y2h4ck )

[8] Comentário enviado por fcc em 06/01/2005 - 16:26h

Ae man...mandou ver novamente....Jogou duro no IDS Parabens....continue sempre divugando seus artigos...eles sao o maximo!

Valeu!

[9] Comentário enviado por dexter_sbo em 07/01/2005 - 09:20h

Ae spawn mando muito bem como sempre seu artigo fico muito ótimo fico muito 10 memo meus parabéns

By __d3xt3r__

[10] Comentário enviado por removido em 07/01/2005 - 11:44h

EXCELENTE!!!!
E muito inspirado também o samba do fábio... ;-)

[11] Comentário enviado por davidsonpaulo em 08/01/2005 - 15:34h

Aê Fábio! Como sambista tu é um ótimo administrador de portal. Ahahahah!

Aê Anderson! Detonou hein! Parabéns meu velho, e continue evoluindo!

Abraços!

[12] Comentário enviado por peregrino em 01/02/2005 - 14:27h

opa so queria informar que o link do download do Snort Snarf ta errado e o endereço certo é esse qui http://www.snort.org/dl/contrib/data_analysis/snortsnarf/

falow

[13] Comentário enviado por mariux em 24/03/2005 - 18:05h

por gostei pra caramba muito legal o artigo. me ajudou muito!!

[14] Comentário enviado por montaro em 25/04/2005 - 04:14h

muito bom o artigo...eu me interesso bastante pela area de seguranca e ate penso em trabalhar nesse ramo, mais eh tanta coisa pra aprender que nao sei por onde comecar... ja montando um ids , um honeypot aki no lnx ja eh um comeco ... abracos..

[15] Comentário enviado por jgama em 23/07/2006 - 16:25h

Já faz mas de um ano que foi eleborado este tutorial, só agora que tive o prazer de ler, realmente muito bem elaborado.

Só como sou inexperiente no Linux, posso dizer assim, e tentei colocar o snort para Rodar num Servidor com Mandriva 2006, usando este Tutorial, só que aqui esta dando erro justamente no arquivo de regras abaixo, será que tenho que criar o arquivo com o conteudo igualzinho descrito abaixo?

# regras.conf
# ----------------------------------------------------------
# Anderson Luiz Tamborim ( security*NOSPAM*tionline.com.br )
# ----------------------------------------------------------
# Regras para IDS baseado em Plano
# Regras Alert

alert tcp any any <> [192.168.10.0/24,192.168.11.0/24]
alert udp any any <> [192.168.10.0/24,192.168.11.0/24]
alert ip any any <> [192.168.10.0/24,192.168.11.0/24]

#Isso iria gerar um alerta para qualquer tráfego entre essas duas redes, #assim nossa primeira política de alertas está feita, agora teremos que #fazer as regras para liberar as portas que serão válidas aos usuários:

pass tcp 192.168.10.0/24 any -> 192.168.11.1 25
pass tcp 192.168.10.0/24 any -> 192.168.11.1 80
pass tcp 192.168.10.0/24 any -> 192.168.11.1 110
pass tcp 192.168.10.0/24 any -> 192.168.11.1 143
pass tcp 192.168.10.0/24 any -> 192.168.11.1 21
pass tcp 192.168.10.0/24 any -> 192.168.11.1 137:139

# Agora pacotes UDP
pass udp 192.168.0.0/24 any -> 192.168.11.1 137:139
pass udp 192.168.0.0/24 any -> 192.168.11.1 21

# Pacotes IP
# Não utilizaremos pacotes IP, pois não estamos
# utilizando nenhum serviço como VPN ou sistema de
# autenticação como Kerberos


Pois aparece messagem de erro quando starto snort, dizendo que tem erro no include /etc/snort/rules/regras.conf (8) algo assim.

Tentei deica as linhas conforme abaixo mas não deu certo.

abaixo, será que tenho que criar o arquivo com o conteudo igualzinho descrito abaixo?

# regras.conf
# ----------------------------------------------------------
# Anderson Luiz Tamborim ( security*NOSPAM*tionline.com.br )
# ----------------------------------------------------------
# Regras para IDS baseado em Plano
# Regras Alert

alert tcp any any [192.168.0.0/24,192.168.1.0/24]
alert udp any any [192.168.0.0/24,192.168.1.0/24]
alert ip any any [192.168.0.0/24,192.168.1.0/24]

pass tcp 192.168.0.0/24 any 192.168.1.0 25
pass tcp 192.168.0.0/24 any 192.168.1.0 80
pass tcp 192.168.0.0/24 any 192.168.1.0 110
pass tcp 192.168.0.0/24 any 192.168.1.0 143
pass tcp 192.168.0.0/24 any 192.168.1.0 21
pass tcp 192.168.0.0/24 any 192.168.1.0 137:139

# Agora pacotes UDP
pass udp 192.168.0.0/24 any 192.168.1.0 137:139
pass udp 192.168.0.0/24 any 192.168.1.0 21

Alguém poderia ajudar-me a tirar esta dúvida

[16] Comentário enviado por removido em 17/10/2009 - 09:27h

Legal, SNORT Avançado.

[17] Comentário enviado por removido em 17/10/2009 - 22:42h

Snort, Porquinho Ninja.

[18] Comentário enviado por rhock em 06/12/2011 - 15:41h

Estou com um problema na hora de executar o comando " snortsnarf.pl --rulesfile /etc/snort/snort.conf -rulesdir /etc/snort -d /www/htdocs/snarf /var/log/snort/alert "


da o seguinte erro: " snortsnarf.pl: command not found "

Alguem pode me ajudar.

Obrigado.

[19] Comentário enviado por rhock em 06/12/2011 - 16:56h

Erro na execução:



perl snortsnarf.pl --rulesfile /etc/snort/snort.conf --rulesdir /etc/snort -d /var/www/snort /var/log/snort/alert
Parentheses missing around "my" list at /etc/perl/Time/ParseDate.pm line 108.
Parentheses missing around "my" list at /etc/perl/Time/ParseDate.pm line 109.
Useless use of a variable in void context at /etc/perl/Time/ParseDate.pm line 108.
Useless use of a variable in void context at /etc/perl/Time/ParseDate.pm line 108.
Useless use of a variable in void context at /etc/perl/Time/ParseDate.pm line 109.
Useless use of a variable in void context at /etc/perl/Time/ParseDate.pm line 109.
Using an array as a reference is deprecated at /etc/perl/HTMLMemStorage.pm line 290.
Using an array as a reference is deprecated at /etc/perl/HTMLAnomMemStorage.pm line 266.
Unknown option --rulesfile
Unknown option --rulesdir
Subroutine julian_day redefined at /etc/perl/Time/JulianDay.pm line 46.
Subroutine day_of_week redefined at /etc/perl/Time/JulianDay.pm line 82.
Subroutine inverse_julian_day redefined at /etc/perl/Time/JulianDay.pm line 96.
Subroutine jd_seconds redefined at /etc/perl/Time/JulianDay.pm line 127.
Subroutine jd_timelocal redefined at /etc/perl/Time/JulianDay.pm line 135.
Subroutine jd_timegm redefined at /etc/perl/Time/JulianDay.pm line 145.
unknown alert format for line: var HOME_NET any
; skipping
unknown alert format for line: var EXTERNAL_NET any
; skipping
unknown alert format for line: var DNS_SERVERS [xxxxxxx]
; skipping
unknown alert format for line: var SMTP_SERVERS [xxxxxxx]
; skipping
unknown alert format for line: var HTTP_SERVERS $HOME_NET
; skipping
unknown alert format for line: var SQL_SERVERS $HOME_NET
; skipping
unknown alert format for line: var TELNET_SERVERS $HOME_NET
; skipping
unknown alert format for line: var FTP_SERVERS $HOME_NET
; skipping
unknown alert format for line: var SNMP_SERVERS $HOME_NET
; skipping
unknown alert format for line: portvar HTTP_PORTS 80
; skipping
unknown alert format for line: portvar SHELLCODE_PORTS !80
; skipping
unknown alert format for line: portvar ORACLE_PORTS 1521
; skipping
unknown alert format for line: portvar FTP_PORTS 21
; skipping
unknown alert format for line: var RULE_PATH /etc/snort/rules
; skipping
unknown alert format for line: var PREPROC_RULE_PATH /etc/snort/preproc_rules
; skipping
unknown alert format for line: dynamicpreprocessor directory /usr/lib/snort_dynamicpreprocessor/
; skipping
unknown alert format for line: dynamicengine /usr/lib/snort_dynamicengine/libsf_engine.so
; skipping
unknown alert format for line: preprocessor frag3_global: max_frags 65536
; skipping
unknown alert format for line: preprocessor frag3_engine: policy first detect_anomalies overlap_limit 10
; skipping
unknown alert format for line: preprocessor stream5_global: max_tcp 8192, track_tcp yes, \
; skipping
unknown alert format for line: track_udp no
; skipping
unknown alert format for line: preprocessor stream5_tcp: policy first
; skipping
unknown alert format for line: preprocessor rpc_decode: 111 32771
; skipping
unknown alert format for line: preprocessor bo
; skipping
unknown alert format for line: preprocessor ftp_telnet: global \
; skipping
unknown alert format for line: encrypted_traffic yes \
; skipping
unknown alert format for line: inspection_type stateful
; skipping
unknown alert format for line: preprocessor ftp_telnet_protocol: telnet \
; skipping
unknown alert format for line: normalize \
; skipping
unknown alert format for line: ayt_attack_thresh 200
; skipping
unknown alert format for line: preprocessor ftp_telnet_protocol: ftp server default \
; skipping
unknown alert format for line: def_max_param_len 100 \
; skipping
unknown alert format for line: alt_max_param_len 200 { CWD } \
; skipping
unknown alert format for line: cmd_validity MODE < char ASBCZ > \
; skipping
unknown alert format for line: cmd_validity MDTM < [ date nnnnnnnnnnnnnn[.n[n[n]]] ] string > \
; skipping
unknown alert format for line: chk_str_fmt { USER PASS RNFR RNTO SITE MKD } \
; skipping
unknown alert format for line: telnet_cmds yes \
; skipping
unknown alert format for line: data_chan
; skipping
unknown alert format for line: preprocessor ftp_telnet_protocol: ftp client default \
; skipping
unknown alert format for line: max_resp_len 256 \
; skipping
unknown alert format for line: bounce yes \
; skipping
unknown alert format for line: telnet_cmds yes
; skipping
unknown alert format for line: preprocessor smtp: \
; skipping
unknown alert format for line: inspection_type stateful \
; skipping
unknown alert format for line: normalize cmds \
; skipping
unknown alert format for line: normalize_cmds { EXPN VRFY RCPT } \
; skipping
unknown alert format for line: alt_max_command_line_len 260 { MAIL } \
; skipping
unknown alert format for line: alt_max_command_line_len 300 { RCPT } \
; skipping
unknown alert format for line: alt_max_command_line_len 500 { HELP HELO ETRN } \
; skipping
unknown alert format for line: alt_max_command_line_len 255 { EXPN VRFY }
; skipping
unknown alert format for line: preprocessor sfportscan: proto { all } scan_type { all } memcap { 1000000 } sense_level { medium } logfile { sfPortscan.log }
; skipping
unknown alert format for line: preprocessor ssh: server_ports { 22 } \
; skipping
unknown alert format for line: max_client_bytes 19600 \
; skipping
unknown alert format for line: max_encrypted_packets 20 \
; skipping
unknown alert format for line: enable_respoverflow enable_ssh1crc32 \
; skipping
unknown alert format for line: enable_srvoverflow enable_protomismatch
; skipping
unknown alert format for line: preprocessor dcerpc2
; skipping
unknown alert format for line: preprocessor dcerpc2_server: default
; skipping
unknown alert format for line: preprocessor dns: \
; skipping
unknown alert format for line: ports { 53 } \
; skipping
unknown alert format for line: enable_rdata_overflow
; skipping
unknown alert format for line: preprocessor ssl: noinspect_encrypted, trustservers
; skipping
unknown alert format for line: output log_tcpdump: tcpdump.log
; skipping
unknown alert format for line: include classification.config
; skipping
unknown alert format for line: include reference.config
; skipping
unknown alert format for line: include $RULE_PATH/local.rules
; skipping
unknown alert format for line: include $RULE_PATH/scan.rules
; skipping
Undefined subroutine &MemTimeBase::jd_timelocal called at /etc/perl/MemTimeBase.pm line 38, <inputfile003> line 6.


Alguem sabe ?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts