¿Cómo capturar y analizar el tráfico de red con tcpdump?

¿Cómo capturar y analizar el tráfico de red con tcpdump?

tcpdump es una increíble herramienta de línea de comandos para rastrear redes. Es un estándar de la industria para capturar y analizar paquetes TCP / IP.

tcpdump le permite examinar los encabezados de los paquetes TCP / IP. Imprime una línea para cada paquete y el comando sigue ejecutándose hasta que presiona Ctrl + C para terminar.

Examinemos una línea de una salida de ejemplo:

20:58:26.765637 IP 10.0.0.50.80 > 10.0.0.1.53181: Flags [F.], seq 1, ack 2, win 453, options [nop,nop,TS val 3822939 ecr 249100129], length 0

Cada línea incluye

  • Marca de tiempo de Unix (20:58:26.765637)
  • protocolo (IP)
  • el nombre de host o IP de origen y el número de puerto (10.0.0.50.80)
  • nombre de host o IP de destino y número de puerto (10.0.0.1.53181)
  • Banderas TCP (Flags [F.]). Las banderas indican el estado de la conexión. Esto puede incluir más de un valor, como en este ejemplo [F.] para FIN-ACK. Este campo puede tener los siguientes valores:
    • S – SYN. El primer paso para establecer la conexión.
    • F – FIN. Terminación de la conexión.
    • . – ACK. Paquete de acuse de recibo recibido correctamente.
    • P – EMPUJE. Le dice al receptor que procese paquetes en lugar de almacenarlos en búfer.
    • R – RST. La comunicación se detuvo.
  • Número de secuencia de los datos del paquete. (seq 1)
  •  Número de acuse de recibo (ack 2)
  • Tamaño de ventana (win 453). El número de bytes disponibles en el búfer de recepción. A esto le siguen las opciones de TCP.
  • Longitud de la carga útil de datos. (length 0)

Installation

En distribuciones basadas en Debian, tcpdump se puede instalar con el comando APT:

sudo apt install tcpdump

tcpdump command options

La ejecución de tcpdump sin ninguna opción capturará todos los paquetes que fluyen a través de la interfaz predeterminada.

Para ver la lista de interfaces de red disponibles en el sistema y en las que tcpdump puede capturar paquetes.

tcpdump -D
or
tcpdump --list-interfaces

Teniendo como salida la siguiente:

1.ens192 [Up, Running]
2.lo [Up, Running, Loopback]
3.any (Pseudo-device that captures on all interfaces) [Up, Running]
4.bluetooth-monitor (Bluetooth Linux Monitor) [none]
5.nflog (Linux netfilter log (NFLOG) interface) [none]
6.nfqueue (Linux netfilter queue (NFQUEUE) interface) [none]

Para capturar paquetes que fluyen a través de una interfaz específica, use el -i bandera con el nombre de la interfaz. Sin el -i interfaz tcpdump elegirá la primera interfaz de red que encuentra.

tcpdump -i eth1

De forma predeterminada, tcpdump resuelve las direcciones IP en nombres de host y también usa nombres de servicio en lugar de números de puerto. Si el DNS está roto o no desea que tcpdump realice búsquedas de nombres, use el -n . 

tcpdump -n

Para capturar solo un conjunto de líneas, digamos 5, use el -c bandera:

tcpdump -c 5

tcpdump filter expressions

Las expresiones de filtro seleccionan qué encabezados de paquete se mostrarán. Si no se aplican filtros, se muestran todos los encabezados de los paquetes. Los filtros más utilizados son puerto, host, src, dst, tcp, udp, icmp.

filtro de puerto

Utilice el filtro de puerto para ver los paquetes que llegan a un puerto específico:

tcpdump -i eth1 -c 5 port 80

Para capturar paquetes de un tipo de protocolo específico, por ejemplo, icmp, en la interfaz eth1:

tcpdump -i eth1 icmp

Combinar expresiones de filtro

Puede combinar estas expresiones de filtro con los operadores AND, OR y NOT. Esto le permitirá escribir comandos que pueden aislar paquetes con mayor precisión:

Paquetes de una IP específica y destinados a un puerto específico:

tcpdump -n -i eth1 src 10.0.0.1 and dst port 80

Para capturar todos los paquetes excepto ICMP, use el operador NOT:

tcpdump -i eth1 not icmp

Para capturar todos los paquetes excepto un host:

tcpdump -i eth1 not host 136.45.12.26

Saving packet headers to a file

Dado que la salida de tcpdump puede desplazarse más allá de la pantalla bastante rápido, puede almacenar los encabezados de los paquetes en un archivo con el indicador -w. Los archivos para guardar la salida usan formato pcap y tienen una extensión de .pcap.

PCAP significa captura de paquetes. El siguiente comando guarda 10 líneas de salida en la interfaz eth1 en icmp.pcap.

tcpdump -i eth1 -c 10 -w icmp.pcap

Puede leer este archivo con -r bandera:

tcpdump -r icmp.pcap

Viewing packet details

Hasta ahora solo hemos visto los encabezados de los paquetes, para ver el uso del contenido del paquete -A opción. Esto imprime el contenido del paquete en ASCII, que puede ser de ayuda en la resolución de problemas de red. también -X bandera se puede utilizar para mostrar la salida en formato hexadecimal. Esto puede no ser de mucha ayuda si la conexión está encriptada.

tcpdump -c10 -i eth1 -n -A port 80
23:35:53.109306 IP 10.0.0.1.53916 > 10.0.0.50.80: Flags [P.], seq 2366590408:2366590907, ack 175457677, win 4111, options [nop,nop,TS val 255253117 ecr 5344866], length 499: HTTP: GET / HTTP/1.1
E..'..@.@.%.
...
..2...P..M.
uE............
.6.}.Q.bGET / HTTP/1.1
Host: 10.0.0.50
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
If-Modified-Since: Tue, 04 Mar 2014 11:46:45 GMT

Para facilitar el acceso a los registros y poder estar más al pendiente he creado un script que me envía un email con todos los registros capturados, acá les dejo el script:

#!/bin/bash
ruta="/home/Script/"
cd $ruta
touch tcpdump.log
Log=tcpdump.log
echo    >$Log
echo " ********** [Comenzando escaneo de tcpdump `date +%d-%m-%Y-%Hh%Mm%Ss`] **********"    >>$Log
echo    >>$Log
echo    >>$Log
echo " ********** [Comenzando escaneo UDP port 53] **********"    >>$Log
echo    >>$Log
tcpdump -i ens192 -c 50 udp port 53     >>$Log
echo    >>$Log
echo " ********** [Comenzando escaneo TcpDump -XSvvvnnttttc] **********"    >>$Log
echo    >>$Log
tcpdump -XSvvvnnttttc 15        >>$Log
echo    >>$Log
echo " ********** [Comenzando escaneo port 8090] **********"    >>$Log
echo    >>$Log
tcpdump -c50 -i ens192 -n -A port 8090  >>$Log
echo    >>$Log
echo " ********** [Escaneo de tcpdump FINALIZADO `date +%d-%m-%Y-%Hh%Mm%Ss`] **********"    >>$Log
echo    >>$Log
mail -s "*** [Escaneo de tcpdump FINALIZADO `date +%d-%m-%Y-%Hh%Mm%Ss`] ***" email@example.es < $ruta/$Log
rm -rf $ruta/$Log
exit

Espero les pueda ser de ayuda como lo ha sido para mí. See you later!

Comentarios

Aún no hay comentarios. ¿Por qué no comienzas el debate?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *