Guía rápida y básica de captura de paquetes con TCPDUMP

Interfaces que pueden ser utilizadas por tcpdump.

tcpdump -D
tcpdump -L # Muestra los tipos de enlace de datos disponibles para la interfaz.

No utilizar el modo promiscuo.

tcpdump -p

Escuchar en un interfaz en concreto o en todas.

tcpdump -i eth0
tcpdump -i any

Modo descriptivo (verbose): Hay tres niveles.

tcpdump -v
tcpdump -vv
tcpdump -vvv

Poco descriptivo (menos descriptivo que por defecto).

tcpdump -q

Mostrar paquetes en ASCII.

tcpdump -i eth0 -A

Mostrar las cabeceras del enlace.

tcpdump -e -i eth0

Modo descriptivo + Paquetes en hexadecimal + ASCII (sin incluir cabeceras).

tcpdump -v -X  # Sin incluir cabeceras.
tcpdump -v -XX # Incluyendo cabeceras.

Fechas de la capturas de tráfico de red.

tcpdump -tttt -i eth1    # Fechas de la capturas de paquetes comprensibles.
tcpdump -t -i eth1       # Evita el uso de marcas de tiempo.

Limitar la captura a un número de paquetes específico, ej. 100 paquetes.

tcpdump -c 100

Guardar la captura de tráfico en un fichero .cap / rotar fichero .cap cada X tiempo / tamaño.

tcpdump -w capture.cap
tcpdump -w 'trace_%Y-%m-%d_%H:%M:%S.pcap' -G 60 -z gzip # Rota el fichero .cap cada minuto y comprime (optativo) con gzip (se puede usar bzip).
tcpdump -ni eth0 -s65535 -C 100 -w captura              # Cada 100Mb rota el fichero (captura1, captura2,..)

Guardar la captura en un fichero .cap mostrando cuantos paquetes son capturados.

tcpdump -v -w capture.cap

Mostrar paquetes de una captura en fichero .cap.

tcpdump -r capture.cap
tcpdump -vvv -r capture.cap  # Mostrando el máximo detalle.
tcpdump -tttt -r capture.cap # Mostrando las fechas de forma comprensible.

Mostrar dirección IP y puerto en vez del dominio y nombre de protocolo mientras se captura tráfico. (Se usará frecuentemente en siguientes comandos).

tcpdump -n
tcpdump -nn # Puede ser obligatorio en algunos sistemas

Filtrar por dirección ip (host) / rangos (net) destino, origen y destino + origen. (Mostrando ip + puerto con -n)

tcpdump -n host 192.168.1.1        # IP Origen + IP Destino (Tráfico entrante y saliente).
tcpdump -n dst 192.168.1.1         # IP Destino.
tcpdump -n src 192.168.1.1         # IP Origen.
tcpdump -n dst net 192.168.1.0/24  # IPs destino en el rango Rango 192.168.1.0/24

Filtrar por puerto / tipo de puerto / rango de puertos origen, destino, origen + destino. (Mostrando IP y puerto).

tcpdump -n dst port 23               # Puerto destino 23.
tcpdump -n src not port 54563        # Todos los puertos origen que no sean el 54563
tcpdump -n dst portrange 1-1023      # Rango de puertos 1-1023.
tcpdump -n tcp src portrange 1-1023  # Paquetes TCP con puertos origen entre el 1 y 1023.
tcpdump -n udp portrange 1-1023      # Todo paquete entrante o saliente con puertos entre 1-1023.

Capturar cualquier paquete con destino 192.168.1.1:23. (Mostrando IP y puerto).

tcpdump -n "dst host 192.168.1.1 and dst port 23"

Capturar paquetes con IP destino 192.168.1.1 y puerto 80 o 443.

tcpdump -n "dst host 192.168.1.1 and (dst port 80 or dst port 443)"

Capturar tráfico ICMP.

tcpdump -v icmp

Capturar paquetes arp.

tcpdump -v arp

Capturar paquetes ARP o ICMP.

tcpdump -v "icmp or arp"

Capturar paquetes broadcast o multicast.

tcpdump -n "broadcast or multicast"

Capturar 500 bytes de datos por cada paquete en vez de 68 bytes (por defecto).

tcpdump -s 500

Capturar todos los bytes de datos que formen los paquetes.

tcpdump -s 0

Capturar tráfico filtrando por tamaño del paquete.

tcpdump -w captura.pcap  less 1024   # Captura paquetes con un tamaño menor a 1024 bytes.
tcpdump -w captura.pcap greater 1024 # Captura paquetes con un tamaño mayor a 1024 bytes.

Comandos útiles.

Ver peticiones HTTP enviando los datos binarios mediante “-l” y una tubería a “strings”.

tcpdump -l -s0 tcp dst port 80 -w - | strings
tcpdump -l -s0 tcp dst port 80 -w - | strings| grep 'POST\|Host' # Filtrando peticiones POST.
tcpdump -q -A -n -l -s0 tcp dst port 80 | grep GET |             # Otra manera de conseguir lo mismo.
 
# Capturar 1000 paquetes y mostrar por orden las direcciones IPs que más tráfico generan.
tcpdump -tnn -c 1000 -i enp2s0  | awk -F "." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | awk ' $1 > 10 '
 
# Lista las IPs una por linea que están conectando al host.
tcpdump -i enp2s0 -n ip | awk '{ print gensub(/(.*)\..*/,"\\1","g",$3), $4, gensub(/(.*)\..*/,"\\1","g",$5) }' | awk -F " > " '{print $1"\n"$2}'
 
# Guardar capturas en otro servidor remoto (SSH).
tcpdump -i enp2s0 -w - | ssh servidorremoto.com -C  "cat - > /home/usuario/captura.pcap"
 
# Analizar en tiempo real con Wireshark el tráfico web de un servidor remoto (SSH).
ssh root@192.168.178.106 tcpdump -i eth0 port 80 -w - | /usr/bin/wireshark -k -i -
 
# Mostrar direcciones de correo de emails entrantes (from / to).
tcpdump -l -s0 -w - tcp dst port 25 | strings | grep -i 'MAIL FROM\|RCPT TO'
 
# Carga de red en una interfaz (utilizando pv).
tcpdump -i eth2 -w - |pv -bert >/dev/null
 
# Interceptar credenciales en el tráfico de red entrante o saliente.
tcpdump -i enp2s0 port http or port ftp or port smtp or port imap or port pop3 -l -A | egrep -i 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:|login:|pass |user ' --color=auto --line-buffered -B20
 
# Auditar tráfico de memcached.
tcpdump -i eth0 -s 65535 -A -ttt port 11211
 
# Mostrar las llamadas de postgresql al servidor local (localhost).
tcpdump -nnvvXSs 1514 -i lo0 dst port 5432

Herramientas para combinar con tcpdump / wireshark.