TCPDUMP, una introducción y uso básico

Publicado por Diego Córdoba en

Hoy les traigo un pequeño tutorial de tcpdump, este grandioso sniffer de tráfico de red para Linux!

Tcpdump es un sniffer de tráfico de red open source licenciado bajo Licencia 3-clause BSD (http://opensource.org/licenses/BSD-3-Clause) que hace uso de las bibliotecas PCAP para funcionar, por supuesto, también licenciadas como código abierto.

Un sniffer es un paquete de software que permite leer el tráfico qutcpdump-logoe pasa por nuestra tarjeta de red, y trabajarlo de alguna forma. tcpdump lee dicho tráfico, y nos permite ver y analizar diferentes parámetros, así como también filtrar paquetes y tramas dependiendo de ciertos patrones y condiciones complejas.

Cabe aclarar también que tcpdump es uno de los sniffers más conocidos, y es un capturador de paquetes de línea de comandos 🙂

Instalando tcpdump

En Debian, tcpdump se instala de la siguiente manera:

aptitude install tcpdump

Podremos apreciar que el comando también instala las bibliotecas pcap, puesto que son una dependencia de practicamente todos los sniffers abiertos.

Sintaxis y modificadores

Una sintaxis simple del comando es la siguiente:

tcpdump [OPCIONES] [PATRON]

Donde OPCIONES hace referencia a modificadores de línea de comando, mientras que PATRON se refiere a los patrones y condiciones de filtrado de tráfico de red.

Algunas opciones interesantes
Algunas opciones extraidas de la gran lista de modificadores de tcpdump (ver man tcpdump) podríamos considerar a las siguientes:

  • -i <iface>
    • Permite especificar la interfaz de red en la que vamos a atender el tráfico.
  • -c <numero>
    • Permite limitar la cantidad de paquetes capturados en un número determinado.
  • -n
    • Evita la resolución de puertos y direcciones ip a nombres.
  • -e
    • Muestra las cabeceras ethernet además del paquete ip.
  • -t
    • No imprime la estampa de tiempo de captura de cada paquete.
  • -x
    • Muestra el contenido hexadecimal de la trama capturada.
  • -xx
    • Idem a -x, pero además muestra el contenido de la cabecera Ethernet.
  • -X
    • Muestra el contenido hexadecimal y en ASCII de la trama capturada.
  • -XX
    • Idem a -X, pero además el contenido incluye los datos de la cabecera Ethernet.
  • -A
    • Solo muesta el contenido ASCII del paquete capturado.
  • -s <numero>
    • Muestra solo los primeros <numero> bytes desde el principio del paquete.
  • -vv
    • Muestra información adicional, incluyendo parámetros de las cabeceras de protocolo.
  • -w file
    • Permite guardar la salida en un archivo con formato pcap.
  • -r file
    • Permite leer los paquetes previamente capturados y almacenados en un archivo pcap.

Veamos algunos ejemplos:

Capturamos comúnmente:

diego@sol:~$ sudo tcpdump -nn -i eth0 -c 3
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
01:32:21.770711 IP 64.233.186.125.5222 > 192.168.2.102.46875: Flags [P.], seq 3172999621:3173000004, ack 184506593, win 902, options [nop,nop,TS val 2254316366 ecr 4881100], length 383
01:32:21.770762 IP 192.168.2.102.46875 > 64.233.186.125.5222: Flags [.], ack 383, win 2423, options [nop,nop,TS val 4887258 ecr 2254316366], length 0
01:32:21.771378 IP 192.168.2.102.46875 > 64.233.186.125.5222: Flags [P.], seq 1:152, ack 383, win 2423, options [nop,nop,TS val 4887258 ecr 2254316366], length 151

Veamos el contenido hexa:

diego@sol:~$ sudo tcpdump -nn -i eth0 -c 3 -x
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
01:33:01.200132 IP 192.168.2.102 > 8.8.8.8: ICMP echo request, id 7140, seq 38, length 64
    0x0000:  4500 0054 a885 4000 4001 bf05 c0a8 0266
    0x0010:  0808 0808 0800 69b9 1be4 0026 7d07 9154
    0x0020:  0000 0000 a20d 0300 0000 0000 1011 1213
    0x0030:  1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
    0x0040:  2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
    0x0050:  3435 3637
01:33:01.229310 IP 8.8.8.8 > 192.168.2.102: ICMP echo reply, id 7140, seq 38, length 64
    0x0000:  4500 0054 aee1 0000 8001 b8a9 0808 0808
    0x0010:  c0a8 0266 0000 71b9 1be4 0026 7d07 9154
    0x0020:  0000 0000 a20d 0300 0000 0000 1011 1213
    0x0030:  1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
    0x0040:  2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
    0x0050:  3435 3637
01:33:01.741009 IP 173.252.75.17.5222 > 192.168.2.102.39069: Flags [P.], seq 1854660610:1854660830, ack 1507918593, win 58, options [nop,nop,TS val 1370776518 ecr 4893273], length 220
    0x0000:  4500 0110 8936 4000 5106 e395 adfc 4b11
    0x0010:  c0a8 0266 1466 989d 6e8b e002 59e1 0301
    0x0020:  8018 003a 9a24 0000 0101 080a 51b4 63c6
    0x0030:  004a aa59 1703 0300 d700 0000 0000 0009
    0x0040:  b884 7369 b62e e247 20f1 c746 f501 c301
    0x0050:  1223 9d59 a70c 013a 30af 06a5 a4f0 782b
    0x0060:  b1cb ac16 04ca 06a3 f38d dcb5 0d0a 0856
    0x0070:  9495 8ce4 48f1 217a c27f 93d4 d233 002a
    0x0080:  643c 1ff2 b03f 35b1 9a4b 59ef 76bf 1568
    0x0090:  233d a7c8 a699 090e 1cf2 892e 6e6b 4f64
    0x00a0:  5564 dbfc e95e 7635 119b c001 e26a f96a
    0x00b0:  d738 83a5 3714 429d a4df f079 67bf e431
    0x00c0:  0310 ad59 bb7b b334 bdfc e4fc c7c2 32d9
    0x00d0:  acf2 873f 07b7 9dd3 c00b 8c50 183d 1c7b
    0x00e0:  eda6 4b93 7a29 b360 60d1 48ff 9aa2 3c0a
    0x00f0:  0701 64e3 6d06 5407 0d6c 5a7a 5eea 83a7
    0x0100:  897e d595 595e 107e 92fe 960d b933 829f
3 packets captured
18 packets received by filter
0 packets dropped by kernel

Ahora junto con el ASCII para interpretarlo:

diego@sol:~$ sudo tcpdump -nn -i eth0 -c 3 -X
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
01:33:35.128350 IP 64.233.186.109.993 > 192.168.2.102.34900: Flags [P.], seq 3443553607:3443553653, ack 184863428, win 685, options [nop,nop,TS val 2266405069 ecr 4905465], length 46
    0x0000:  4500 0062 f64f 0000 2d06 d8e1 40e9 ba6d  E..b.O..-...@..m
    0x0010:  c0a8 0266 03e1 8854 cd40 7547 0b04 cac4  ...f...T.@uG....
    0x0020:  8018 02ad fefe 0000 0101 080a 8716 98cd  ................
    0x0030:  004a d9f9 1703 0300 2900 0000 0000 003e  .J......)......>
    0x0040:  0ba5 53e2 0f6d 2d14 8ef5 8cf2 b30b 5e67  ..S..m-.......^g
    0x0050:  23c0 f27e d540 465b e1b7 8afb e03a b77a  #..~.@F[.....:.z
    0x0060:  d4de                                     ..
01:33:35.128385 IP 192.168.2.102.34900 > 64.233.186.109.993: Flags [.], ack 46, win 7238, options [nop,nop,TS val 4905597 ecr 2266405069], length 0
    0x0000:  4500 0034 8c34 4000 4006 f02a c0a8 0266  E..4.4@.@..*...f
    0x0010:  40e9 ba6d 8854 03e1 0b04 cac4 cd40 7575  @..m.T.......@uu
    0x0020:  8010 1c46 fcb1 0000 0101 080a 004a da7d  ...F.........J.}
    0x0030:  8716 98cd                                ....
01:33:35.365269 IP 192.168.2.102 > 8.8.8.8: ICMP echo request, id 7140, seq 72, length 64
    0x0000:  4500 0054 b8d9 4000 4001 aeb1 c0a8 0266  E..T..@.@......f
    0x0010:  0808 0808 0800 2212 1be4 0048 9f07 9154  ......"....H...T
    0x0020:  0000 0000 c592 0500 0000 0000 1011 1213  ................
    0x0030:  1415 1617 1819 1a1b 1c1d 1e1f 2021 2223  .............!"#
    0x0040:  2425 2627 2829 2a2b 2c2d 2e2f 3031 3233  $%&'()*+,-./0123
    0x0050:  3435 3637                                4567
