Detector de intrusão snort: 1º parte

Então galera quase todo mundo uma vez ou outra acaba ficando preocupado com a segurança do computador seja por causa de um virus qualquer ou ate de um hacker invadir o computador e roubar os dados (ahh meus nudes kkk), embora a maioria dos ataques hoje seja voltados a engenharia social e não é atoa ja que o lado mais fraco do sistema é o ser humano que o controla ou seja se a gente nao baixar o malware o computador nao sera infectado por um (tirando alguns tipos especificos é claro como o worms e auto-infect), mesmo usando nosso antivirus preferido que consideramos como o melhor não estamos seguros isso por que ate mesmo o antivirus é possivel burlar bastando usar um crypter para deixar o malware indetectável e isso vale para qualquer antivirus independente se é pago ou nao (ou aqueles que instala automaticamente e magicamente do nada, saporra de antivirus é o proprio virus kkk), com isso a gente nao pode deixar toda a segurança baseada em um antivirus isso é se ele é possivel burlar o que vai te proteger entao contra uma invasão? no caso um bom firewall bem configurado pode deixar seu sistema mais seguro contra alguns tipos especificos de malwares principalmente os de acesso remoto (trojan, backdoor, rat), uma boa sandbox pode proteger seu sistema contra modificação de alguns virus, outra ferramenta sendo ela que vamos ver nesse tutorial são os detectores de intrusos tambem chamado de IDS, os detectores de intruso detecta padroes específicos de ataque especificos e com base neles é possivel detectar um ataque em tempo real e com isso tomar determinadas medidas durante um ataque, o IDS que vamos ver nesse tutorial é o snort que é uma ferramenta com base em comandos e pode ser baixado no site oficial ela tem tanto para windows quanto para linux

site oficial

o snort funciona como um sniffer ou seja ele é um IDS passivo que fica capturando os pacotes passados pela rede ou pela maquina dependendo da topologia ou do que os conecta, ele tambem permite armazenar os pacotes que podem ser lidos por outros programas como tcpdump e wireshark, alem de ser possivel filtrar pacotes especificos e ignorar os outros ou seja se voce fosse detectar ataques de DNS nao precisaria mexer com pacotes TCP ja que o DNS usa UDP ou ate melhor filtra apenas a porta de DNS, o snort trabalha com regras especificas e é por essas regras que detectamos padroes de ataque ou seja voce pode criar regras especificas para ataques especificos (descubra como um ataque funciona com isso voce vai descobrir como atacar da mesma forma e ao mesmo tempo vai aprender a se proteger desse ataque), com o snort voce sabendo como o ataque funciona voce pode criar uma regra que detecta esse ataque e é isso que vamos aprender mais para frente criar regras e usar ferramenta a snort, antes disso vou dizer uma coisa bem legal uma forma de usar uma maquina para proteger a rede toda vamos ver a melhor topologia para o uso dele no caso, como ja sabemos o snort é passivo ou seja fica apenas capturando entao ou trafego da rede precisa passar pela maquina que é snort antes das outras ou usar um hub (no caso o hub ele envia o pacote para todas as portas dele ou seja independente se o pacote e para a maquina ou nao ela vai receber o pacote, diferente do que acontece com um switch ou roteador), outra coisa que precisamos é usar a maquina snort conectada diretamente ao modem como ponte (bridge) isso por que alguns modens tambem atua como roteador e eles mesmo fazem a conexao com o provedor e ao mesmo tempo NAT com a rede interna ou seja toda a maquina ligada ao modem seja por um hub estaria conectada a internet diferente do modo bridge que cada maquina teria que fazer a conexao com provedor para esta ligada a internet (esse modo é menos usado por que os provedores limita a quantidade de conexao ja que cada conexao de cada maquina sua recebe um IP valido do provedor ou seja muitas maquinas dos clientes acabaria esgotando o range de IP do provedor diferente do modo roteador ou ate usar um roteador mesmo para conectar no modem ja que so receberia um IP), entao kodo se é limitado por que usar esse modo? pelo simples fato que o modo bridge nao precisa abrir porta ja que todas as portas referente ao modem e aquele IP vai esta liberada para aquela maquina especifica por outro lado se usar o modo roteador e a pessoa de fora tentar invadir seu servidor http que esta na sua maquina se nao estiver liberado a porta nem vai chegar na sua maquina com isso o snort nao vai detectar a tentativa de invasao, uma forma de contonar as conexões do modo bridge é transformar sua maquina em um servidor de proxy ou seja todas as maquina na rede interna usa a sua maquina para conectar a internet outra forma seria tranforma sua maquina em um roteador que é mais facil no linux ja que é so setar um numero em arquivo

