Tcpdump

De SergiTurWiki

Share/Save/Bookmark
Dreceres ràpides: navegació, cerca
Aquesta wiki forma part dels materials d'un curs
Curs: DissenyXarxesLinux, LinuxAdministracioAvancada, SeguretatXarxesInformàtiques
Fitxers: Protocols_de_xarxes_UNIX.pdf (Protocols_de_xarxes_UNIX.odp)
Repositori SVN: http://anonymous@svn.projectes.lafarga.cat/svn/iceupc/DissenyXarxaLocalLinux, http://anonymous@svn.projectes.lafarga.cat/svn/iceupc/LinuxAdministracioAvan%c3%a7ada, http://anonymous@svn.projectes.lafarga.cat/svn/iceupc/SeguretatXarxesInform%C3%A0tiques
Usuari: anonymous
Paraula de pas: sense paraula de pas
Autors: Sergi Tur Badenas

Contingut

Tcpdump

Tcpdump és una eina de xarxa que ens permet fer un volcat de tot el tràfic que passa per una targeta de xarxa. Tcpdump permet tant capturar el tràfic que li correspon a la màquina on s'executa, com el tràfic 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àfic 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àfic 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:

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àfic 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àfic que sigui origen o destinació en una màquina concreta

$ sudo tcpdump host 192.168.3.2

Capturar tràfic 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àfic 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àfic web

$ sudo tcpdump tcp and port 80

Capturar les peticiones de DNS

$ sudo tcpdump udp and dst port 53

Capturar el tràfic de telnet o SSH

$ sudo tcpdump tcp and \(port 22 or port 23\)

Capturar tot el tràfic 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

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

Recursos

IES Nicolau Copèrnic