[LinuxFocus-icon]
Início  |  Mapa  |  Índice  |  Procura

Novidades | Arquivos | Links | Sobre LF
[an error occurred while processing this directive]
convert to palmConvert to GutenPalm
or to PalmDoc

[Foto del Autor]
por Danilo Lujambio


Conteúdo:

 

Aprendendo com o nmap

[nmap]

Abstrato:



Porque são os scanners tão importantes para a segurança das redes ? Basicamente, porque são utilitários essenciais para aqueles que querem atacar um sistema. A preparação de um ataque podia assemelhar-se a algo do género :



Para um administrador de sistema preocupado com a segurança do sistema é importante fazer um scan à sua própria rede, procurar vulnerabílidades antes que outros o façam e não com tão boas intenções.

Existem vários utilitários de scan para este fim, mas o artigo só focará o nmap. O nmap é entre todos o scanner e utilitário de segurança mais completo.

O Nmap permite ao administrador de sistema fazer um scan às redes para saber quais os servidores activos e os serviços que ofereçem. Para este fim, o nmap oferece várias técnicas de scan. O artigo focará um número limitado delas, revendo (talvez ensinando ?) alguns aspectos do protocolo TCP.

A estratégia deste artigo será a de mostrar como utilizar o nmap, como habitualmente é utilizado, para obter informação acerca de sistemas e em paralelo, como encontrar rastos de scan no lado do alvo.

O nmap pode ser obtido a partir de www.insecure.org. Após o download faça :

tar zxvf nmap-2.30BETA17.tgz
cd ...../nmap-2.30BETA17/
./configure
make
make install
e está instalado.

O output do nmap é, habitualmente, uma lista "interessante" de portos (activos) na máquina de destino, scanada. Estas portas fornecem o nome dos serviços, o seu estado e o protocolo.

 

Scanando o TCP, o aperto de mão do TCP (opção -sT)

A forma mais simples de fazer scan com o nmap é feia com a opção -sT. É baseada no método de estabelecimento de uma ligação no protocolo TCP, conhecida como o aperto de mão. A sequência [1] é descrita em baixo

  1. O servidor tem de estar preparado para receber uma conexão (utilizando, habitualmente as funções sockd, bind e listen)
  2. O cliente inicia uma ligação activa - uma chamada ao connect(). Isto envia um segmento SYN ao servidor para informar acerca do número de sequência inicial dos dados que o cliente enviará durante a ligação. O segmento SYN contém, usualmente um cabeçalho IP - um cabeçalho TCP e talvez algumas opções TCP.
  3. O servidor deve conhecer o SYN, enviando um ACK e um SYN com o seu número de sequência (com o mesmo pacote TCP).
  4. O cliente deve conhecer o SYN do servidor com um ACK


Este modo de scan tem duas vantagens:

mas tem uma grande desvantagem. É fácil de detectar e de filtrar.

Seguiremos o procedimento utilizado pela opção do nmap -sT, correndo o tcpdump na máquina de destino, o nmap é executado na máquina 192.168.255.50 e aponta na direcção da máquina house2.xxx.xxx.xxx através de uma rede Ethernet.

1) 08:24:18.393108 192.168.255.20.1024 house2.xxx.xxx.xxx.653: S 2632227152:2632227152(0) win 16060 < mss 1460,sackOK,timestamp 232602[|tcp] (DF)
2) 08:24:18.393167 house2.xxx.xxx.xxx.653 192.168.255.20.1024: R 0:0(0) ack 2632227153 win 0
3) 08:24:18.393227 192.168.255.20.1025 house2.xxx.xxx.xxx.6141: S 2644226118:2644226118(0) win 16060 < mss 1460,sackOK,timestamp 232602[|tcp] (DF)
4) 08:24:18.393258 house2.xxx.xxx.xxx.6141 192.168.255.20.1025: R 0:0(0) ack 2644226119 win 0
5) 08:24:18.453343 192.168.255.20.1298 house2.xxx.xxx.xxx.pop3: S 2640612362:2640612362(0) win 16060 < mss 1460,sackOK,timestamp 232608[|tcp] (DF)
6) 08:24:18.453542 house2.xxx.xxx.xxx.pop3 192.168.255.20.1298: S 1658259980:1658259980(0) ack 2640612363 win 16060 < mss 1460,sackOK,timestamp 243353[|tcp] (DF)
7) 08:24:18.458667 192.168.255.20.1298 house2.xxx.xxx.xxx.pop3:. ack 1 win16060<nop,nop,timestamp 232609 243353 (DF)
8) 08:24:18.461280 192.168.255.20.1298 house2.xxx.xxx.xxx.pop3: F 1:1(0) ack 1 win 16060 < nop,nop,timestamp 232609 243353 (DF)