Imagem

com essa topologia a maquina que tem o snort pode tanto capturar os pacotes que vem da internet quanto os ataques que parte de dentro da rede (temos que considerar tambem que nao é topologia mais segura ja que se a maquina snort for comprometida ja era voce vai ter grandes problemas kkk), bom esquecendo um pouco a parte teorica se nao isso aqui vai ficar um pouquinho grande vamos aprender usar o snort no caso nao vou abordar a instalação dele ja que nao é muito complicada porem se tiver duvida eu faço um tutorial apenas da instalação dele \o, o primeiro comando que a gente pode ver no snort é apenas ele sem nenhum argumento isso faz ele capturar os pacote como sniffer

CÓDIGO: SELECIONAR TODOS
snort

Imagem

o comando anterior vai fazer ele capturar os pacotes conforme a gente for navegando na internet ele vai mostrar um cabeçalhos simples do pacote sendo a hora, o IP e a porta da fonte seguido do IP do destino, entre outras informaçoes como tamanho pacote e flags do protocolo, para a gente parar a captura basta apartar control+c e com isso no final mostra os tipos e estatisticas dos pacotes capturados

Imagem

a gente pode usar o argumento -e para mostra um pouco mais de informações como MAC e outros referente a camada de enlace

CÓDIGO: SELECIONAR TODOS
snort -e

Imagem

com o argumento -d mostra os bytes do pacote

CÓDIGO: SELECIONAR TODOS
snort -d

Imagem
podemos usar o argumento -C para mostrar os caracteres sem o codigo hexadecimal sendo bom para capturar cookies e strings alem de outras headers, no caso esse comando deve ser usado em conjunto com anterior podendo ser usado separadamente dessa forma

snort -d -C

ou junto dessa forma (podendo inverter tambem e o mesmo vale para outros argumentos)

snort -dC

Imagem

o -l permite a gente escolhe o diretorio onde sera armazenado os logs do pacote, quando a gente usa esse argumento nao é mostrado os pacotes capturados apenas armazenados em um arquivo no diretorio escolhido

snort -l /home/kodo/Desktop

Imagem

podemos usar o -K para escolher o tipo de log que sera salvo sendo eles pcap (padrao) e ascii que gera diretorios para cada IP e dentro deles arquivos com texto logs

snort -l /home/kodo/Desktop -K ascii

para ler o log podemos usar o proprio snort com o argument -r seguido do arquivo (tambem é possivel usar os argumentos anteriores nele como -de)

snort -r snort.log.1453120877

ou abrir o arquivo em algum outro programa que aceite logs pcap como por exemplo o wireshark

Imagem

para especificar uma interface de rede usamos -i

snort -i eth0

para capturar um numero maximo de pacotes usamos -n seguido da quantidade

snort -n 1000

podemos usar o -q para nao exibir o banner e nem as estatisticas no final

snort -q

para filtrar pacotes especificos usamos o -f seguido do filtro, para filtrar uma porta especifica usamos port seguido da porta (como existe espaço no filtro deve ser colocado entre aspas)

snort -f "port 80"

para filtrar apenas portas de destino especificas usamos o filtro “dst port” seguido da porta

snort -f "dst port 80"

para filtrar portas da fonte usamos “src port” seguido da porta

snort -f "src port 80"

com a logica or podemos especificar dois ou mais argumentos para o filtro (assim podemos capturar tanto o pacote que vai para o servidor quanto o que vem dele embora o mesmo possa ser feito apenas usando o port)

snort -f "dst port 80 or src port 80"

podemos usar o or para especificar varias portas ao mesmo tempo

Snort -f "port 80 or port 21 or port 443 or port 22"

tambem é possivel especificar protolocos como tcp, udp, icmp, arp, sctp, entre outros

snort -f "tcp"

pode ser combinado com a logica or tambem

snort -f "tcp or udp"

com a logica and apenas se todos os argumentos forem satisfeito o sera filtrado com isso podemos especificar filtros mais preciso

snort -f "udp and port 53"

com a logica not ele inverte a logica por exemplo “not udp” ele mostra qualquer pacote que nao seja udp

snort -f "not udp"

tambem podemos especificar um ip da fonte sendo ele src seguido do ip

snort -f "src 192.168.1.1"

ou do destino sendo dst seguido do ip

snort -f "dst 192.168.1.1"

agora a gente ja pode fazer uma combinação de comandos no snort

snort -qdeCf "port 53 and udp"

Imagem

bom galera ate agora a gente apenas viu o funcionamento do snort como sniffer vamos ver o funcionamento dele como IDS e criar regras na segunda parte do tutorial entao ate la \o

