Como usar filtros Wireshark no Linux

O Wireshark é um analisador de pacotes de classe mundial disponível no Linux, Windows e macOS. Seus filtros são flexíveis e sofisticados, mas às vezes contra-intuitivos. Vamos explicar as “pegadinhas” que você precisa estar atento.

Análise de pacotes com mordida real

O Wireshark é uma das joias do mundo open-source. É uma ferramenta de software de classe mundial, usada por profissionais e amadores para investigar e diagnosticar problemas de rede. Desenvolvedores de software o utilizam para identificar e caracterizar bugs em rotinas de comunicação. Pesquisadores de segurança o usam para capturar e desfazer atividades maliciosas em uma rede.

Um fluxo de trabalho típico é executar o Wireshark no modo Capture, para que ele registre o tráfego de rede por meio de uma das interfaces de rede no computador. Os pacotes de rede são exibidos em tempo real, à medida que são capturados. No entanto, é na análise pós-captura que os detalhes granulares do que está acontecendo na rede são revelados.

Os pacotes capturados são chamados de rastreamento. Quando a captura for concluída, o rastreamento poderá ser percorrido, pacote por pacote. Você pode inspecionar qualquer pacote nos mínimos detalhes, mapear “conversas” de rede entre dispositivos e usar filtros para incluir (ou excluir) pacotes de sua análise.

Os recursos de filtragem do Wireshark são inigualáveis, com grande flexibilidade e poder de resolução. Existem sutilezas em sua sintaxe que facilitam escrever um filtro e obter um resultado que não atende às suas expectativas.

Se você não entender como os filtros funcionam no Wireshark, você nunca sairá da primeira marcha e acelerará os recursos do software.

Instalando o Wireshark

Quando você instala o Wireshark, é perguntado se alguém usando uma conta não root deve ser capaz de capturar rastros de rede. Dizer não a isso pode ser uma ideia atraente. Você pode não querer que todos possam ver o que está acontecendo na rede. No entanto, instalar o Wireshark para que apenas aqueles com privilégios de root possam usá-lo significa que todos os seus componentes serão executados com permissões elevadas.

O Wireshark contém mais de 2 milhões de linhas de código complicado e interage com seu computador no nível mais baixo. As melhores práticas de segurança recomendam que o mínimo possível de código seja executado com privilégios elevados, especialmente quando estiver operando em um nível tão baixo.

É muito mais seguro executar o Wireshark com uma conta de usuário comum. Ainda podemos restringir quem tem a capacidade de executar o Wireshark. Isso requer algumas etapas extras de configuração, mas é a maneira mais segura de prosseguir. Os elementos de captura de dados do Wireshark ainda serão executados com privilégios elevados, mas o restante do Wireshark será executado como um processo normal.

Para iniciar a instalação no Ubuntu, digite:

sudo apt-get install wireshark

No Fedora, digite:

sudo dnf install wireshark

No Manjaro, use este comando:

sudo pacman -Syu wireshark-qt

Durante a instalação, você verá a tela abaixo, recomendando que você não execute o Wireshark como root. Pressione Tab para mover o destaque vermelho para “” e pressione a barra de espaço.

Na próxima tela, pressione Tab para mover o destaque vermelho para “” e pressione a barra de espaço.

A tela de opções que permite que usuários não root executem o Wireshark, com

Para executar o Wireshark, você deve ser membro do grupo “wireshark”, que é criado durante a instalação. Isso permite que você controle quem pode executar o Wireshark. Qualquer pessoa que não esteja no grupo “wireshark” não pode executar o Wireshark.

  Como instalar o Libre Office no Linux

Para se adicionar ao grupo “Wireshark” use este comando:

sudo usermod -a -G wireshark $USER

Para que sua nova associação ao grupo tenha efeito, você pode sair e entrar novamente ou usar este comando:

newgrp wireshark

Para ver se você está no novo grupo, use o comando groups:

groups

Você deve ver “wireshark” na lista de grupos.

Iniciando o Wireshark

Você pode iniciar o Wireshark com o comando abaixo. O e comercial (&) inicia o Wireshark como uma tarefa em segundo plano, o que significa que você pode continuar usando a janela do terminal. Você pode até fechar a janela do terminal e o Wireshark continuará a ser executado.

Digite o seguinte:

Wireshark &

A interface do Wireshark é exibida. Os dispositivos de interface de rede presentes em seu computador são listados, juntamente com alguns pseudodispositivos integrados.

Uma linha ondulada ao lado de uma interface significa que ela está ativa e o tráfego de rede está passando por ela. Uma linha plana significa que não há atividade na interface. O item principal nesta lista é “enp0s3”, a conexão cabeada para este computador e, como esperado, mostra atividade.

Para iniciar a captura de pacotes, clique com o botão direito do mouse em “enp0s3” e selecione “Iniciar captura” no menu de contexto.

Clique