A numeração de linhas foi adicionada para facilitar a explicação. A linha 1 mostra a máquina "atacante" 192.168.255.50, a enviar um segmento SYN a partir do porto 1024 para a porta 653 da máquina de destino house2.xxx.xxx.xxx. Podemos reconhecê-lo como um segmento SYN graças ao S depois do número da porta (653). Isto cobre o ponto 2) do aperto de mão, explicado anteriormente.
Na linha 2 vemos a máquina de destino a responder com um pacote RESET (note no R depois do 1024) indicando que não há nenhum processo à escuta no porto 653.
As linhas 3 e 4 são semelhantes às primeiras, mas verificando se existe um processo no porto 6141 da máquina de destino. Como não há nada de novo, também responde com um RESET.
A linha 5 mostra como a máquina 192.168.255.20 envia um segmento SYN para a porta POP3 (número 110), da máquina de destino e esta responde com um ACK aceitando o SYN e o número de sequência ( A máquina envia o número de sequência da máquina de destino, neste caso o 1658259980, e o número de sequência enviada pela máquina 192.168.255.50 adicionando 1, formando o 2640612363). Note que o pacote enviado a partir da house2 tem o bit de controlo SYN e ACK activado. Isto vê-se na linha 6 e corresponde ao ponto 3) do aperto de mão acima.
A linha 7 mostra o reconhecimento do último pacote recebido nas máquinas 192.168.255.50, com um segmento ACK, alcançando-se o ponto 4) do aperto de mão.
A linha 8 é o fim de ligação da máquina 192.168.255.50, que é feito através do envio de um segmento FIN (note o F após o POP3).

Esta execução permitiu ao nmap detectar o porto 110(pop3) da máquina house2 está activo naquela máquina.

Como referido anteriormente, este modo de scan é fácil de detectar, usando as impressões deixadas no ficheiro /var/log/messages (contudo isto depende do modo como o syslog.conf foi configurado) a ligação vista nas linhas 5 e 8 produziu:

May 6 08:24:01 house2 in.pop3d[205]: connect
from root@192.168.255.20


 

Fazendo Scan usando segmentos SYN (meio abertos, opção -sS)

Este tipo de scan é feito pelo nmap através da opção -sS. A técnica é utilizada para abrir uma "meia ligação": enviamos um segmento SYN e se é recebido um ACK então detectámos uma porta activa na máquina de destino e enviamos um RESET para fechar a ligação devidamente. Se recebermos um RST em vez de um ACK, então a porta scanada não está activa. Este modo de scan tem o senão que são requeridos privilégios root para ser executado. Mas a vantagem é que é difícil de detectar na máquina à qual se faz o scan.

Façamos uma análise das acções feitas pelo nmap com esta opção, analisando-o com o tcpdump (com numeração de linhas, para facilitar a descrição).

1) 22:25:45.856936 192.168.255.20.40175 house2.tau.org.ar.946: S 1292785825:1292785825(0) win 3072
2) 22:25:45.857078 house2.tau.org.ar.946 192.168.255.20.40175: R 0:0(0) ack 1292785826 win 0


As linhas 1 e 2 são, quase semelhantes às linhas 1 e 2 da secção anteriror, excepto que um segmento SYN é visto, enviado pela máquina 192.168.255.50 para o porto 946 da máquina house2 e obtivemos uma resposta com um RESET porque não é uma porta activa.

3) 22:25:45.970365 192.168.255.20.40175 house2.tau.org.ar.pop3: S 1292785825:1292785825(0) win 3072
4) 22:25:45.976022 house2.tau.org.ar.pop3 192.168.255.20.40175: S 185944428:185944428(0) ack 1292785826 win 16080 < mss 536 (DF)
5) 22:25:45.979578 192.168.255.20.40175 house2.tau.org.ar.pop3: R 1292785826:1292785826(0) win 0

As linhas 3,4 e 5 são produzidas pela descoberta bem sucedida do serviço (pop3) no porto 110 da máquina house2. Como mencionado, o aperto de mão não é completado mas quando o nmap recebe o reconhecimento de um segmento SYN (como significado do segmento ACK enviado pela house2 na linha 4), envia um segmento RESET que força a interrupção da comunicação.

Este scan na máquina host2 não deixou nenhum rasto no ficheiro /var/log/messages, como mencionado anteriormente.

 

Scanando utilizando segmentos FIN

Este tipo de scan é baseado no facto de que portas inactivas na máquina de destino respondem a um pacote FIN com um pacote RST. Por outro lado, portas activas, simplesmente, ignora este pacote. Assim, a lista de portas interessantes é obtida observando-se as quais não responderam. Máquinas correndo sistemas operativos Window$ não podem ser "scanadas" com este método, visto não terem implementações standard do protocolo TCP.

