quarta-feira, 14 de setembro de 2011

Tcpdump, cópia do tráfego de uma rede

Computadores em rede compartilham canais de comunicação. Nestes canais compartilhados, computadores podem receber informações enviadas para outros computadores. A ação de capturar informações destinadas para uma outra máquina é chamada "sniffing".

Um "analisador de protocolo de rede", ou "sniffer", é um dispositivo que permite "ouvir" o tráfego de uma rede, isto é, capturar as informações. Um sniffer permite interceptar o tráfego de dados de um segmento de uma rede.

Um computador está em modo promíscuo quando o mesmo captura todos os pacotes, independentemente de serem ou não destinados à ele. Um sniffer coloca a interface de rede em modo promíscuo, com o intuito de capturar todos os pacotes de um determinado segmento.

Conforme o fluxo de dados trafega na rede, o sniffer captura cada pacote, decodifica e analisa o seu conteúdo de acordo com o protocolo. A maioria dos protocolos de Internet faz as informações trafegarem de forma transparente, quer dizer, de maneira não criptografada. Todas as informações enviadas ou recebidas podem ser interceptadas se o conteúdo não estiver criptografado.

Quando os protocolos da camada de aplicação são implementados sobre uma camada suplementar SSL ou TLS, situada entre a camada de aplicação e a camada de transporte, os dados são transmitidos através de uma conexão criptografada. Desta forma, todo o tráfego torna-se ilegível.

Os sniffers mais conhecidos para o sistema Linux são o Tcpdump, Snort, Wireshark e Kismet. O Tcpdump, assim como os outros, exibe a descrição do conteúdo dos pacotes e é capaz de salvar os dados dos pacotes para análise posterior, pela linha de comando. A ferramenta Tcpdump utiliza uma biblioteca específica para a captura de tráfego, a libpcap. As principais ferramentas de análise de tráfego de rede são compatíveis com o formato pcap.

Com o Tcpdump é possível capturar, copiar e exibir detalhes dos pacotes que trafegam em uma rede. Se o comando 'tcpdump' for executado sem opções, serão capturados todos os pacotes trafegados pela primeira interface de rede ativa e exibidos na tela do terminal. Exemplo:

# tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
13:29:48.173109 IP 192.168.1.101.52423 > bs-in-f104.1e100.net.http: Flags [P.], seq 306271009:306271660, ack 1715067849, win 286, options [nop,nop,TS val 10553603 ecr 469407516], length 651
13:29:48.174608 IP 192.168.1.101.45494 > cache-orion.neoviatelecom.com.br.domain: 34718+ PTR? 104.163.233.64.in-addr.arpa. (45)
13:29:48.244368 IP bs-in-f104.1e100.net.http > 192.168.1.101.52423: Flags [.], ack 651, win 193, options [nop,nop,TS val 469428829 ecr 10553603], length 0
13:29:48.389694 IP cache-orion.neoviatelecom.com.br.domain > 192.168.1.101.45494: 34718 1/0/0 PTR bs-in-f104.1e100.net. (79)
13:29:48.390008 IP 192.168.1.101.43215 > cache-orion.neoviatelecom.com.br.domain: 5324+ PTR? 101.1.168.192.in-addr.arpa. (44)

As opções básicas para a linha de comando do Tcpdump são:

-D       Exibe a lista das interfaces de rede disponíveis e suportadas pelo tcpdump
-w       Escreve os pacotes raw em um arquivo, ao invés de analisá-los e exibi-los em tela
-r       Lê os pacotes do arquivo
-i eth0  Escutar a interface de rede especificada
-v       Quando analisar e exibir, produzir uma saída mais detalhada
-l       Armazena a saída padrão em buffer. Útil se desejar ver os dados enquanto captura.
-n       Não converter endereços de hosts para nomes
-c n     Sair após receber n pacotes
-x       Exibe os dados de cada pacote em hexadecimal (-xx c/ endereço físico)
-X       Exibe os dados de cada pacote em hexadecimal e ASCII (-XX c/ endereço físico)

O Tcpdump permite a utilização de filtros para capturar somente aqueles pacotes que estamos buscando dentre os milhares de pacotes que trafegam por uma ou outra interface de rede.

Com Tcpdump podemos usar expressões para filtrar o tráfego que desejamos capturar. Estas expressões são definidas por palavras reservadas (primitivas) e operadores lógicos para selecionar um determinado tráfego de rede. Algumas das palavras reservadas são:

- Tipo: host, net, port e portrange;
- Direção: src, dst, src or dst, src and dst etc.;
- Protocolo: ether, wlan, ip, tcp, udp, arp, rarp etc.;
- Operadores lógicos: and, or, not.

O tipo qualifica o que o nome ou número se refere, por exemplo:

host orion
net 10.42.42.0/24
port 80
portrange 5000-5600

A direção qualifica o sentido da transferência para e/ou saindo, por exemplo:

src net 172.16
dst host 192.168.1.1
src or dst port ftp-data

O protocolo restringe a busca para um protocolo em particular, por exemplo:

ether src orion
arp net 128.3
tcp port 21

Os operadores lógicos servem para criar expressões complexas no filtro, combinando as palavras reservadas:

host orion and not port 21 and not port 20
tcp dst port ftp or ftp-data or domain
tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain

Observação: a página manual do 'pcap-filter' traz toda a sintaxe para o "packet filter".

Exemplos de uso do Tcpdump:

# tcpdump -D

# tcpdump -i eth0 -n -v -c 1000

# tcpdump -i wlan0 -w rede.dump

# tcpdump src or dst host 192.168.1.100 -r rede.dump

# tcpdump -i eth0 src 192.168.110.241 and dst 192.168.110.17 and not port 110

Por padrão, em sua saída, o comando 'tcpdump' exibe uma linha de texto para cada pacote capturado. Esta linha mostra informações do pacote, não é o pacote em si. O pacote fica armazenado apenas no arquivo '.pcap', binário. A saída do Tcpdump depende do protocolo especificado e das opções utilizadas.

Breve descrição dos campos da saída do Tcpdump (pacote TCP):

- timestamp: o horário em que o pacote foi capturado;

- protocolo: ip, ip6, arp, rarp, atalk, aarp, ...;

- origem > destino: endereço e porta da origem e do destino;

- flag: bits de controle ativados no octeto 13 do cabeçalho. Uma combinação de S (SYN), F (FIN), P (PUSH), R (RST), W (ECN CWR), E (ECN-Echo), ou ponto '.' se não há.

Outros campos podem existir dependendo do conteúdo do cabeçalho. Exemplo:

10:09:18.773058 IP 192.168.1.12.44155 > 192.168.1.11.http: Flags [S], cksum 0x10e4 (correct), seq 2019111244, win 5840, options [mss 1460,sackOK,TS val 738741 ecr 0,nop,wscale 6], length 0

Quando o Tcpdump encerra a captura de pacotes, é exibida a contagem de:

- pacotes capturados: número de pacotes recebidos e processados;

- pacotes recebidos pelo filtro: depende do S.O., pode incluir pacotes que não passaram no filtro, ou que passaram mas não foram processados, ou que passaram e foram processados;

- pacotes abandonados pelo kernel: número de pacotes que foram abandonados devido a falta de espaço em buffer.

O sniffer coloca a interface em modo promíscuo, para capturar os pacotes de um determinado segmento de rede. Assim, para o Tcpdump ter permissão de ler os pacotes através de uma interface de rede, o mesmo deve ser executado com privilégios de administrador. Entretanto, ler um arquivo '.pcap', com pacotes salvos, não requer privilégios de administrador.

2 comentários:

  1. Obrigado! uma boa explicação sobre essa poderosa ferramenta!


    Valew!

    ResponderExcluir
  2. Faltou explicar como abrir um determinado pacote. Obrigado.

    ResponderExcluir