Você pode definir filtros para reduzir a quantidade de tráfego que o Wireshark captura. Preferimos capturar tudo e filtrar tudo o que não queremos ver ao fazer uma análise. Dessa forma, sabemos que tudo o que aconteceu está no rastro. Você não quer perder inadvertidamente um evento de rede que explica a situação que está investigando devido ao seu filtro de captura.

É claro que, para redes de alto tráfego, os rastreamentos podem rapidamente se tornar muito grandes, portanto, a filtragem na captura faz sentido nesse cenário. Ou talvez você apenas prefira assim.

Observe que a sintaxe para filtros de captura é um pouco diferente do que para monitores.

Os ícones destacados na imagem acima indicam o seguinte, da esquerda para a direita:

Barbatana de tubarão: Se estiver azul, clicar nele iniciará uma captura de pacote. Se o Wireshark estiver capturando pacotes, este ícone ficará cinza.
Quadrado: Se estiver vermelho, clicar nele interromperá uma captura de pacote em execução. Se o Wireshark não estiver capturando pacotes, este ícone ficará cinza.
Barbatana de tubarão com seta circular: Se estiver verde, clicar nele interromperá o rastreamento atualmente em execução. Isso lhe dá a oportunidade de salvar ou descartar os pacotes capturados e reiniciar o rastreamento. Se o Wireshark não estiver capturando pacotes, este ícone ficará cinza.

Analisando o rastreamento

Clicar no ícone do quadrado vermelho interromperá a captura de dados para que você possa analisar os pacotes capturados no rastreamento. Os pacotes são apresentados em ordem de tempo e codificados por cores de acordo com o protocolo do pacote. Os detalhes do pacote destacado são exibidos nos dois painéis inferiores da interface do Wireshark.

Uma maneira simples de facilitar a leitura do rastreamento é fazer com que o Wireshark forneça nomes significativos para os endereços IP de origem e destino dos pacotes. Para fazer isso, clique em Exibir > Resolução de nomes e selecione “Resolver endereços de rede”.

O Wireshark tentará resolver o nome dos dispositivos que enviaram e receberam cada pacote. Ele não será capaz de identificar todos os dispositivos, mas aqueles que puder ajudarão você a ler o rastreamento.

Rolar a tela para a esquerda revelará mais colunas à direita. A coluna de informações mostra qualquer informação que o Wireshark possa detectar do pacote. No exemplo abaixo, vemos algumas solicitações e respostas de ping.

  Os 6 melhores sistemas operacionais Linux para privacidade

Por padrão, o Wireshark exibe todos os pacotes na ordem em que foram rastreados. Muitos dispositivos enviam pacotes simultaneamente. Isso significa que uma única conversa entre dois dispositivos provavelmente terá pacotes de outros entrelaçados entre eles.

Para examinar uma única conversa, você pode isolá-la por protocolo. O protocolo para cada pacote é mostrado na coluna de protocolo. A maioria dos protocolos que você verá pertence à família TCP/IP. Você pode especificar o protocolo exato ou usar Ethernet como uma espécie de catchall.

Clique com o botão direito do mouse em qualquer um dos pacotes na sequência que deseja examinar e clique em Filtro de conversa > Ethernet. No exemplo abaixo, selecionamos um pacote de solicitação de ping.

Ping isolado

A sequência de pacotes é mostrada sem outros entre eles, pois o Wireshark gerou automaticamente um filtro para fazer isso. Ele é exibido na barra de filtro e destacado em verde, o que indica que a sintaxe do filtro está correta.

Para limpar o filtro, clique em “X” na barra de filtro.

Criando seus próprios filtros

Vamos colocar um filtro simples na barra de filtros:

ip.addr == 192.168.4.20

Isso seleciona todos os pacotes que foram enviados ou recebidos pelo dispositivo com endereço IP 192.168.4.20. Observe os sinais de igual duplo (==) sem espaço entre eles.

Para ver os pacotes enviados por um dispositivo (a origem), você pode usar ip.src; para ver os pacotes que chegaram a um dispositivo (o destino), você pode usar ip.dst, conforme mostrado abaixo:

ip.dst == 192.168.4.20 && ip.src == 192.168.4.28

Observe o uso de um e comercial duplo (&&) para indicar o “e” lógico. Este filtro procura por pacotes que chegaram em 192.168.4.20 de 192.168.4.28.

Pessoas novas nos filtros do Wireshark geralmente pensam que um filtro como esse capturará todos os pacotes entre dois endereços IP, mas esse não é o caso.

O que ele realmente faz é filtrar todos os pacotes de ou para o endereço IP 192.168.4.20, independentemente de onde eles vieram ou para onde foram enviados. Ele faz o mesmo com todos os pacotes do endereço IP 192.168.4.28. Para simplificar, ele filtra todo o tráfego de ou para qualquer endereço IP.

Você também pode procurar atividade em outros protocolos. Por exemplo, você pode digitar este filtro para procurar solicitações HTTP:

http.request

Para excluir pacotes que vieram ou foram enviados para um dispositivo, use um ponto de exclamação (!) e coloque o filtro entre parênteses [()]:

!(ip.addr == 192.168.4.14)

Este filtro exclui todos os pacotes enviados para ou de 192.168.4.14.

É contra-intuitivo porque o filtro contém o operador de igualdade (==). Você pode ter esperado que digitaria este filtro assim:

ip.addr !=192.168.4.14

No entanto, isso não vai funcionar.

Você também pode pesquisar strings dentro de pacotes, por protocolo. Este filtro procura protocolo de Controle de Transmissão (TCP) pacotes que contêm a string “youtube”:

tcp contains youtube

Um filtro que procura retransmissão é útil como forma de verificar se há um problema de conectividade. Retransmissões são pacotes que são reenviados porque foram danificados ou perdidos durante a transmissão inicial. Muitas retransmissões indicam uma conexão lenta ou um dispositivo que demora a responder.

Digite o seguinte:

tcp.analysis.retransmission

Nascimento, Vida, Morte e Criptografia

Uma conexão de rede entre dois dispositivos é iniciada sempre que um entra em contato com o outro e envia um pacote SYN (sincronizar). O dispositivo receptor então envia um pacote ACK (reconhecimento). Indica se aceitará a conexão enviando um pacote SYN.

  Como configurar um arquivo de troca no Linux

SYN e ACK são, na verdade, dois sinalizadores no mesmo pacote. O dispositivo original reconhece o SYN enviando um ACK e, em seguida, os dispositivos estabelecem uma conexão de rede.

Isso é chamado de handshake de três vias:

A -> SYN -> B

A  ACK -> B

Na captura de tela abaixo, alguém no computador “nostromo.local” faz uma Capsula segura (SSH) conexão ao computador “ubuntu20-04.local.” O handshake de três vias é a primeira parte da comunicação entre os dois computadores. Observe que as duas linhas que contêm os pacotes SYN são codificadas por cores em cinza escuro.

Rolar a tela para mostrar as colunas à direita revela os pacotes de handshake SYN , SYN/ACK e ACK.

Você notará que o intercâmbio de pacotes entre os dois computadores alterna entre os protocolos TCP e SSH. Os pacotes de dados são passados ​​através da conexão SSH criptografada, mas os pacotes de mensagens (como ACK) são enviados via TCP. Em breve filtraremos os pacotes TCP.

Quando a conexão de rede não é mais necessária, ela é descartada. A sequência de pacotes para interromper uma conexão de rede é um handshake de quatro vias.

Um lado envia um pacote FIN (finalização). A outra extremidade envia um ACK para reconhecer o FIN e, em seguida, também envia um FIN para indicar que concorda que a conexão deve ser interrompida. O primeiro lado envia um ACK para o FIN que acabou de receber e a conexão de rede é então desfeita.

Veja como é o aperto de mão de quatro vias:

A -> FIN -> B

A  ACK -> B

Às vezes, o FIN original pega carona em um pacote ACK que seria enviado de qualquer maneira, conforme mostrado abaixo:

A -> FIN, ACK -> B

A  ACK -> B

É o que acontece neste exemplo.

Se quisermos ver apenas o tráfego SSH dessa conversa, podemos usar um filtro que especifique esse protocolo. Digitamos o seguinte para ver todo o tráfego usando o protocolo SSH de e para o computador remoto:

ip.addr == 192.168.4.25 && ssh

Isso filtra tudo, exceto o tráfego SSH de e para 192.168.4.25.

Outros modelos de filtro úteis

Quando você estiver digitando um filtro na barra de filtro, ele permanecerá vermelho até que o filtro esteja sintaticamente correto. Ele ficará verde quando o filtro estiver correto e completo.

Se você digitar um protocolo, como tcp, ip, udp ou shh, seguido por um ponto (.), um menu será exibido. Ele listará os filtros recentes que continham esse protocolo e todos os campos que podem ser usados ​​em filtros para esse nome de protocolo.

Por exemplo, com ip, você pode usar ip.addr, ip.checksum, ip.src, ip.dst, ip.id, ip.host e dezenas de outros.

Use os seguintes modelos de filtro como base de seus filtros:

Para mostrar apenas pacotes de protocolo HTTP: http
Para mostrar apenas pacotes de protocolo DNS: dns
Para mostrar apenas pacotes TCP com 4000 como porta de origem ou destino: tcp.port==4000
Para exibir todos os pacotes de redefinição TCP: http.request
Para filtrar pacotes ARP, ICMP e DNS: !(arp ou icmp ou dns)
Para exibir todas as retransmissões em um rastreamento: tcp.analysis.retransmission
Para filtrar sinalizadores (como SYN ou FIN): Você deve definir um valor de comparação para estes: 1 significa que o sinalizador está definido e 0 significa que não está. Então, um exemplo seria: tcp.flags.syn == 1.

Cobrimos alguns dos princípios orientadores e usos fundamentais dos filtros de exibição aqui, mas, é claro, há muito mais.

Para apreciar todo o escopo e poder dos filtros Wireshark, não deixe de conferir sua referência online.