Existem três formas de operar com o nmap em situações semelhantes. com as opções -sF, -sX e -sN. Analisaremos depois o comportamento da opção -sF, efectuando uma análise semelhante às secções anteriores.

1) 06:50:45.643718 192.168.255.20.35600 casahouse.tau.org.ar.864: F 0:0(0) win 2048
2) 06:50:45.643865 house2.tau.org.ar.864 192.168.255.20.35600: R 0:0(0) ack 0 win 0

Nas linhas 1 e 2 os segmentos FIN entregues (note no F depois do 864 na linha 1) é observado na máquina de destino que responde com um pacote RST (note no R na linha 2 depois do 35600). O nmap conclui que a porta 864 na house2 não está activa.

3) 06:50:47.933227 192.168.255.20.35600 > house2.tau.org.ar.pop3: F 0:0(0) win 2048
4) 06:50:48.251147 192.168.255.20.35601 > house2.tau.org.ar.pop3: F 0:0(0) win 2048

As linhas 3 e 4 tomam o pop3 como exemplo. Na linha 3, vemos um segmento FIN enviado, o qual não obtém resposta da house2. A linha 4 foi uma surpresa, sendo provavelmente uma medida tomada pelo nmap para verificar o estado daquele porta, enviando outro segmento FIN, para assegurar que a porta não está a responder. Em ambos os casos, a house2 ignorou os pacotes, mostrando ao nmap que a porta pop3 está activa.

 

Funcionalidade do tcpdump que pode ajudar

Na secção acerca do "scan de aperto de mão", vimos que as rastos que um scan pode deixar atrás, e nas últimas secções vimos que as opções de scan -sS e -sF não deixam impressões digitais. Podemos utilizar o tcpdump para detectar este tipo de scan numa máquina conectada a uma rede susceptível a ataques. O contra do tcpdump é que gera um enorme monte de informação e levanta dificuldades com o seu arquivo e análise. Algumas expressões são mostradas aqui e reagem como filtros para que a informação seja mais pequena e simples de analisar.

Para tornar as expressões de fácil compreensão, mostramos em baixo o formato de um pacote TCP [2].

 

TCP (RFC 793)

0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |        Destination Port       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Sequence Number                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Acknowledgement Number                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Offset |  Reserver |U|A|P|R|S|F|             Window            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                  Options                      |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              Data                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Vimos que o 13.º byte é onde as flags que identificam o tipo de pacote (SYN, FIN, etc) residem. Com este conhecimento e com o operador (&) podem construir-se máscaras para detectar os bits activos, construindo expressões do tipo :
tcpdump ' tcp[13] & 7 != 0 and dst 192.168.255.20 ' > /tmp/out7

que filtram os pacotes de entrada com os bits R,S ou F activos a máscara (a máscara é 00000111) com 192.168.255.20 como máquina destino (obviamente que este endereço IP será pesquisado pela máquina).

Usando

tcpdump ' tcp[13] & 1 != 0 and dst 192.168.255.20 ' > /tmp/out1

Obteremos os pacotes com o bit activo F (a máscara é 00000001). Podia ser útil para detectar a opção de scan do nmap -sF e com

tcpdump ' tcp[13] & 2 != 0 and dst 192.168.255.20 ' > /tmp/out2

obteremos somente os pacotes com o bit SYN activo, sendo útil para detectar scan com a opção -sS.

Para o último tipo descrito (com a opção -sS) existem programas específicos para o detectar [3].

 

Conclusão

Programas como o nmap são muito úteis para melhorar a segurança do sistema ao olhar para as redes através dos olhos de um possível pirata. Mostramos as operações de uma pequena parte das opções, mas espero que o ajude a compreender um pouco mais a ideia de um scanner de rede.

 

Bibliografia

[1] W. Richard Stevens Unix Network Programming Volume 1
[2] RFC 793
[3] ver documentação do nmap

 

Forma de respostas para este artigo

Todo artigo tem sua própria página de respostas. Nesta página você pode enviar um comentário ou ver os comentários de outros leitores:
 página de respostas 

Páginas Web mantidas pelo time de Editores LinuxFocus
© Danilo Lujambio, FDL
LinuxFocus.org

Clique aqui para reportar uma falha ou para enviar um comentário para LinuxFocus
Informação sobre tradução:
es -> -- Danilo Lujambio
es -> en Iván Rojas Aguilar
es -> en Javier Palacios
en -> en Lorne Bailey
en -> pt Bruno Sousa

2001-08-13, generated by lfparser version 2.17