
Sniffles: Gerador de Captura de Pacotes para IDS e Avaliação de Expressões Regulares
Sniffles é uma ferramenta para criar capturas de pacotes que testarão IDS que usam padrões fixos ou expressões regulares para detectar comportamentos suspeitos. Sniffles funciona de forma muito simples. Ele pega um conjunto de expressões regulares ou regras e escolhe aleatoriamente uma expressão regular ou regra. Em seguida, gera conteúdo com base nessa regra ou expressão regular. Para strings fixas, isso significa adicionar a string diretamente aos dados (possivelmente com offsets ou outras opções, conforme as regras do Snort). Para expressões regulares, o processo é um pouco mais complexo. A expressão regular é convertida em um NFA e um caminho aleatório é escolhido através do NFA (do início ao fim). Os dados resultantes corresponderão à expressão regular. Finalmente, Sniffles pode ser configurado para correspondência total ou parcial. Com uma correspondência total, os dados do pacote irão corresponder absolutamente a pelo menos uma regra ou expressão regular (embora algumas opções do Snort não sejam totalmente consideradas). Uma correspondência parcial apagará o último caractere de uma sequência de correspondência para uma sequência que não deve corresponder (pode corresponder a outra regra, no entanto). Regras correspondentes devem causar a maior carga em um IDS. Assim, é possível determinar quão bem o IDS lida com o tráfego no pior caso. O tráfego de correspondência parcial causará quase tanta carga quanto o tráfego correspondente. Finalmente, Sniffles também pode gerar tráfego que possui dados completamente aleatórios. Esses dados aleatórios oferecem um cenário de melhor caso, já que dados aleatórios são muito improváveis de corresponder a qualquer regra. Assim, podem ser processados na velocidade máxima. Dessa forma, Sniffles permite a criação de capturas de pacotes para operação de melhor e pior caso da inspeção profunda de pacotes do IDS.
Além do acima, Sniffles também tem a capacidade de criar capturas de pacotes de avaliação. Existem dois tipos de capturas de pacotes de avaliação. A primeira captura de pacotes de avaliação criará exatamente um pacote para cada regra ou expressão regular, em sequência. Assim, é possível testar e verificar se cada regra corresponde conforme o esperado. A avaliação completa vai um passo além e cria um pacote para cada ramo possível em uma expressão regular. Uma única expressão regular pode ter milhares de ramos possíveis. Isso testa para garantir que todos os ramos possíveis de uma expressão regular sejam tratados adequadamente. Capturas de pacotes de avaliação devem corresponder a todos os pacotes. Quaisquer pacotes não correspondentes provavelmente representam uma falha do IDS e precisam de uma investigação mais aprofundada. É claro, sempre há a possibilidade de que Sniffles não esteja criando o pacote correto para um determinado IDS, ou não reconheça uma opção específica para uma regra. Verifique os recursos de regras suportados para mais informações.
Finalmente, Sniffles também pode fazer muito para gerar tráfego de rede aleatório. Por padrão, o tráfego aleatório é TCP, UDP ou ICMP e unidirecional. No entanto, também pode gerar tráfego TCP com ACKs, handshakes e teardowns para cada fluxo. Ele gerará números de sequência e checksums corretos. Além disso, endereços MAC podem ser definidos de acordo com distribuições desejadas, e endereços de rede IP podem ser definidos pelos espaços de endereço Local e Externo. Além disso, é possível simular varreduras dentro de uma captura de tráfego.
REQUER: Python 3.3+ e o módulo SortedContainers
Sniffles consiste nos seguintes arquivos:
Para instalar:
python3.x setup.py install.Notas de Instalação:
python3.x setup.py build para construir localmente, depois vá para o diretório da biblioteca, encontre a lib e use python3.4 -c "from sniffles import sniffles; sniffles.main()" para executar localmente.Snort: Regras de alerta do Snort (a regra deve começar com a diretiva Alert). Tags de conteúdo são reconhecidas e analisadas corretamente. Tags PCRE são igualmente analisadas corretamente. Tags HTTP são processadas consecutivamente, então podem não criar o pacote desejado. O conteúdo (e conteúdo PCRE ou HTTP) pode ser modificado por distance, within e offset. Uma regra pode usar uma opção de controle de fluxo, embora apenas a direção dos dados seja derivada disso. A opção nocase é ignorada e o caso apresentado é usado. Todas as outras opções são ignoradas. Os valores do cabeçalho são analisados e um pacote será gerado atendendo a esses valores. Se espaços de endereço de rede Local e Externo forem usados, o espaço correto será usado para as variáveis $HOME_NET e $EXTERNAL_NET, respectivamente. Exemplo:
alert tcp $EXTERNAL_NET any -> $HOME_NET 8080 (msg:"SERVER-APACHE Apache Tomcat UNIX platform directory traversal"; flow:to_server; content:"/..|5C|/"; content:"/..|5C|/"; http_raw_uri;
Expressões regulares: Expressões regulares brutas, 1 por linha, escritas como abc ou /abc/i. Atualmente suporta as opções i, s e m. Outras opções são ignoradas. Exemplo:
/ab*c(d|e)f/i
Formato de Regra Sniffles descrito abaixo.
-a TCP Ack: Envia um acknowledgment TCP para cada pacote de dados enviado. Desligado por padrão. Pacotes de acknowledgment não possuem dados por padrão.
-b Bidirectional data: Os dados serão gerados em ambas as direções de um fluxo TCP. ACKs serão ativados. Este recurso está desligado por padrão.
-B [Background Traffic Protocol:Percentage]: Define pelo menos um protocolo com valor entre 1 e 100 para produzir Tráfego de Fundo. Este valor representa a porcentagem da quantidade total de tráfego. Protocolos disponíveis: FTP, HTTP, IMAP, POP e SMTP. Por exemplo: "http:20,ftp:30,smtp:10". Digite apenas um número como valor do argumento para gerar tráfego aleatoriamente. Por exemplo: "80".
-c Count: Número de fluxos a serem criados. Cada fluxo conterá um mínimo de 1 pacote. O pacote estará entre dois endpoints conforme definido pela regra ou escolhidos aleatoriamente. tcp_handshake, tcp_teardown e packets_per_stream aumentarão o número de pacotes por fluxo. Atualmente, os dados em um fluxo fluem em apenas uma direção. Se a opção -b for usada, os dados devem fluir em ambas as direções. Além disso, as regras Sniffles podem designar dados para fluir em ambas as direções.