quarta-feira, 4 de abril de 2012

Frag3 Preprocessor - Serie Snortando (Parte 5)

Bom, como sabemos o pacote passa por diversos caminhos até chegar ao seu destino final. Durante esse caminho os "pacotes" podem ser quebrados em partes menores na camada 3 (IP) devido ao MTU. Quando isso acontece chamamos de fragmentação IP.

Primeiramente o que seria o MTU ?

MTU é a sopinha de letras para Maximum Transmission Unit que resumidamente seria o tamanho máximo em bytes do payload. Existem diferente valores de MTU dependendo da tecnologia utilizada (ver figura abaixo) mas para Ethernet o padrão é 1500 bytes onde. Um simples exemplo para ver o MTU da sua máquina (no meu caso Mac) seria com o ifconfig:

$ ifconfig en1

en1: flags=8863 mtu 1500
    ether 00:26:bb:11:88:0d
    inet6 fe80::226:bbff:fe11:880d%en1 prefixlen 64 scopeid 0x6
    inet 192.168.0.3 netmask 0xffffff00 broadcast 192.168.0.255
    media: autoselect
    status: active




No caso existe a fragmentação necessaria visto algum MTU menor no caminho e também existe a malicioso no qual o atacante já envia os pacotes fragmentados tentando bypassar a proteção.
Bem resumidamente teriamos:

1-) Host A envia seu trafego para maquina Host B que está em outra rede
2-) Máquina Host A vai montando o pacote da camada 7 para baixo até chegar a camada fisica
3-) O pacote então é enviado para o roteador default configurado no Host A caso não esteja na mesma rede .
4-) Esse roteador default possui outras rotas e cada roteador abre o pacote até a camada 3 para ver opções IP assim como o endereço destino
5-) Quando o "pacote" sai da minha máquina ele sai com um tamanho X que é o MTU no qual caso ele seja menor no caminho o pacote precisara ser fragmentado (Comparando com algo do dia a dia seria como um encanamento onde a água sairia de um cano maior e entraria num menor).
6-) O "pacote" quando fragmentado é divido em partes menores e todos chegarão na maquina Host B com uma sequencia para que possam ser remontados.

A questão em jogo é que o seu snort (NIDS) estará no meio desse tráfego, se o mesmo não remontar o "pacote" fragmentado, ele não conseguira ver o real conteúdo que esta sendo tráfegado nas camadas superiores e NUNCA irá conseguir fazer o match com algum regra visto que so terá um pedaço da informação. Por isso existe o preprocessador FRAG3.

Para melhor entender o que é fragmentação devemos primeiramente entender o cabeçalho IP . Nesse artigo falaremos apenas sobre IPv4.


Não entrarei em detalhes do cabeçalho inteiro aqui mas o que é importante para nos serão os campos: IP Flags e Fragment Offset .

Na parte de IP Flags

- D não fragmentado
- M mais fragmentos

No caso se a flag D estiver setada quer dizer que o pacote está fragmentado e no caso M indicara se é o ultimo ou se mais fragmentos estão por vir

O Fragment Offset é onde fica setado a ordem dos pacotes e onde ele se encaixara na remontagem falando de forma bem simples. Com base nisso existem o Overlapping do fragmento quando 2 gramentos diferentes chegam com o mesmo offset .

Se analisarmos no wireshark veremos que normalmente os pacotes não são fragmentados (muitos são parte de uma remontagem que acontece na camada TCP e falaremos no post do Stream5) como podemos observar no exemplo abaixo:



Após explicarmos como funciona a fragmentação da para se  entender a importancia do preprocessador frag3 onde podemos listar:

- Evitar evasions (veja exemplos abaixo)

a-) Nesse primeiro exemplo o atacante aproveitaria que o timeout do IDS é menor que do computador da vitima fazendo com que o IDS drop o "pacote" enquanto a maquina vitima aguardara o segundo fragmento.



b-) No exemplo abaixo atacante aproveita da diferença de timeout entre o sensor de IDS e o host atrás do mesmo sendo que ele engana a remontagem enviando "pacotes" com timeout preparados para isso onde o IDS remontara errado e a vitima recebera o ataque.


c-) Como citado existem o Overlapping que seria quando dois fragmentos chegam com o mesmo offset no qual alguns sistemas remontam o "pacote" com o segundo que chegar .



Existem outros ataques mas vou ilustrar apenas esses 3 =)!

* Imagens retiradas desse artigo que diga-se de passagem muito bom em Ingles - http://www.symantec.com/connect/articles/evading-nids-revisited

- Policy based, ou seja, cada sistema operacional remonta esses pacotes em uma ordem. Sugiro lerem o paper no site do Snort onde Judy Novak explicou seus estudos para criação desse preprocessador . Abaixo diferente sistemas operacionais versus a policy a ser utilizada



Alguns exempos de configuração do frag3:

 preprocessor frag3_global: prealloc_memcap 8192 
 preprocessor frag3_engine: policy linux, bind_to 192.168.1.0/24
 preprocessor frag3_engine: policy first, bind_to [10.1.47.0/24,172.16.8.0/24]
 preprocessor frag3_engine: policy last, detect_anomalies

No exemplo acima usaremos um memoria de 8mb prealocada o que fará o preprocessador mais veloz. Na segunda linux vamos usar a policy linux para a rede 192. Na terceira linha a policy first para as redes 10 e 172. Na ultima linha o que não fizer bind nas redes acima será considerado policy last. No caso vale lembra da opcão detect_anomalies onde com regras de preprocessor ele detectara algumas anomalias de fragmentação.

Mais info sobre frag3 no manual do snort http://manual.snort.org/node17.html#SECTION00321000000000000000

* Vale a dica que caso não conheça todas as maquinas utilize a policy que possui maior numero de SO instalados . O ideal seria setar tudo corretamente mas isso leva tempo.

Agora edit seu snort.conf e faça as devidas configurações =)!

Espero que tenha ajudado!

Happy Snorting!

Rodrigo "Sp0oKeR" Montoro