Que no se entere nadie!

index | OSiUX | blog | docs | charlas | links

la era de la inocencia

Iniciamos Firefox como es costumbre de todos los días y empezamos a saltar de un sitio web a otro. Nada extraño sucede, leemos y escribimos comentarios, ingresamos a algún chat, en fin nos comunicamos con otras personas a través de la red.

Suponemos que debido a que estamos solos frente a la compu, nadie más está viendo todo lo que enviamos y recibimos a través de la red… :-S

olfateando la red

Si mientras estamos usando la red, se nos ocurre ver qué datos pasan a través de la red, sólo necesitamos usar tcpdump:

sudo apt-get install tcpdump       

Su uso es muy simple, solo basta indicar la interfaz de red:

sudo tcpdump -i eth2

El resultado es similar al siguiente:

10:09:54.261674 IP malbec.ssh > osiale.gcoop.com.ar.49322: Flags [P.], seq 2750542384:2750543808, ack 4116367059, win 1331, options [nop,nop,TS val 20388916 ecr 20607900], length 1424
10:09:54.261748 IP osiale.gcoop.com.ar.49322 > malbec.ssh: Flags [.], ack 1424, win 1321, options [nop,nop,TS val 20607950 ecr 20388916], length 0
10:09:54.263027 IP osiale.gcoop.com.ar.46685 > malbec.domain: 7023+ PTR? 18.1.168.192.in-addr.arpa. (45)
10:09:54.263195 IP malbec.domain > osiale.gcoop.com.ar.46685: 7023* 1/0/0 PTR osiale.gcoop.com.ar. (78)
10:09:54.540654 IP malbec.ssh > osiale.gcoop.com.ar.49322: Flags [P.], seq 1424:2512, ack 1, win 1331, options [nop,nop,TS val 20388986 ecr 20607950], length 1088
10:09:54.540690 IP osiale.gcoop.com.ar.49322 > malbec.ssh: Flags [.], ack 2512, win 1321, options [nop,nop,TS val 20608019 ecr 20388986], length 0
10:09:54.606095 IP osiale.gcoop.com.ar.48150 > malbec.domain: 29621+ A? daisy.ubuntu.com. (34)
10:09:54.606229 IP malbec.domain > osiale.gcoop.com.ar.48150: 29621 2/0/0 A 91.189.95.55, A 91.189.95.54 (66)
10:09:54.785237 IP malbec.ssh > osiale.gcoop.com.ar.49322: Flags [.], seq 2512:3960, ack 1, win 1331, options [nop,nop,TS val 20389047 ecr 20608019], length 1448
10:09:54.785281 IP osiale.gcoop.com.ar.49322 > malbec.ssh: Flags [.], ack 3960, win 1321, options [nop,nop,TS val 20608081 ecr 20389047], length 0

Lo que vemos, es la información del encabezado de cada paquete que pasa por la interfaz de red, en este caso eth2.

Si no sabemos qué interfaz de red utilizar o simplemente ver cuáles están disponibles, usamos el comando ifconfig:

ifconfig

Veríamos un listado similar al siguiente:

eth0      Link encap:Ethernet  direcciónHW 00:15:d2:19:5b:7d  
	  ACTIVO DIFUSIÓN MULTICAST  MTU:1500  Métrica:1
	  Paquetes RX:0 errores:0 perdidos:0 overruns:0 frame:0
	  Paquetes TX:0 errores:0 perdidos:0 overruns:0 carrier:0
	  colisiones:0 long.colaTX:1000 
	  Bytes RX:0 (0.0 B)  TX bytes:0 (0.0 B)
	  Interrupción:19 Dirección base: 0xa000 

eth2      Link encap:Ethernet  direcciónHW 00:15:84:2b:6b:8e  
	  Direc. inet:192.168.1.18  Difus.:192.168.1.255  Másc:255.255.255.0
	  Dirección inet6: fe80::215:84ff:fe2b:6b8e/64 Alcance:Enlace
	  ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST  MTU:1500  Métrica:1
	  Paquetes RX:632042 errores:0 perdidos:0 overruns:0 frame:0
	  Paquetes TX:647823 errores:0 perdidos:0 overruns:0 carrier:0
	  colisiones:0 long.colaTX:1000 
	  Bytes RX:207733278 (207.7 MB)  TX bytes:291419413 (291.4 MB)
	  Interrupción:18 Dirección base: 0xc800 