Detector de intrusão snort: 2º parte

e ae galera continuando o tutorial anterior de snort nesse vamos criar regras especificas para ele detectar algum ataque especificos, lembrado o snort é um ids passivo que detectar padrões de ataques sobre regras pre-definidas ou seja se voce conhece o ataque voce consegue detectar ele, as regras que ja vem por default no snort fica no diretorio /etc/snort/rules onde tem diversas regras onde podemos abrir em um editor de texto e estuda-las
Imagem
por padrao o snort nao carrega essas regras direto daquela diretorio e sim de um arquivo snort.conf que fica em

/etc/snort/snort.conf

sendo essas regras incluídas atraves da diretiva include seguido do local da regra no arquivo snort.conf
Imagem
no caso a gente pode criar nosso arquivo com a nossa regra colocar la nos diretorios rules e depois incluir dentro do arquivo snort.conf ou entao podemos criar um novo snort.conf podendo ser outro nome tambem nao necessariamente snort.conf, porem criar um arquivo snort.conf novo pode gerar varios problemas principalmente se a gente usar uma regra ja existente que use variaveis que foram definidas no arquivo snort.conf original, para a gente chamar o arquivo de configuração com as regras basta usar o argumento -c seguido do local do arquivo, tambem precisamos definir o local onde sera armazenado os logs com o argumento -l seguido do diretorio

snort -c /etc/snort/snort.conf -l /home/kodo/Desktop

Imagem
sera gerado dois arquivos o arquivo normal de dump dos pacotes e o arquivo alert onde sera armazenado logs de invasão que vamos ver mais para frente, como dito antes a gente pode criar o nosso arquivo de configuração novo tambem (no caso vamos usar um arquivo novo e nao o snort.conf)

snort -c /home/kodo/Desktop/kodosnort.conf -l /home/kodo/Desktop

agora que a gente ja sabe como carregar arquivos de configuração vamos entender como as regras funciona, as regras se dividem em varias partes a primeira define o tipo de regra existe varios tipos porem vamos nos focar nesse tutorial no tipo alert que gera um alerta quando uma regra é detectada no pacote e com isso armazenado no arquivo alert, depois do tipo de regra temos o tipo protocolo que pode ser tcp ou udp, depois temos o IP da fonte no pacote seguido da porta da fonte, logo em seguida IP de destino seguido da porta destino, e por fim entre parenteses as opções

[Tipo] [Protocolo] [IP SRC] [Porta SRC] -> [IP DST] [Porta DST] (Opçao)

um exemplo basico seria isso, onde ele detecta apenas se o pacote estiver setado com o IP da fonte 192.168.1.1 e a porta da fonte for 10000 sendo enviado para o IP de destino 192.168.1.2 para porta 80 usando protocolo tcp

alert tcp 192.168.1.1 10000 -> 192.168.1.2 80 (sid: 1000001)

quando a gente precisa definir qualquer porta ou qualquer IP onde nao conhecemos podemos usar a palavra any, diferente do exemplo anterior que para detectar ele deveria detectar tudo no exemplo abaixo ele detecta qualquer pacote que tenha como destino o IP 192.168.1.1 na porta 80

alert tcp any any -> 192.168.1.1 80 (sid: 1000001)

o mesmo vale para o oposto que detecta o pacote que saiu daquela maquina

alert tcp 192.168.1.1 80 -> any any (sid: 1000001)

podemos criar varias regras uma em baixo da outra

alert tcp 192.168.1.1 80 -> any any (sid: 1000001)
alert tcp any any -> 192.168.1.1 80 (sid: 1000002)

o exemplo anterior tambem poderia ser feito dessa forma que indica que comunicação pode ser de ambos os lados

alert tcp 192.168.1.1 80 <> any any (sid: 1000001)

a gente pode definir uma rede ao inves de um IP bastando colocar o IP da rede e mascara de rede

alert tcp 192.168.1.0/24 any -> any any (sid: 1000001)

podemos definir varios IPs colocando entre colchetes e separados por virgula (o mesmo pode ser feito com portas)

alert tcp [192.168.1.1,192.168.1.2] any -> any any (sid: 1000001)

é possivel usar negação com o exclamação para inverter a logica, por exemplo para definir qualquer pacote que sera enviado para fora da rede (que nao seja aquela rede)

alert tcp 192.168.1.0/24 any -> !192.168.1.0/24 any (sid: 1000001)

agora vamos da uma analisada no log alert para entender ele, para isso vou usar a seguinte regra aqui qualquer pacote que for para o IP 192.168.1.1 que é essa maquina na porta 21 ou seja quero detectar ftp

alert tcp any any -> 192.168.1.1 21 (sid: 1000001)

Imagem
na maquina ubuntu (192.168.1.2) eu vou fazer a conexao ftp na maquina debian (192.168.1.1)
Imagem

com isso gero nosso alert porem gero varios alertas isso por que ouve varios pacotes de comunicação entre as duas maquinas, no arquivo existe na primeira linha [**] Snort Alert! [**] que é nada mais nada menos mensagem (podemos customizar a mensagem na opção da regra), o segundo é prioridade que por padrao é 0 tambem é possivel mudar ela na opção da regra, depois temos o tempo 02/15-07:28:56.632123 que é data e a hora que foi gerado o alerta, seguido do IP e porta da fonte e o IP e porta de destino 192.168.1.2:48950 -> 192.168.1.1:21, na linha de baixo temos o procotolo que nesse caso é o TCP, o TTL que é o tempo de vida do pacote em uma rede para evitar loops infinito, e algumas outras informações que nao é importante por enquanto como tamanho do pacote entre outras coisa, na linha de baixo temos as flags que sao extremamente importantes ja que por elas a gente pode detectar se um pacote esta iniciando uma comunicação ou a finalizando nesse caso a flag do primeiro pacote é S (syn) entao a comunicação esta sendo iniciada ******S*, depois disso temos mais algumas informações referente ao pacote (caso tenha duvida ou interesse em se aprofundar recomendo estudar rede para ser mais especifico a pilha de protocolo tcp/ip)

Imagem
a opção que temos que setar para criar um alerta que nao pode faltar é o sid (Snort ID), essa é unica opção que nao pode faltar em nenhum alerte se nao o snort nem roda e cada novo alerta a sid deve ser diferente da outra, é recomendado colocar sid acima de 1000000 ja que sid baixa pode ser que esteja em alguma regra especifica, para usar a sid basta digitar ela dentro da opção seguido de dois pontos e o numero

alert tcp 192.168.1.1 21 -> any any (sid: 1000001)
alert tcp any any -> 192.168.1.1 21 (sid: 1000002)
alert udp any any -> any 53 (sid: 1000003)

as vezes voce faz revisão da sua regra e com isso voce pode usar a opção rev seguido do numero da revisao (quando existe duas ou mais opções deve ser separado por ponto e virgula e tambem nao importa a ordem)

alert tcp any any -> any 3306 (sid: 1000001 ; rev: 10)

com a opção msg podemos definir a mensagem

alert tcp any any -> 192.168.1.1 21 (msg: conexao ftp ; sid: 1000001)
alert tcp any any -> 192.168.1.1 22 (msg: conexao ssh ; sid: 1000002)
alert tcp any any -> 192.168.1.1 80 (msg: conexao http ; sid: 1000003)

Imagem
para especificar uma flag usamos a opção flags seguido das letras que representa ela, o bom da flag é que podemos diminuir a quantidade de pacotes capturados principalmente quando queremos apenas detectar a conexao e nao todo pacote referente a conexao

alert tcp any any -> 192.168.1.1 80 (msg: conexao http; flags: S; sid: 1000001)

tambem podemos especificar a prioridade com priority seguido do numero

alert tcp any any -> 192.168.1.1 80 (msg: conexao http; priority: 3; sid: 1000001)

podemos checar o conteudo dentro do pacote com content, veja um exemplo de uma falha LFI

alert tcp any any -> 192.168.1.1 80 (msg: ataque LFI; content: "../../../"; sid: 1000001)

Imagem
no log foi detectado a tentativa de invasao pela falha LFI
Imagem
podemos usar bytes especifico no lugar de carecteres usando duas vezes o pipe e o codigo dos bytes no meio em hexadecimal, por exemplo a exploração de uma falha SQL Injection (sqli) onde se coloca aspas no final para ver se retornar erro do banco de dados sendo esse aspas convertido para urlencode %27 pelo proprio navegador e passado como o metodo

alert tcp any any -> 192.168.1.1 80 (msg: ataque SQLI; content: "|253237|" ; sid: 1000001)

Imagem
no log foi detectado a tentativa de invasão por SQL Injection
Imagem
entao galera eu ate pensei em construir um sisteminha vuneravel para esse exemplo (so que a preguiça nao deixo kkk ). e mesmo assim o intuito aqui nao é mostrar as falhas em si mais sim que a ferramenta pode detectar a tentativa de exploração dela, no caso do snort basta conhecer o padrao da falha que voce consegue criar uma regra para ele detectar ela, bom galera esse tutorial esta fincando um pouco grande entao vou continuar em uma 3º parte ja que esse assunto é bem extenso e ainda tem muita coisa para falar \o

By: Kodo no Kami \0
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s