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