TCPDUMP Crash Course
O TCPDUMP é uma ferramenta de captura e análise de pacotes usada para fazer troubleshooting de rede. Ele usa a LIBCAP para fazer isso.
A ideia aqui é fazer um crash course dessa ferramenta.
Um Crash Course é um tipo de “curso rápido” sobre um determinado assunto, indo direto ao ponto de forma mais objetiva possível.
Quando devo usar o tcpdump?
Sempre que você precisar verificar alguma coisa em nível de rede, seguem algumas perguntas que o TCPDUMP pode ajudar a responder:
- A máquina X está chega no servidor Y ?
- A máquina X está conseguindo resolver DNS ?
- A máquina X está conseguindo resolver NTP ?
- Os clientes estã chegando na Máquina X e porta Y ?
Essa são as perguntas mais básicas que o TCPDUMP pode responder para você.
Para quem foi feito esse post?
Aqui o foco está nas pessoas atuando nas posições abaixo:
- Sysadmin;
- Cloud Native Engineer;
- Cloud Engineer;
- DevOps Engineer;
- Plataform Engineer;
- GitOps Engineer.
Momento Merchan :P
Me siga no twitter @gutocarvalho e acompanhe meus posts sobre Cloud Native e CI/CD.
Aproveite e siga a CD Foundation e Cloud Native Foundation no twitter.
Colaboradores
Pessoas que colaboraram com o texto.
- Julia Lamenza (@jlamenza)
- João (@P0ssuidao)
- Rafael Gomex (@gomex)
- Rafael Silva (@rafaotetra)
TCPDUMP Crash Course
instalando no mac
$ brew install tcpdump
detectando recursos disponíveis no sistema
Listando interfaces
$ tcpdump -D
Listando data-link types suportados no sistema
$ tcpdump -L
capturando pacotes de interfaces
Capturando tráfego de todas as interfaces
$ tcpdump -i any
Capturando tráfego de uma interface específica
$ tcpdump -i en0
Capturando tráfego de uma interface específica sem resolver nomes
$ tcpdump -n -i en0
Capturando tráfego de uma interface específica sem resolver nomes ou fazer checksums TCP
$ tcpdump -n -K -i en0
Capturando tráfego de uma interface específica sem resolver nomes e fazer lookups
$ tcpdump -nn -i en0
Capturando tráfego de uma interface específica mostrando o mac address
$ tcpdump -e -i en0
Capturando tráfego de uma interface específica sem ativar o modo promíscuo, ou seja você apenas verá pacotes PARA ou DE seu computador.
$ tcpdump -p -i en0
trabalhando com arquivos
Capturando tráfego de uma interface específica e jogando saída para um arquivo
$ tcpdump -i eth0 -w tcpdump.txt
Limitando a captura em 10.000 pacotes para não encher seu disco
$ tcpdump -i eth0 -c 10000 -w tcpdump.txt
Lendo pacotes de um arquivo (replay)
$ tcpdump -i eth0 -r tcpdump.txt
capturando pacotes de hosts e redes específicos
Capturando tráfego de um host específico
$ tcpdump host 192.168.222.1
Capturando tráfego de uma rede específica
$ tcpdump net 192.168.222.0/24
capturando pacotes de endereços mac específicos
Capturando pacotes com origem no endereço mac e8:2b:88:ef:55:11
$ tcpdump ether src e8:2b:88:ef:55:11
Capturando pacotes com destino ao endereço mac e8:2b:88:ef:55:11
$ tcpdump ether dst e8:2b:88:ef:55:11
Capturando pacotes enviados ou recebidos pelo mac e8:2b:88:ef:55:11
$ tcpdump ether host e8:2b:88:ef:55:11
capturando pacotes de origem e destino
Capturando tráfego de uma origem específica
$ tcpdump src 200.150.204.87
Capturando tráfego para um destino específico
$ tcpdump dst 200.150.204.87
capturando pacotes de serviços e portas
Capturando tráfego de um serviço específico
$ tcpdump http
Capturando tráfego de uma porta específica
$ tcpdump port 80
Capturando tráfego de um range de portas
$ tcpdump portrange 8001-8009
capturando pacotes de protocolos específicos
Capturando apenas pacotes IPv4
$ tcpdump ip
Capturando apenas pacotes IPv6
$ tcpdump ipv6
Capturando apenas pacotes TCP
$ tcpdump tcp
Capturando apenas pacotes UDP
$ tcpdump udp
Capturando apenas pacotes ICMP
$ tcpdump icmp
Capturando apenas pacotes ARP
$ tcpdump arp
capturando pacotes em quantidades específicas
Capturando os primeiros 100 pacotes TCP
$ tcpdump -c 100 tcp
capturando pacotes de tamanhos específicos
Capturando pacotes maiores do que 200 bytes
$ sudo tcpdump greater 200
Capturando pacotes menores do que 200 bytes
$ sudo tcpdump less 200
capturando pacotes usando expressões lógicas no filtro
Capturando pacotes com origem no IP 192.168.222.1 e destino na porta 8005 (AND)
$ tcpdump -n -i en0 src 192.168.222.1 and dst port 8005
Capturando pacotes da porta 8001 ou 8005 da interface eth0 (OR)
$ tcpdump -n -i en0 port 8001 or port 8005
Capturando pacotes da interface eth0 com exceção da porta 22 (NOT)
$ tcpdump -n -i en0 not port 22
Capturando pacotes de origem a rede 10.10.0.0/24 e destino rede 192.169.100.0/24 (AND)
$ tcpdump src net 10.10.0.0/24 and dst net 192.168.100.0/24
Capturando pacotes de duas redes específicas (AND)
$ tcpdump net 10.10.0.0/24 and net 192.168.100.0/24
Capturando pacotes tcp entre dois hosts específicos (AND)
$ tcpdump tcp and host 10.10.0.1 and host 192.168.100.54
Capturando pacotes maiores ou igual a 32 bytes (GREATER)
$ tcpdump tcp >= 32
Capturando pacotes menores ou igual a 32 bytes (LESS)
$ tcpdump tcp <= 32
quais as expressões lógicas disponíveis?
Negation : ! or "not" (without the quotes)
Concatanate : && or "and"
Alternate : || or "or"
quais os operadores disponíveis?
> : greater
< : lower
>= : greater or equal
<= : lower or equal
= : equal
!= : different
veja alguns exemplos de composição lógica múltipla
Essa regra vai casar com tráfego na porta 80 com host 192.168.222.254 ou 192.168.222.200
$ tcpdump '((tcp) and (port 80) and ((dst host 192.168.222.254) or (dst host 192.168.222.200)))'
Essa regra vai casar com qualquer tráfego ICMP envolvendo os destinos 00:01:02:03:04:05.
$ tcpdump '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
Essa regra vai filtrar tráfego para a rede de destino 192.168 com exceção do host 192.168.222.200
$ tcpdump '((tcp) and ((dst net 192.168) and (not dst host 192.168.222.200)))'
capturando flags de pacotes TCP
Isolando apenas flags RST do protocolo TCP
$ tcpdump 'tcp[tcpflags] == tcp-rst'
Isolando apenas flags SYN e ACK do protocolo TCP
$ tcpdump 'tcp[tcpflags] == tcp-syn' and 'tcp[tcpflags] == tcp-ack'
Isolando apenas flags FIN do protocolo TCP
$ tcpdump 'tcp[tcpflags] == tcp-fin'
capturando informações do protocolo HTTP
Essa captura vai mostrar os requests e conteúdos dos pacotes HTTP
$tcpdump -A -i en0 http
Capturando o user agent
$ tcpdump -vvAls0 | grep 'User-Agent:'
Capturando requisições do tipo GET
$ tcpdump -vvAls0 | grep 'GET'
Capturando requisições do tipo POST
$ tcpdump -vvAls0 | grep 'POST'
Capturando HTTP HEADERS
$ tcpdump -vvAls0 | grep 'Host:'
Capturando HTTP COOKIES
$ tcpdump -vvAls0 | grep 'Set-Cookie|Host:|Cookie:'
capturando infos específicas de protocolos diversos
Buscando tráfego SSH independente da porta que estiver rodando
$ tcpdump 'tcp[(tcp[12]>>2):4] = 0x5353482D'
Buscando tráfego de DNS
$ tcpdump -vvAs0 port 53
Buscando tráfego NTP
$ tcpdump -vvAs0 port 123
capturando senhas clear-text
Aqui vamos pegar senhas clear-text em diversos protocolos
$ tcpdump port http or port ftp or port smtp or port imap or port pop3 or port telnet -lA | egrep -i -B5 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd= |password=|pass:|user:|username:|password:|login:|pass |user '
configurando timestamp da captura de pacotes
Capturando pacotes sem mostrar timestamp
$ tcpdump -i en0 -t
Capturando pacotes com timestamp com nano-resolution
$ tcpdump --time-stamp-precision nano
Capturando pacotes com timestamp em formato unix epoc (seconds since January 1, 1970)
$ tcpdump -tt
Capturando pacotes com timestamp usando horas, minutos, segundos e microsegundos
$ tcpdump -tttt
configurando nível de ruído na captura de pacotes
Mostrando menos detalhes (quite mode)
$ tcpdump -i en0 -q
Modo verboso inicial
$ tcpdump -i en0 -v
Modo um pouco mais verboso
$ tcpdump -i en0 -vv
Modo mais verboso possível no tcpdump
$ tcpdump -i en0 -vvv
configurando os formatos de saída da captura
Definindo a saída em formato ASCII
$ tcpdump -i en0 -A
Definindo a saída em formato HEX
$ tcpdump -i en0 -x
tcpdump colorido, tem como?
Dá para fazer, vamos instalar o CCZE para ajudar
$ brew install ccze
Agora vamos usar ele assim
$ tpcdump -i en0 | ccze -A
Pronto, saída colorida bem fácil de ler!
quer saber mais?
Para saber mais veja o help do comando
$ tcpdump --help
Para ir além acesse a manpage
$ man tcpdump
qual o meu comando do dia a dia?
Use essa combinação para ver uma saída bastante verbosa, sem resolução de nomes ou portas e mostrando timestamp o mais human-readble possível.
$ tcpdump -ttttnnvvS
Amarrando as pontas
Esse post é uma tentativa de dar um norte ou um caminho para fazer um bom troubleshooting de redes usando o tcpdump.
Volte aqui sempre que precisar :)
Aquele abraço!
Mando aquele abraço para o professor MESTRE Ulysses Almeida (@ulyssesalmeida) que me ensinou a usar o TCPDUMP lá no início do século.
Mando aquele abraço pro @gomex e @badtux que via exemplo me fazem contribuir mais e mais e mais :)
Mando aquele abraço para todos que leram, comentaram, revisaram e contribuiram de alguma forma com esse post!
Este post é do tipo #Mindnodes, entenda aqui.
Se gostou manda um alo no twitter @gutocarvalho ou deixa um comentário bacana :)
Refs
- https://www.tcpdump.org
- https://jvns.ca/tcpdump-zine.pdf
- https://danielmiessler.com/study/tcpdump/
- https://packetlife.net/media/library/12/tcpdump.pdf
- https://www.xmodulo.com/tcpdump-cheat-sheet-examples.html
- https://www.comparitech.com/net-admin/tcpdump-cheat-sheet
- https://blog.wains.be/2007/2007-10-01-tcpdump-advanced-filters
- https://gist.github.com/jforge/27962c52223ea9b8003b22b8189d93fb
[s]
Guto