3 packets captured
4 packets received by filter
0 packets dropped by kernel

Ahora veamos solo el ASCII:

diego@sol:~$ sudo tcpdump -nn -i eth0 -c 3 -A
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
01:34:02.512341 IP 192.168.2.102 > 8.8.8.8: ICMP echo request, id 7140, seq 99, length 64
E..T..@.@..q...f...........c...T....?....................... !"#$%&'()*+,-./01234567
01:34:02.545677 IP 8.8.8.8 > 192.168.2.102: ICMP echo reply, id 7140, seq 99, length 64
E..T...............f.......c...T....?....................... !"#$%&'()*+,-./01234567
01:34:03.517655 IP 192.168.2.102 > 8.8.8.8: ICMP echo request, id 7140, seq 100, length 64
E..T..@.@......f...........d...T............................ !"#$%&'()*+,-./01234567
3 packets captured
4 packets received by filter
0 packets dropped by kernel

Sumemos información adicional de protocolos

(no entraremos en detalle sobre los campos de las cabeceras de cada protocolo -por lo menos en este articulo-)

diego@sol:~$ sudo tcpdump -nn -i eth0 -c 3 -vv
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
01:35:01.728138 IP (tos 0x0, ttl 45, id 1004, offset 0, flags [none], proto TCP (6), length 439)
    64.233.186.125.5222 > 192.168.2.102.46875: Flags [P.], cksum 0x13b9 (correct), seq 3173019030:3173019417, ack 184506991, win 919, options [nop,nop,TS val 2254476467 ecr 4927183], length 387
01:35:01.728168 IP (tos 0x0, ttl 64, id 15924, offset 0, flags [DF], proto TCP (6), length 52)
    192.168.2.102.46875 > 64.233.186.125.5222: Flags [.], cksum 0x0739 (correct), seq 1, ack 387, win 2423, options [nop,nop,TS val 4927247 ecr 2254476467], length 0
01:35:01.795990 IP (tos 0x0, ttl 64, id 57835, offset 0, flags [DF], proto ICMP (1), length 84)
    192.168.2.102 > 8.8.8.8: ICMP echo request, id 7140, seq 158, length 64
3 packets captured
4 packets received by filter
0 packets dropped by kernel

Ahora guardemos la captura en un archivo .pcap:

diego@sol:~$ sudo tcpdump -nn -i eth0 -c 3 -vv -w /tmp/captura.pcap

Y veamos, por ejemplo, el ascii de lo almacenado:

diego@sol:~$ sudo tcpdump -nn -r /tmp/captura.pcap -A
reading from file /tmp/captura.pcap, link-type EN10MB (Ethernet)
01:38:43.885290 IP 192.168.2.102 > 8.8.8.8: ICMP echo request, id 7140, seq 379, length 64
E..TO~@.@......f...........{...T............................ !"#$%&'()*+,-./01234567
01:38:43.962307 IP 8.8.8.8 > 192.168.2.102: ICMP echo reply, id 7140, seq 379, length 64
E..T......`........f.......{...T............................ !"#$%&'()*+,-./01234567
01:38:44.890018 IP 192.168.2.102 > 8.8.8.8: ICMP echo request, id 7140, seq 380, length 64
E..TO.@.@......f...........|...T............................ !"#$%&'()*+,-./01234567

Conclusiones:

Hemos visto algunos de los modificadores del comando tcpdump. Otras variantes y opciones podemso analizarlas en en man:

man tcpdump

En otro artículo podremos analizar las expresiones de filtro de paquetes con las que tcpdump se vuelve una verdadera navaja suiza en el mundo de los sniffers de trafico abiertos!

Les dejo además un breve video en el que podrán ver algunos ejemplos del uso de tcpdump.

Espero les guste y lo puedan aprovechar!


Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador