Está en la página 1de 6

tcpdump: El arte de capturar y analizar el trfico de red

Tcpdump, es de uno de los analizadores de paquetes de red ms conocidos e importantes en lo que a lnea
de comandos en entornos Unix se refiere. Su principal funcin es la de analizar el trfico que circula por la
red. Este programa viene dede 1987, poca en la que sus autores Van Jacobson, Craig Leres y Steven
McCanne trabajaban en el Lawrence Berkeley Laboratory Network Research Group, . El programa es
ampliado por Andrew Tridgel.
Se le puede relacionar con el trmino Sniffer. Los sniffers son analizadores de red o analizadores de
paquetes que nos permiten capturar trfico en nuestra red para posteriormente poder realizar un anlisis de
la informacin recogida. Se trata de configurar nuestra tarjeta de red en un modo denominado promiscuo,
que nos permita no slo escuchar los paquetes que vienen destinados a nosotros, sino que se trata de
escuchar todo el trfico que se genera en la red.
Es una herramientas indispensable en su labor diaria del administrador de red.
Entre sus muchas funciones podemos citar como ejemplos:
Detectar problemas de red
Detectar intrusiones
Conocer y monitorizar el trfico que se est generando
Control de ancho de banda,
etc
Histricamente en todas aquellas redes centralizadas a travs de concentradores hub, era muy fcil colocar
un sniffer que nos permitiese escuchar todo el trfico que se generaba en la red. Qu podemos encontrar
en las capturas? Por ejemplo, muchos usuarios y contraseas. Hay que tener claro que son muchos los
protocolos inseguros por naturaleza en los que los usuarios/contraseas viajaban en texto claro. Protocolos
como smtp, pop3, ftp, http, Telnet, etc pueden ser slo algunos ejemplos. Como casi siempre sucede en el
mundo de las TIC, la seguridad no suele ser la fase ms importante a la hora de abarcar un proyecto.
Si preguntamos a nuestro sistema Debian por Tcpdump, nos dir:
#apt-cache search -f tcpdump
Package: tcpdump
Maintainer: Romain Francoise
Description: A powerful tool for network monitoring and data acquisition
This program allows you to dump the traffic on a network. tcpdump
is able to examine IPv4, ICMPv4, IPv6, ICMPv6, UDP, TCP, SNMP, AFS
BGP, RIP, PIM, DVMRP, IGMP, SMB, OSPF, NFS and many other packet
types.
.
It can be used to print out the headers of packets on a network
interface, filter packets that match a certain expression. You can
use this tool to track down network problems, to detect "ping attacks"
or to monitor network activities.
Homepage: http://www.tcpdump.org/
Tag: admin::monitoring, interface::commandline, network::scanner, protocol::{ip,i

Para ver sobre que interfaces podemos empezar a escuchar trfico:


#tcpdump -D
1.eth0
2.wlan0
3.any (Pseudo-device that captures on all interfaces)
4.lo

Seleccionamos la interface sobre la que lanzar la captura


#tcpdump -i wlan0

#tcpdump -i 2
La respuesta sera una lnea del tipo:
20:50:43.975606 IP portatil.34296 > fx-in-f106.1e100.net.www: Flags [S], seq 2560890

-1-
El formato general de la lnea mostrada es el siguiente:
timestamp src > dst: flags data-seqno ack window urgent options

Timestamp (20:50:43.975606) nos da la fecha en la que se produce el evento. Vemos que


tenemos fracciones de segundo, ya que puede haber varios paquetes por segundo

Src (10.200.X.X.34296) y dst(74.125.39.106.80) son las IP host de Origen-destino junto


con su puerto.
> Direccin del flujo de datos.
Flags [S] - Combinacin de todas las posibles banderas que ya conocemos S (SYN), F (FIN), P
(PUSH), R (RST), U (URG), W(ECN CWR), E (ECN-Echo) or `. (ACK), or `none if no flags are
set.
Data-seqno (seq 2560890220) Describe el numero de secuencia de la porcin de datos
Ack - Numero de secuencia del prximo byte que se espera recibir en la conexin.
Window (win 5840) Informa del tamao de ventana.
Urg indica que hay informacin que hay que procesar como urgente en el paquete.
Options (options [mss 1460,sackOK,TS val 1445388 ecr 0,nop,wscale 6], ) -
Opciones Tcp que han de ir entre corchetes .
Es importante comentar que los datos de src, dst y Flags han de estar siempre presentes. El resto de los
campos dependern en funcin del contenido de las cabeceras del protocolo TCP.
Las opciones de Tcpdump a la hora de realizar la captura:
-n: No realiza resolucin de nombre
#tcpdump -n -i wlan0
# 21:14:49.044773 IP 10.207.X.X.36837 > 74.125.39.105.80: Flags [P.], seq 3278661926:3278
-A: escribe cada paquete en formato ASCII (puede resultar til para pginas web)
#tcpdump -n -A -i wlan0 host
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes
21:16:41.909178 IP 10.207.X.X.36837 > 74.125.39.105.80: Flags [P.], seq
3278663838:3278664713, ack 173879623, win 1002, options [nop,nop,TS val 1834871 ecr
1295511797], length 875
E...(.@.@...
..fJ}'i...P.lp.
]1G...........
...wM7..GET / HTTP/1.1
Host: www.google.es
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0
Iceweasel/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
.
-c X: Se detiene despus de recoger X paquetes
#tcpdump -n -A -i wlan0 -c 1
21:19:33.355015 IP 10.207.X.X.54292 > 74.125.39.147.80: Flags [S], seq 3904402581, win
5840, options [mss 1460,sackOK,TS val 1877733 ecr 0,nop,wscale 6], length 0
1 packets captured
-e: imprime encabezados a nivel de enlace
#tcpdump -e -i wlan0 c1
21:20:21.772273 00:22:fb:9a:xx:xx > 00:18:39:ae:8x:a2, ethertype IPv4 (0x0800), length
941: 10.207.x.x.54292 > 74.125.39.147.80: Flags [P.], seq 3904405615:3904406490, ack
2703453103, win 721, options [nop,nop,TS val 1889837 ecr 945894816], length 875 1 packets
captured

-2-
-p: pone la tarjeta en modo no promiscuo
Con ifconfig -a vemos si la tarjeta se encuentra en modo promiscuo
-q: imprime menos informacin por lo que las lneas son ms cortas
#tcpdump -q -i wlan0 c1
21:30:38.616870 IP portatil.local.57740 > fx-in-f99.1e100.net.www: tcp 0
1 packets captured
-r: lee los paquetes guardados con la opcin -w

-S: imprime valores absolutos de nmeros de secuencia


-s: tamao (por defecto 65535 bytes)
-t que no escriba el timestamp
#tcpdump -t -q -i wlan0 -c1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
IP portatil.local.42355 > fx-in-f147.1e100.net.www: tcp 5
-tttt vamos a ver fecha / hora
#tcpdump -tttt -q -i wlan0 -c1
listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes
2011-09-28 21:38:35.350830 IP pedlap.local.42355 > fx-in-f147.1e100.net.www: tcp 5
-w: fichero escribe un fichero con la salida
#tcpdump -tttt -q -i wlan0 -c1 -w fichero.cap
-G: Rota el fichero especificado con la opcion -w segundos
-v: informacin de salida, -vv mas , -vvv y mas
-x:. escribe la informacin de cada paquete en Hex menos cabeceras a nivel de enlace.
-gateway host: imprimir trfico a travs de host gateway Internet.
#tcpdump -x -q -i wlan0 -c1
21:41:04.794378 IP portatil.local.42895 > fx-in-f103.1e100.net.www: tcp 0
0x0000: 4510 003c acda 4000 4006 3ab8 0acf d666
0x0010: 4a7d 2767 a78f 0050 50f4 86a0 0000 0000
0x0020: a002 16d0 3423 0000 0204 05b4 0402 080a
0x0030: 0006 2a7a 0000 0000 0103 0306
-xx: escribe la informacin de cada paquete en Hex menos cabeceras a nivel de enlace.
-X:. escribe la informacin de cada paquete en Hex y Decimal
-XX: escribe la informacin de cada paquete en Hex y Decimal

EXPRESIONES
Para trabajar con ellas nos van a permitir filtrar resultados.
host: Filtrar el trfico por Host.
#tcpdump -n -i wlan0 -c1 host www.google.es
21:47:26.704685 IP 10.207.X.X.53749 > 74.125.39.106.80: Flags [S], seq 3929171104, win
5840, options [mss 1460,sackOK,TS val 499568 ecr 0,nop,wscale 6], length 0
Otro ejemplo en este sentido: #tcpdump ip host www.google.es and not www.bing.com
port: mostrar solo trfico de un determinado puerto.
#tcpdump -n -q -i wlan0 -n port 80
21:50:06.758861 IP 10.207.X.X.53749 > 74.125.39.106.80: tcp 5

-3-
21:50:06.880112 IP 74.125.X.X.80 > 10.207.214.102.53749: tcp 0
dst host host: Trfico con un determinado host como destino.
# tcpdump -i wlan0 dst host www.google.es
src host host: Trafico con un determinado host como origen.
#tcpdump -i wlan0 src host 10.20.1.90
Si queremos trabajar con las direcciones MAC al igual que con los host.
ether dst ehost
ether src ehost
ether host ehost
#tcpdump -i wlan0 ether dst 00:22:fb:9a:57:72
Si ahora queremos recoger informacin de una determinada red:
dst net net
src net net
net net
net net mask netmask
#tcpdump -i wlan0 net 10.207.X.X/24
Si queremos trabajar con puertos:
dst port port
src port port
#tcpdump -i wlan0 port 22 or 23
not: Negamos una expresin.
#tcpdump -i wlan0 "tcp src port 80" and not host 1.1.1.1
ip proto protocol: Especificar un determinado protocolo.
#tcpdump -i wlan0 ip proto 6 = tcpdump tcp -i wlan0 (tcp , udp, icmp) = #tcpdump -i wlan0
ip proto \\tcp
#cat /etc/protocols | grep tcp
tcp 6 TCP # transmission control protocol
Podemos trabajar con los tamaos (bytes)
less leghnt
greather length
#tcpdump -i wlan0 greater 20
Y muchas mas expresiones a consultar en el man tcpdump.
ip6 proto protocol, ip6 protochain protocol, ip protochain protocol
ip broadcast, ether multicast, ip multicast, ip6 multicast, ether proto protocol decnet
src host, decnet dst host, decnet host, ip, ip6, arp, rarp, atalk, aarp decnet. iso, stp,
ipx, netbeui, vlan vlan_id, tcp , udp, icmp, clnp, esis, isis
Tambin podemos combinar expresiones:
Negacin: ! o not
And: && o and
Or: || o or
Ejemplos:
# tcpdump -i wlan0 ip and not net 1.1.1.1
#tcpdump host 10.200.1.1 and \( 1.1.1.1 or 2.2.2.2 \)
#tcpdump -i wlan0 "tcp src port 80"

-4-
#tcpdump -n -i wlan0 "not (tcp port ssh and host 1.1.1.1 and host 2.2.2.2)"
#tcpdump -i wlan0 ((tcp) and (port 80) and ((!dst host www.google.es) && (!dst host
www.bing.com)))
Ahora vamos a complicarlo un poco ms y realizar filtrados con el que se muestra en el siguiente ejemplo:
Ejemplo de 3-way handshake protocol: vamos a recoger solo los paquetes SYN.
El diagrama de una cabecera TCP sin opciones seria tal que as.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |Octeto 0 -3
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |Octeto 4 -7
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |Octeto 8 - 11
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |C|E|U|A|P|R|S|F| |
| Offset| Res. |W|C|R|C|S|S|Y|I| Window |Octeto 12 -15
| | |R|E|G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |Octeto 16 - 19
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Si nos fijamos los Flags se encuentran entre el octeto 12 y el 15. Exactamente en los bits contenidos en el
octeto 13
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |C|E|U|A|P|R|S|F| |
| Offset| Res. |W|C|R|C|S|S|Y|I| Window |Octeto 12 -15
| | |R|E|G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | |Octeto 13 | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Si ahora nos fijamos en el octeto 13
+-+-+-+-+-+-+-+-+
|C|E|U|A|P|R|S|F|
|W|C|R|C|S|S|Y|I|
|R|E|G|K|H|T|N|N|
+-+-+-+-+-+-+-+-+
7 6 5 4 3 2 1 0
Si recibimos un paquete con el bit SYN activado:
+-+-+-+-+-+-+-+-+
|0|0|0|0|0|0|1|0|
+-+-+-+-+-+-+-+-+
7 6 5 4 3 2 1 0
Asumiendo que el octeto es un integer sin signo, en Binario sera igual a 00000010 que en notacin decimal
corresponde al nmero 2. Esto lo podemos expresar como tcp[13] == 2.
#tcpdump -i wlan0 'tcp[13] ==2'
tcp[13] lo podemos reemplazar con tcp[tcpflags]. Los posibles valores serian :
tcp-fin
tcp-syn
tcp-rst
tcp-push
tcp-act
tcp-urg
Con lo que podemos expresarlo como :
#tcpdump tcp[tcpflags] & (tcp-syn) != 0)
Mostrar paquetes de inicio y fin (SYN y FIN activados) que no pertenezcan a una determinada red:

-5-
#tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net 10.204.X.X'
Siguiendo el mismo razonamiento si queremos que filtrar paquetes SYN y ACK, entonces tcp[13] == 18
Si queremos recoger nicamente paquetes con SYN o SYN+ACK entonces aplicamos mscaras:
00010010:SYN-ACK + 00000010:Mascara (2 en decimal) = 00000010 : Resultado(2 en decimal)
#tcpdump -i wlan0 'tcp[13] & 2 = 2'
Tambin podramos filtrar los paquetes lanzados contra un determinado puerto :
proto[x:y] x es el byte inicio, y numero de bytes a recoger.
#tcpdump -i wlan0 'tcp[0:2] =81'
Ademas podemos utilizar los siguientes operadores:
Operators : >, <, >=, <=, =, !=
Pudiendo transformar el filtro anterior:
#tcpdump -i wlan0 'tcp[0:2] >21 && tcp[0:2] < 25''
Con lo visto podemos jugar con otros protocolos como ICMP.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unused |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet Header + 64 bits of Original Data Datagram |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0 Echo Reply
3 Destination Unreachable
4 Source Quench
5 Redirect
8 Echo
11 Time Exceeded
12 Parameter Problem
13 Timestamp
14 Timestamp Reply
15 Information Request
16 Information Reply
Por ejemplo filtrar un Echo Request:
#tcpdump -i wlan0 'icmp[0]=8'
Podemos obtener las IP que nos estn haciendo escaneos
#tcpdump -lni wlan0 'icmp and (icmp[0] = 8)' | tee salida.txt #cut -d " " -f 3 salida.txt

-6-