Tcpdump
De SergiTurWiki
Tcpdump
Tcpdump és una eina de xarxa que ens permet fer un volcat de tot el trànsit que passa per una targeta de xarxa. Tcpdump permet tant capturar el trànsit que li correspon a la màquina on s'executa, com el trànsit de la xarxa Local (promiscuous mode). Tal i com podeu consultar a la secció ifconfig el mode promiscu s'activa amb la comanda ifconfig de la següent manera:
$ ifconfig eth0 promisc
$ ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:80:C8:F8:4A:51
inet addr:192.168.99.35 Bcast:192.168.99.255 Mask:255.255.255.0
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1412 Metric:1
RX packets:190312 errors:0 dropped:0 overruns:0 frame:0
TX packets:86955 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:30701229 (29.2 Mb) TX bytes:7878951 (7.5 Mb)
Interrupt:9 Base address:0x5000
A vegades la comanda ifconfig s'ha reportat que falla al mostrar l'estat PROMISCUOUS. Podem utilitzar la comanda alternativa:
$ ip link show
En veritat per executar tcpdump no cal posar la targeta en mode promiscu. Necessitem permisos de root per executar tcpdump perquè activa ell mateix el mode promiscu (si qualsevol usuari d'una màquina multiusuari pogués executar tcpdump, podria capturar el trànsit de la resta d'usuaris).
NOTA: Una de les confusions més comunes és pensar que una xarxa Ethernet amb un Switch és un medi compartit i que simplement amb activar el mode promiscu podem capturar tot el trànsit de la xarxa. Això no és així ja que realment els switchs utilitzen el protocol ARP i les adreces MAC per tal de comunicar un port d'entrada amb el seu corresponent port de sortida sense enviar les dades a la resta de ports. Aquesta és la raó per la qual si posem la targeta en mode promiscu els únics paquets que detectem són aquells paquets que són de BROADCAST. Veieu el [http://www.tcpdump.org/faq.html#q4 FAQ de tcpdump]
tcmpdump per defecte escolta la interfície eth0:
$ sudo tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes ....
Podem escoltar altres interfícies amb el paràmetre -i:
$ sudo tcpdump -i lo
Tcpdump només mostra la informació de les capçaleres (no mostra pas les dades dels paquets). Si volem veure les dades em d'utilitzar el paràmetre -X. Per exemple la captura d'uns pings:
$ sudo tcpdump icmp -i lo -X
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes
11:56:32.875810 IP casa-linux.local > casa-linux.local: ICMP echo request, id 29505, seq 614, length 64
0x0000: 4500 0054 0000 4000 4001 b754 c0a8 0102 E..T..@.@..T....
0x0010: c0a8 0102 0800 22a7 7341 0266 500a 0647 ......".sA.fP..G
0x0020: 115d 0d00 0809 0a0b 0c0d 0e0f 1011 1213 .]..............
0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"#
0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123
0x0050: 3435 45
11:56:32.875828 IP casa-linux.local > casa-linux.local: ICMP echo reply, id 29505, seq 614, length 64
0x0000: 4500 0054 e590 0000 4001 11c4 c0a8 0102 E..T....@.......
0x0010: c0a8 0102 0000 2aa7 7341 0266 500a 0647 ......*.sA.fP..G
0x0020: 115d 0d00 0809 0a0b 0c0d 0e0f 1011 1213 .]..............
0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"#
0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123
0x0050: 3435 45
Podeu observar que les dades són sempre les mateixes en el cas d'un ping.
Podeu consultar l'article Depurant amb tcpdump per a veure més exemples d'ús de tcpdump.
- Paquet: tcpdump
- Path: /usr/bin/tcpdump (podeu trobar el camí de la comanda executant which tcpdump)
- Manual: man tcpdump
Recursos:
- Tutorial tcpdump
- Sniffing FAQ
- http://web.archive.org/web/20050321065241/www.zweknu.org/technical/index.rhtml?s=p%7c5
- FAQ de tcpdump
Opcions més habituals
- -i any : Escoltar totes les interfícies de xarxa.
- -n : No resol els noms de màquina (la resol·lució es fa segons nsswitch]]).
- -nn : No resol els noms de màquina ni ports
- -x : Mostra el contingut del paquet en hexadecimal.
- -xx : Igual que l'anterior però a més mostra la capçalera Ethernet
- -X : Mostra el contingut del paquet en hexadecimal i ASCII.
- -XX : Igual que l'anterior però a més mostra la capçalera Ethernet
- -v, -vv, -vvv : Incrementa el nombre d'informació del paquet
- -c n : Només obtenir n paquets
- -S : Mostra els números de seqüència de forma absoluta
- -e : Obtenir també la capçalera Ethernet
- -q : Mostrar menys informació del protocol.
- -s nbytes : estableix en nombre de bytes la quantitat de dades capturades. Amb -s 0 es captura tot el paquet.
Filtres
- type [host|net|port]: POdem filtrar segons una maquina en particular [host], rangs de xarxa [net] o ports [port].
- dir [srt|dst|src or dst|src and dst]: Segons l'origen [src] o destinació de la informació.
- proto [tcp|udp|ip|ether]: Segons el protocol.
Els filtres es poden combinar utilitzant expressions lògiques (or, and...).
Sortida de la comanda
La estructura de la sortida de la comanda tcpdump és la següent
$ src > dst: flags [dataseq ack window urgent options]
Exemple:
15:23:44.772291 IP 192.168.1.17.52798 > 85.Red-83-37-170.dynamicIP.rima-tde.net.65000: . ack 1791 win 7851 <nop,nop,timestamp 5520421 997821>
- src: Adreça i port d'origen.
- dst: Adreça i port de destinació
- flags: [Flags] de la capçalera TCP.
- dataseq: Número de seqüència del primer byte de dades del segment TCP.
- ack: Indica el següent número de següència.
- window: Mida de la finestra de recepció.
- urgent: Marca si hi ha dades urgents
- options: Indica l'existència d'opcions.
Per què són tant importants els protocols xifrats
Anem a comprovar perquè protocols com TELNET són insegurs:
Instal·leu un servidor de telnet a les vostres màquines
$ sudo apt-get install telnetd
Un cop instal.lat, amb dos ordinadors feu el següent. En una terminal obriu una connexió remota amb telnet:
$ telnet ip_maquina_remota
I en un altre terminal executeu el següent:
$ sudo tcpdump -X port 23
Ara podeu comprovar que tot el que escriviu a telnet es pot capturar. Si a la màquina remota executeu:
$ hola -bash: hola: command not found
Comprovareu com el text es pot llegir a la finestra on teniu executant-se tcpdump:
......................
12:13:15.859098 IP acacha.dyndns.org.telnet > casa-linux.local.52390: P 7:39(32) ack 6 win 1448 <nop,nop,timestamp 444348831 3490933>
0x0000: 4510 0054 d3d8 4000 4006 e365 c0a8 0103 E..T..@.@..e....
0x0010: c0a8 0102 0017 cca6 2241 5d60 2dca e78f ........"A]`-...
0x0020: 8018 05a8 0437 0000 0101 080a 1a7c 399f .....7.......|9.
0x0030: 0035 4475 2d62 6173 683a 2068 6f6c 613a .5Du-bash:.hola:
0x0040: 2063 6f6d 6d61 6e64 206e 6f74 2066 6f75 .command.not.fou
0x0050: 6e64 nd
Per comprovar com altres protocols com per exemple HTTP sense SSL són insegurs també podeu consultar l'article Ethereal (Wireshark).
A més existeixen eines com Ettercap o dsniff que encara fan més fàcil la captura de la informació de protocols com telnet. En el cas d'Ettercap fins i tot és possible interceptar la comunicació i escriure les nostres pròpies comandes en la comunicació interceptada.
Exemples d'ús
Capturar trànsit segons la màquina origen del paquet
Segons la IP
$ sudo tcpdump src host 192.168.3.1
Segons la MAC:
$ sudo tcpdump ether src 50:43:A5:AE:69:55
Capturar trànsit que sigui origen o destinació en una màquina concreta
$ sudo tcpdump host 192.168.3.2
Capturar trànsit amb destinació/origen a un rang de xarxa
$ sudo tcpdump dst net 192.168.3.0
$ sudo tcpdump src net 192.168.3.0 mask 255.255.255.240 $ sudo tcpdump src net 192.168.3.0/28
Capturar trànsit amb origen o destinació a un port concret
$ sudo tcpdump dst port 23
$ sudo tcpdump src port 23
Tant origen com destinació:
$ sudo tcpdump port 110
Capturar paquets segons el seu protocol
Protocol IP:
$ sudo tcpdump ip
Protocol UDP
$ sudo tcpdump ip proto \\udp $ sudo tcpdump udp
Protocol ICMP:
$ sudo tcpdump icmp
Capturar el trànsit web
$ sudo tcpdump tcp and port 80
Capturar les peticiones de DNS
$ sudo tcpdump udp and dst port 53
Capturar el trànsit de telnet o SSH
$ sudo tcpdump tcp and \(port 22 or port 23\)
Capturar tot el trànsit excepte el web
$ sudo tcpdump tcp and not port 80
Mostrar les MAC amb tcpdump (en comptes de les adreces IP)
S'utilitza la opció -e:
$ sudo tcpdump -e -n -i eth0
Veure l'enrutament. Ping que entra per una targeta de xarxa i surt per un altre
$ sudo tcpdump -env -i any icmp
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 96 bytes
11:37:34.551792 In 00:23:54:08:50:8f ethertype IPv4 (0x0800), length 100: (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.1.3 > 147.83.2.3: ICMP echo request, id 26426, seq 1, length 64
11:37:34.551806 Out 00:16:3e:10:eb:01 ethertype IPv4 (0x0800), length 100: (tos 0x0, ttl 63, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.1.3 > 147.83.2.3: ICMP echo request, id 26426, seq 1, length 64
En aquest cas el paquet no torna correctament! (no hi ha reply)
Mostrar els paquets ARP amb les seves MAC i els ping
$ sudo tcpdump -ennqti eth0 \( arp or icmp \)
Vegeu també:
Recollir MACS a partir de l'arrancada de xarxa
Cal executar:
$ sudo tcpdump -qtel broadcast and port bootpc > /tmp/mac.list
I iniciar l'arrancada de xarxa de les màquines de les quals es vol recollir la MAC. Després podem executar:
$ sudo perl -ane ’print "\U$F[0]\n"’ /tmp/mac.lis|sort|uniq
Per tal d'obtenir la llista de MACs.
Escoltar totes les interfícies de xarxa
$ tcpdump -i any not port 22