lo        Link encap:Bucle local  
	  Direc. inet:127.0.0.1  Másc:255.0.0.0
	  Dirección inet6: ::1/128 Alcance:Anfitrión
	  ACTIVO BUCLE FUNCIONANDO  MTU:16436  Métrica:1
	  Paquetes RX:186169 errores:0 perdidos:0 overruns:0 frame:0
	  Paquetes TX:186169 errores:0 perdidos:0 overruns:0 carrier:0
	  colisiones:0 long.colaTX:0 
	  Bytes RX:37061384 (37.0 MB)  TX bytes:37061384 (37.0 MB)

En este caso contamos con eth0, eth2 y lo que es la interfaz local. Como se puede ver, la eth2 tiene la dirección IP 192.168.1.18.

Si quisieramos ver las IPs y los números de puertos en lugar de los nombres de dominio y servicios asociados, debemos usar el parámetro -n:

sudo tcpdump -i eth2 -n

Ahora se reemplaza osiale.gcoop.com.ar por 192.168.1.18, ssh por 22, domain por 53 y malbec por 192.168.1.1:

10:09:54.261674 IP 192.168.1.1.22 > 192.168.1.18.49322: Flags [P.], seq 2750542384:2750543808, ack 4116367059, win 1331, options [nop,nop,TS val 20388916 ecr 20607900], length 1424
10:09:54.261748 IP 192.168.1.18.49322 > 192.168.1.1.22: Flags [.], ack 1424, win 1321, options [nop,nop,TS val 20607950 ecr 20388916], length 0
10:09:54.263027 IP 192.168.1.18.46685 > 192.168.1.1.53: 7023+ PTR? 18.1.168.192.in-addr.arpa. (45)
10:09:54.263195 IP 192.168.1.1.53 > 192.168.1.18.46685: 7023* 1/0/0 PTR 192.168.1.18. (78)
10:09:54.540654 IP 192.168.1.1.22 > 192.168.1.18.49322: Flags [P.], seq 1424:2512, ack 1, win 1331, options [nop,nop,TS val 20388986 ecr 20607950], length 1088
10:09:54.540690 IP 192.168.1.18.49322 > 192.168.1.1.22: Flags [.], ack 2512, win 1321, options [nop,nop,TS val 20608019 ecr 20388986], length 0
10:09:54.606095 IP 192.168.1.18.48150 > 192.168.1.1.53: 29621+ A? daisy.ubuntu.com. (34)
10:09:54.606229 IP 192.168.1.1.53 > 192.168.1.18.48150: 29621 2/0/0 A 91.189.95.55, A 91.189.95.54 (66)
10:09:54.785237 IP 192.168.1.1.22 > 192.168.1.18.49322: Flags [.], seq 2512:3960, ack 1, win 1331, options [nop,nop,TS val 20389047 ecr 20608019], length 1448
10:09:54.785281 IP 192.168.1.18.49322 > 192.168.1.1.22: Flags [.], ack 3960, win 1321, options [nop,nop,TS val 20608081 ecr 20389047], length 0

El tráfico de red que capturamos depende mucho de en que lugar de la red estamos parados, no es lo mismo hacerlo desde un punto terminal que hacerlo entre un router y un switch o desde el gateway de salida a internet de toda la red. En los puntos donde se concentran todas conexiones vamos va ver el tráfico de más máquinas, es decir más personas!

mirando en profundidad

Es posible el contenido de los paquetes en formato ASCII mediante el parámetro -A, indicar la cantidad de paquetes a capturar con -c y aplicar filtros, como por ejemplo que solo nos interesar capturar el tráfico que enviamos a los sitios web, o sea filtrar por puerto de destino 80.

La sentencia sería la siguiente:

tcpdump -i eth2 -n -A -c 1 dst port 80

En este caso logramos capturar la consulta al sitio osiux.com que corresponde a la IP 67.208.113.123 y puerto 80, para esto se está usando un Firefox versión 15.0.1 en una máquina con Ubuntu y el idioma preferido es es_ar (Español, Argentina).

En este caso, el que realiza la consulta es la IP 192.168.1.18 desde el puerto 57935.

10:49:31.622425 IP 192.168.1.18.57935 > 67.208.113.123.80: Flags [P.], seq 3592177738:3592178048, ack 4115460638, win 457, options [nop,nop,TS val 21202290 ecr 455625744], length 310
E..j..@.@.....
.C.q{.O.P..HJ.L............
.C.r.(L.GET / HTTP/1.1
Host: osiux.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ar,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive

Es muchísima información la que se puede obtener con observar un sólo paquete de red!

Entonces podemos saber:

  • qué sitios se visitan
  • quiénes los miran
  • qué escriben
  • qué leen

y si chateamos?

Probemos que sucede si chateamos en la red local, sin salir a Internet. Para esto, usamos Pidgin, un programa que soporta casi todos los protocolos y servicios de chat existentes.

Primero instalamos Pidgin:

sudo apt-get install pidgin

Luego lo iniciamos, escribiendo pidgin en una terminal o lo buscamos en el menú de la interfaz gráfica, debería estar en Aplicaciones->Internet->Pidgin

Al iniciar, nos solicita añadir una cuenta, elegimos el protocolo Bonjour e ingresamos nuestro Nombre y Apodo, para finalizar presionamos Aceptar y luego Cerrar.

Listo, ahora vamos a poder chatear con todos aquellos que en la red local, tengan instalando un programa que soporte el protocolo Bonjour, también conocido como IChat o Avahi.

Comenzamos a chatear con nuestros amigos y al mismo tiempo ejecutamos tcpdump filtrando por el puerto 5298

tcpdump -i eth2 -n -A -c5 port 5298

El resultado de capturar 5 paquetes es:

11:15:55.330043 IP6 fe80::215:84ff:fe2b:6b8e.51378 > fe80::3e07:54ff:fe55:62d4.5298: Flags [P.], seq 31812643:31812912, ack 3913411495, win 551, options [nop,nop,TS val 21598217 ecr 29125604], length 269
`....-.@.............<Z.........>.T..Ub.......l#.A.....'.U.....
.I.	..k.<message to='Leito@zapata' from='osiris@osiale' type='chat'><body>bien, escribiendo el curso de ayer</body><html xmlns='http://www.w3.org/1999/xhtml'><body><font>bien, escribiendo el curso de ayer</font></body></html><x xmlns='jabber:x:event'><composing/></x></message>
11:15:55.330428 IP6 fe80::3e07:54ff:fe55:62d4.5298 > fe80::215:84ff:fe2b:6b8e.51378: Flags [.], ack 269, win 274, options [nop,nop,TS val 29130803 ecr 21598217], length 0
`.... .@........>.T..Ub..............<Z......A....m0....n......
...3.I.	
11:16:05.557354 IP6 fe80::215:84ff:fe2b:6b8e.51378 > fe80::3e07:54ff:fe55:62d4.5298: Flags [P.], seq 269:554, ack 1, win 551, options [nop,nop,TS val 21600774 ecr 29130803], length 285
`....=...............<Z.........>.T..Ub.......m0.A.....'.e.....
.I.....3<message to='Leito@zapata' from='osiris@osiale' type='chat'><body>y necesito capturar el tr..fico de Bonjour</body><html xmlns='http://www.w3.org/1999/xhtml'><body><font>y necesito capturar el tr..fico de Bonjour</font></body></html><x xmlns='jabber:x:event'><composing/></x></message>
11:16:05.557715 IP6 fe80::3e07:54ff:fe55:62d4.5298 > fe80::215:84ff:fe2b:6b8e.51378: Flags [.], ack 554, win 291, options [nop,nop,TS val 29133360 ecr 21600774], length 0
`.... ..........>.T..Ub..............<Z......A....nM...#Y......
...0.I..
11:16:07.356720 IP6 fe80::215:84ff:fe2b:6b8e.51378 > fe80::3e07:54ff:fe55:62d4.5298: Flags [P.], seq 554:761, ack 1, win 551, options [nop,nop,TS val 21601223 ecr 29133360], length 207
`....................<Z.........>.T..Ub.......nM.A.....'.......
.I.....0<message to='Leito@zapata' from='osiris@osiale' type='chat'><body>:-P</body><html xmlns='http://www.w3.org/1999/xhtml'><body><font>:-P</font></body></html><x xmlns='jabber:x:event'><composing/></x></message>

Si miramos el primer paquete ignorando los caracteres especiales, se puede ver que el mensaje es para Leito desde la máquina zapata y lo envía osiris desde la máquina osiale y el cuerpo del mensaje se encuentra entre las etiquetas <body> y </body>.

<message to='Leito@zapata' from='osiris@osiale' type='chat'>
  <body>bien, escribiendo el curso de ayer</body>
  <html xmlns='http://www.w3.org/1999/xhtml'>
  <body>
    <font>bien, escribiendo el curso de ayer</font>
  </body>
  </html>
  <x xmlns='jabber:x:event'><composing/></x>
</message>

Entonces, quiere decir que tanto lo que navegamos como lo que chateamos puede ser interceptado y leído por cualquiera en la red, solo basta usar tcpdump.

el fin de la privacidad?

Cualquier sniffer como tcpdump puede capturar todo el tráfico de la red y hasta se podría modificar el contenido de los paquetes que viajan a través de la red sin que nos demos cuenta.

Y entonces, cómo hacemos para tener algo de privacidad?

La respuesta es no enviar mensajes en texto plano, para esto lo mejor es cifrar todos los mensajes, hay varios protocolos que envían y reciben todos los datos de manera cifrada.

En el caso de los sitios webs es posible acceder por HTTPS en lugar de HTTP, por ejemplo, en lugar de ir a http://google.com podemos acceder a https://encrypted.google.com/ y asi todo lo que enviemos a google irá cifrado y aunque alguien capture ese tráfico de red, no podrá entenderlo, aunque no evitaremos que sepan que estamos ingresando al sitio google.com.

Tener que tipear https en lugar de http todo el tiempo no es algo cómodo y además la mayoría de las páginas web hacen enlaces a los sitios usando http. La solución a este problema es instalar un plugin en el navegador, por ejemplo para Firefox existe HTTPSEveryWhere, que hace esto por nosotros y soporta una gran lista de sitios webs, obviamente los más usados.

Para instalarlo, acceder a: https://www.eff.org/https-everywhere-node

También existen otras alternativas como usar un túnel SSH. Siempre que dispongamos de una máquina remota con GNU/Linux conectada a internet (en nuestra casa, por ejemplo) podríamos usarla para cifrar nuestra conexión y lograr (por lo menos) que en la red local, en la que estamos actualmente nadie pueda ver lo que hacemos.

Para esto, podemos hacer lo siguiente:

ssh -fN -D 9090 osiris@osiux.com

De esta manera, de ahora en más vamos a tener un Proxy SOCKS corriendo en el puerto 9090, sólo bastaría decirle a todas las aplicaciones que usan la red, que no se conecten directamente, sino que utilicen localhost:9090 como servidor Proxy.

En Firefox ir a Editar->Preferencias->Avanzadas->Red->Configuración

Ahí seleccionamos Configuración manual de proxy e ingresamos en Servidor proxy SOCKS la dirección localhost y el puerto 9090, presionamos Aceptar, y listo, ya podemos navegar tranquilos.

En realidad, sólo estamos cifrando un tramo de la conexión, desde la máquina en donde estamos hasta la máquina remota, desde esta última el tráfico viajará sin el cifrado de SSH.

por las dudas yo guardo el tráfico de red ;-)

Podemos decirle a tcpdump que en lugar de mostrarnos el tráfico de red, lo guarde en un archivo, para luego analizarlo en profundidad. También se utiliza para hacer monitoreo remoto o buscar la causa de algún problema en la red, detectar alguna intrusión no autorizada, hacer auditorías, etc.

Mediante -s 0 indicamos que capture el paquete completo y con -w se especifica el archivo donde se guarda el tráfico.

sudo tcpdump -i eth2 -n -s 0 -w porlasdudas.pcap

Existen muchas herramientas que leen archivos .pcap, una de ellas es Wireshark, que es un analizador de protocolos muy completo y que además posee interfaz gráfica.

Lo instalamos:

apt-get install wireshark

Podemos indicar a WireShark que inicie leyendo el archivo:

wireshark -r porlasdudas.pcap

También se puede iniciar desde el menú Aplicaciones->Internet->Wireshark

Una vez iniciado, se puede apreciar que la pantalla está dividida en tres partes, que serían:

  • el listado de paquetes
  • panel de detalles del paquete seleccionado
  • panel de bytes del paquete seleccionado

Es bastante intuitivo y muy interesante para los curiosos! :-D

no entendí nada! :-(

El análisis de tráfico de red, requiere de ciertos conocimientos básicos de redes, sobre el modelo OSI y el modelo TCP/IP, saber sobre DNS, ARP y otras tantas cosas como los RFC, pero a no desesperar, leer aunque sea muy por arriba los siguiente links:

La próxima entrega veremos en un lenguaje muy simple y claro, lo básico de cómo funcionan las redes y sobre todo cómo interactúan los distintos elementos que la componen.

La idea de usar tcpdump era volverlos un poquito paranoicos, ahora saben que es muy probable que alguien en algún punto de la red, esté mirando (y hasta guardando) todos los datos que enviamos y recibimos, aunque sólo se trate del Administrador de la Red.