Linux – Conhecendo e usando tcpdump e wireshark

Vamos nos divertir bastante neste artigo, porque veremos como analisar pacotes da rede, não só no Linux, mas conseguiremos facilmente ver dados em redes com servidores Linux, terminais Linux, placas embarcadas com Linux, microcontroladores e até vindo ou indo para computadores ou dispositivos com Windows e afins que usam diversos protocolos, como UDP e TCP por exemplo.

Aqui vamos usar uma ferramenta poderosa chamada TCPdump e ver como é fácil entender o modelo OSI e os pacotes da rede, então, vamos lá.

No decorrer dos tópicos estarei usando três ferramentas, o TCPdump, WireShark e o tshark. O tshark vou usar mais pra frente apenas como alternativa para facilitar criação de filtros, o foco é o tcpdump e Wireshark, com o tcpdump irei capturar os pacotes que desejo e com o Wireshark irei usar para visualizar de uma maneira mais amigável os pacotes capturados e salvos.

Vou começar bem tranquilo para conhecermos a ferramenta, mas a idéia é ir progredindo e analisarmos vários protocolos e serviços além de aplicar em embarcados, nesta série que começa agora.

 

 

Preparando o ambiente

 

Sem mais delongas, um pré-requisito para estes artigos é um computador com Linux, o que estarei usando é um Linux Mint, o nome dos pacotes é o mesmo o que irá muda será o gerenciador de pacotes.

$ sudo apt-get update
$ sudo apt-cache search '^tcpdump$|^wireshark$|^tshark$'
tcpdump - command-line network traffic analyzer
tshark - network traffic analyser - console version
wireshark - network traffic analyser - GTK+ version

Instalando:

$ sudo apt-get install tcpdump tshart wireshark

 

 

Protocolo ICMP

 

O ICMP (Internet Control Message Protocol) é o protocolo que estudaremos nesta primeira etapa, pelo nome alguns podem não conhecer, mas tenho certeza que já usaram, sem saber! Usado para diagnostico e relatório de erros em uma rede e seu principal aliado para isso é o comando ping, tanto em Linux quanto em Windows.

O Ping nada mais é que um cara que formata o ICMP mais legível e fornece alguns recursos a mais, e diferente do ICMP que esta na Camada 3 (Rede).

Já deu pra perceber então que vamos executar um ping para algum host e capturar os pacotes.

Vale a pena conhecer e estudar todos os aspectos deste protocolo, aqui o que precisamos saber é o tipo 0 (Echo Reply) e o tipo 8 (Echo Request), onde o tipo 0 é quando obtemos o retorno do pacote e o 8 quando enviamos.

Mais detalhes acesse o RFC792.

 

 

Pratica

 

O meu computador possui o IP 192.168.0.67 o computador para qual irei executar o ping é o IP 192.168.0.6.

Vamos executar o tcpdump para capturar qualquer pacote que tiver o IP 192.168.0.6 envolvido, como destino ou origem.

Sintaxe: tcpdump -i INTERFACE host IP_TARGET

$ sudo tcpdump -i wlan0 host 192.168.0.6
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes
15:15:08.185127 IP 192.168.0.67 > 192.168.0.6: ICMP echo request, id 3874, seq 1, length 64
15:15:08.188596 IP 192.168.0.6 > 192.168.0.67: ICMP echo reply, id 3874, seq 1, length 64
15:15:09.186897 IP 192.168.0.67 > 192.168.0.6: ICMP echo request, id 3874, seq 2, length 64
15:15:09.190384 IP 192.168.0.6 > 192.168.0.67: ICMP echo reply, id 3874, seq 2, length 64
^C
4 packets captured
4 packets received by filter
0 packets dropped by kernel

Foi fácil saber que minha interface de rede é a wireless (wlan0) e o IP é o 192.168.0.6 conforme comentei, certo?

A tela acima irá ficar parada, só após executar o comando ping é que os pacotes irão aparecer como acima, após isso pode pressionar Ctrl+C para sair, mas como queremos salvar os pacotes em um arquivo para poder analisar no Wireshark, então vamos executar a mesma linha com a flag -w, podemos adicionar -vv para um modo mais detalhad (verbose).

$ sudo tcpdump -vv -i wlan0 host 192.168.0.6 -w /tmp/salvando_pacotes_ping.pcap
tcpdump: listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes
Got 4
^C
4 packets captured
4 packets received by filter
0 packets dropped by kernel

E agora vamos executar o ping para o IP 192.168.0.6, enviar apenas 2 pacotes e pressionar Ctrl+C para finalizar a captura.

$ ping -c 2 192.168.0.6
PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.
64 bytes from 192.168.0.6: icmp_seq=1 ttl=64 time=3.57 ms
64 bytes from 192.168.0.6: icmp_seq=2 ttl=64 time=3.68 ms

--- 192.168.0.6 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 3.574/4.283/4.993/0.712 ms

Desta maneira, qualquer pacote indo/vindo do IP 192.168.0.6 seria capturado pelo tcpdump e salvo no arquivo /tmp/savando_pacotes_ping.pcap, mas como não tem nada nesta VM, só irá capturar o pacote ICMP, quando o Target possui vários serviços e requisições criamos filtros para conseguir capturar e realizar analises, não se preocupe iremos fazer isso em um post futuro.

 

 

Analisando com Wireshark

 

Como dito, para facilitar a didática irei usar o Wireshark para visualizar os pacotes capturados, abra o Wireshark pelo terminal digitando wireshark ou abrindo o aplicativo Wireshark. Em seguida, vá em File > Open e selecione o arquivo /tmp/salvando_pacotes_ping.pcap, e ficara como a Figura01.

Figura01 - Tela inicial tcpdump com arquivo .pcap aberto
Figura01 – Tela inicial tcpdump com arquivo .pcap aberto

Vamos visualizar a Figura02 e ver o que podemos extrair de informação.

Figura02 - Wireshark com arquivo .pcap carregado
Figura02 – Wireshark com arquivo .pcap carregado

No quadro laranja da Figura02, temos os pacotes capturados e suas devidas informações como Sequencia, Tempo, IP origem, IP destino, Protocolo, Tamanho e informações adicionais. Então o comando ping partiu de 192.168.0.67 para o 192.168.0.6, foi um ICMP e do tipo Request, a volta foi do IP 192.168.0.6 para o 192.168.0.67 e do tipo Reply.

No quadro abaixo, tem as informações do frame completo, que possui 98 bytes e vamos ver como chegou a esse numero, e informações da Camada 2 (L2) [Ethernet II], e logo em seguida na Camada 3 ficando o IPv4 e o ICMP (L3).

E por ultimo, no quadro seguinte o frame inteiro, com todos os “dados” do pacote contendo todos os cabeçalhos (Ethernet Header, IP Header e ICMP Header) e os Payloads.

 

 

Desmontando o pacote

 

Com alguns quadros e dados que obtivemos vou montar todo o pacote e explicar cada campo e etapa, vamos ver como seria o frame como um todo, na Figura03.

Figura03 - Frame
Figura03 – Frame

Vamos começar pela Camada 2 (L2) ou também conhecida como camada de enlace, o seu cabeçalho é pequeno com apenas 14 bytes, chamada de Ethernet II Header, vamos ver o que tem nele.

Figura04 - Ethernet Header
Figura04 – Ethernet Header

Na Figura04, expandi a informação do item Ethernet II e deixei selecionado o que ele representa no frame, podemos ver que o Ethernet Header deve possuir o endereço MAC do destinatário[6 bytes], endereço MAC da origem[6 bytes] e um tipo, este tipo (EtherType [2 bytes]) é o que diz se é IPv4, ARP, IPv6, VLan e outros demais tipos que podem ser verificados na Standards IEEE EtherType.

Então, ficaria conforme a Figura05.

Figura05 - Ethernet II Header preenchido
Figura05 – Ethernet II Header preenchido

Legal, vamos prosseguir, agora vamos para a próxima camada, subir para a Camada 3 (L3) ou a camada de rede, vamos novamente expandir o pacote no Wireshark como podemos ver na Figura06.

 

Figura06 - IP Header do pacote
Figura06 – IP Header do pacote

Vamos ver como fica organizado o IP Header e o Payload neste caso.

Figura07 - IP Header e Payload
Figura07 – IP Header e Payload

Então no frame IP temos 20 bytes de cabeçalho (Header) e 46 a 1500 bytes de Payload, vamos dar um overview no IP Header, conforme a Figura08.

Figura08 - IP Header
Figura08 – IP Header

O IP Header possui 20 bytes, estes campos possuem informações importantes, abaixo cada opção e um resumo breve.

 

Version Versão, 4 para IPv4, usa apenas os 4 primeiros bits
Header Lenght IHL (Internet Header Length), o tamanho do header = [5] x 32 = 20 bytes
DSF Tambem chamada de ToS, para classificar a prioridade do trafego do pacote
Total Length Tamanho total IP Header + Payload
Identification Identificar fragmentos RFC6864
Flags Identificar e controlar framentos
Fragments Pode determinar o local do fragmento do pacote IP
TTL Time To Live, ou o tempo de vida do pacote
Protocol Tipo do protocolo (ICMP, TCP, UDP e outros mais)
Checksum Checksum do frame IP
Source IP IP de origem do pacote
Destination IP IP de destino do pacote

 

Para mais detalhes veja a definição do IP Packet no Wikipédia, uma fonte para obter o número dos tipos de protocolos IP é o IANA Protocol Numbers.

O que fiz então foi pegar as informações do cabeçalho IP da Figura06 e preencher nos campos da Figura08. A matemática já começa a fazer sentido, se o Total Length esta dizendo 84 bytes, e nosso IP Header possui 20 bytes, então nosso IP Payload irá possui no total 64 bytes.

Essa era a parte mais complexa, agora vamos ver o IP Payload que ainda fica na Camada 3, mas agora vamos ver o ICMP Header e ICMP Payload.

Figura10 - IP Payload
Figura10 – IP Payload

Na Figura09, temos o Data representando nosso IP Payload da Figura03, e na Figura10 o ICMP Header do Wireshark expandido.

 

Figura10 - Wireshark e o ICMP Header
Figura10 – Wireshark e o ICMP Header

Vamos dar um overview no ICMP Header, suas opções e os campos preenchidos conforme os dados capturados e visualizados na Figura11.

tcpdump_ICMP_header_cleitonbueno.com
Figura11 – ICMP Header do pacote

Para facilitar o entendimento, segue os campos e uma pequena descrição na tabela abaixo.

Type Tipos dos pacotes ICMP, usaremos 0 e 8
Code Codigo para indicar o motivo de perda de um pacote
Checksum Checagem do pacote para integridade
Identifier Identificação
Sequence Number Número sequência dos pacotes
Timestamp Timestamp do pacote, este é um campo de 8 bytes (Faltou na Figura11)

 

Certo, voltando a nossa matemática, e o que vimos até agora:

Vimos que ele terá 84 bytes.

IP Header possui 20 bytes

ICMP Header possui 16 bytes

Sobram 48 bytes para o ICMP Data.

Vamos verificar o campo Data do ICMP capturado  e visualizado no Wireshark na Figura10. Temos os 48 bytes!

Então o quadro final seria da Figura12.

tcpdump_ICMP_payload
Figura12 – ICMP Payload do pacote

 

E agora, verifique no comando ping que realizamos no começo do post, olhe na primeira linha após o comando, ele mostra o tamanho do pacote, no caso 84 bytes.

PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.

Toda matemática faz sentido, 84 bytes do pacote, na Figura02 o Wireshark mostra que o Frame possui 98 bytes, porque esta usando 84 bytes do IP + ICMP + Ethernet II totalizando 98 bytes.

Outro dado que conseguimos com isso são os 64 bytes que o ping mostra em cada linha, que na verdade são os 48 bytes dos dados + 16 bytes do cabeçalho, então na verdade, é soma de ICMP Header + ICMP Data.

64 bytes from 192.168.0.6: icmp_seq=1 ttl=64 time=3.57 ms

Você percebe na linha acima, de onde saíram todas estas informações de tempo, TTL, sequencia, IP e o tamanho.

O post ficou extenso, mas fiz o mais detalhado possível e tenho certeza que muitos não viram algo assim em matérias de redes em universidades e muitas vezes não imaginava que um simples pacote ICMP de um ping possui tudo isso de informação.

E aguardem que mais analises e estudo de protocolo que vem por ae.

Espero que tenham gostado, até a próxima!

 

 

Referências

http://www.tcpdump.org/

https://www.wireshark.org/

https://www.wireshark.org/docs/man-pages/tshark.html

https://pt.wikipedia.org/wiki/Internet_Control_Message_Protocol

https://pt.wikipedia.org/wiki/Ping

https://en.wikipedia.org/wiki/IPv4

http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml

https://tools.ietf.org/html/rfc792

Share Button

CC BY-NC-SA 4.0 Linux – Conhecendo e usando tcpdump e wireshark by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.