Wireshark é a minha ferramenta de preferência para troubleshooting. Há quem pense nela só no final da luta mas comigo está sempre no topo da lista.
Recentemente tive que olhar para um problema de uma aplicação de vendas em que os utilizadores reportavam como “estando lenta”. A aplicação foi desenvolvida in-house, não utilizava nenhum dos protocolos de aplicação conhecidos como HTTP, FTP e não era encriptada. No meio de tantas transacções e uma loja em funcionamento, como encontrar a conexão TCP com a transacção a analisar?
A solução
O operador “contains” pode ser utilizado para encontrar texto ou caracteres hexadecimais directamente no nome do protocolo ao invés de campos específicos como nos filtros http.host ou dns.qry.name.
- frame contains “texto”: procura a string em todo o conteúdo de dados da frame, independentemente do ser IP, IPv6, UDP, TCP ou qualquer outro protocolo superior à camada 2.
- ip contains “texto”: Procura a string no conteúdo de qualquer pacote IP, independentemente do protocolo de transporte.
- udp contains “texto” ou tcp contains “texto”: A esta algura acho que já perceberam.
Com o conhecimento destes filtros, tudo que era preciso era alguma referência da transacção a consultar. No caso era um código numérico que identificava o cliente. Depois de aplicado o filtro, todos os pacotes que envolviam a transacção foram filtrados e foi possível analisar os tempos de resposta da aplicação.
Vai um exemplo?
Sim! Nada melhor que um exemplo para perceber. Não posso publicar o caso específico de que falei acima, mas suponhamos que faço uma captura no meu computador e que no meio dos milhares pacotes queira encontrar a sequência que me leva a abrir o site www.disney.com.
Na caixa de filtros, utilizei “ip contains “disney”“… e a magia acontece!
Surpreendentemente, até comunicação TLS foi filtrada. Porquê? Porque algures no interior do pacote existe a palavra disney.
Um exemplo não chega! Para o segundo exemplo, pretendo encontrar a conexão TCP usada para enviar um ficheiro para um servidor FTP. O ficheiro usado é o “post.txt” cujo conteúdo é uma única linha com o texto “Angola 1 2 3”
Começo a captura no wireshark (sem filtros de captura), estabeleço a ligação FTP e faço 2 transferências, numa envio o ficheiro para o servidor e na outra faço o download do mesmo ficheiro.
Para encontrar os pacotes destas transferências, poderia utilizar o filtro para procurar o nome do ficheiro, mas preferi ir mais longe e procurar pelo conteúdo do ficheiro com o filtro tcp contains “Angola”
O resultado foi o esperado. Foram encontrados 2 pacotes com a palavra “Angola”, um enviando o ficheiro para o servidor o outro no sentido inverso.
Os exemplos foram feitos com o Wireshark 2, mas estes filtros funcionam também na versão anterior, 1.x.
Não chega?
Se o simples texto para si não chega, pode substituir o operador “contains” por “matches” e filtrar tráfego com regular expressions.
Breve nota fora do tópico
O último exemplo chamou a atenção da importância da encriptação da comunicação e dos dados. Na captura, era possível ver não só o nome do ficheiro e o conteúdo mas também o username e password usado para aceder ao servidor. Eu fiz a captura directamente no meu computador mas qualquer administrador com acesso à infraestrutura pode fazer capturas de tráfego ao longo do caminho e examinar o conteúdo. Cuidem-se!
——
https://www.wireshark.org/docs/man-pages/wireshark-filter.html