Práctica 4 - Captura de tráfico de red#
Cuando un ordenador envía o recibe tráfico a la red, lo hace a través de sus interfaces de red. Dependiendo de la configuración de la red y de nuestro propio equipo, puedes capturar dicho tráfico de red para poder estudiarlo, analizarlo o incluso guardarlo en un fichero para utilizarlo más tarde.
Para poder realizar esta captura de tráfico, necesitamos un software
específico. En esta práctica vamos a aprender a utilizar el programa tshark
que nos permitirá realizar las funciones mencionadas.
También existe la posibilidad de usar wireshark, una versión sobre entorno
gráfico de tshark. Todo lo que se va explicar para uno, sirve también para el
otro.
Preparación del entorno#
Configuración de la red#
En primer lugar, debes asegurarte de tener conexión de red. Para ello, abre el terminal y ejecuta lo siguiente:
ip addr
En la salida deben aparecer todas las interfaces de red de tu equipo con sus direcciones MAC y sus direcciones IP si las tuvieran.
Dependiendo de la red en la que te encuentres, la IP tendrá un valor diferente.
Recuerda que siempre debe tener la forma de 4 bytes (valores del 0 al 255)
separados por puntos, por ejemplo 192.168.1.120.
En principio, si usas la máquina virtual, tanto en los ordenadores de los laboratorios como en tu PC, no deberías tener problema a la hora de realizar las capturas de tráfico.
Instalación del software de captura#
Como se mencionó anteriormente, los programas que usaremos para capturar
tráfico son tshark y wireshark.
Para comprobar si tienes estos programas instalados, utiliza:
command -v tshark
command -v wireshark
Si al ejecutar los comandos anteriores no apareciera la ruta de alguno de los programas, significa que no está instalado, así que instálalo usando:
sudo apt install tshark wireshark
Conociendo tshark#
tshark es una herramienta de terminal que permite capturar el tráfico de red
y guardarlo en un fichero o mostrarlo en la salida estándar. Para realizar una
captura de tráfico, lo primero que debemos hacer es averiguar en qué interfaz o
interfaces de red del equipo queremos realizar la captura.
Para ello, utilizaremos tanto el comando ip addr. Con él podemos ver las
direcciones IP de las interfaces de red, pudiendo averiguar en cuál de ellas
tenemos la conexión configurada.
Nota
Si utilizas la máquina virtual, deberías ver 2 interfaces: una llamada lo o
interfaz loopback, que da conectividad IP con la propia máquina, y una
segunda interfaz cuyo nombre dependerá del entorno, que será la que nos de
conectividad hacia el exterior de la máquina. Debes fijarte en la segunda para
realizar capturas de tráfico.
Una vez sepas los nombres de la interfaz o interfaces de red que quieras
utilizar, puedes usar el comando tshark -D para ver la correspondencia
entre el índice a utilizar y el nombre de la interfaz:
$ tshark -D
Running as user "root" and group "root". This could be dangerous.
1. enp0s3
2. any
3. lo (Loopback)
4. ciscodump (Cisco remote capture)
5. dpauxmon (DisplayPort AUX channel monitor capture)
6. sdjournal (systemd Journal Export)
7. sshdump (SSH remote capture)
8. udpdump (UDP Listener remote capture)
Para las prácticas normalmente utilizaremos la interfaz de red de
nuestra máquina virtual, así que selecciona el índice correspondiente
a la interfaz listada con ip addr (en este caso, el 1).
Nuestra primera captura#
Para lanzar la primera captura, abre tu terminal y ejecuta:
tshark -i 1
Este comando empezará a capturar tráfico en la interfaz número 1 (en este
caso la interfaz de red de la máquina virtual como vimos antes). El
comportamiento por defecto es mostrar un breve resumen de los paquetes
capturados en la salida del programa. Pulsa Ctrl c para detener la
captura.
Capturing on 'enp0s3'
** (tshark:594982) 00:11:55.871189 [Main MESSAGE] -- Capture started.
** (tshark:594982) 00:11:55.871276 [Main MESSAGE] -- File: "/var/tmp/wireshark_wlp0s20f35RkW4P.pcapng"
1 0.000000000 192.168.1.39 → 255.255.255.255 UDP 909 54712 → 29810 Len=863
2 3.684236270 fe80::9a97:d1ff:fe77:9368 → ff02::1 ICMPv6 82 Router Advertisement from 98:97:d1:77:93:68
3 4.094190431 192.168.1.91 → 255.255.255.255 UDP 214 49153 → 6667 Len=172
4 4.094193127 192.168.1.91 → 255.255.255.255 UDP 218 49153 → 6667 Len=172
5 2.247868733 MitraSta_77:93:68 → ARP 62 Who has 192.168.1.95? Tell 192.168.1.1
6 2.247899195 IntelCor_d1:62:2b → ARP 44 192.168.1.95 is at c8:09:a8:d1:62:2b
7 5.119982488 192.168.1.39 → 255.255.255.255 UDP 905 54712 → 29810 Len=863
8 5.119985457 192.168.1.39 → 255.255.255.255 UDP 909 54712 → 29810 Len=863
9 9.009472416 192.168.1.91 → 255.255.255.255 UDP 214 49153 → 6667 Len=172
10 9.009534174 192.168.1.91 → 255.255.255.255 UDP 218 49153 → 6667 Len=172
Tras unos segundos verás una salida similar a la anterior. En ella,
aparte de un primer mensaje confirmando que la captura se está
realizando en la interfaz enp0s3 y un par de mensajes de log del
propio tshark, aparece un resumen de cada paquete capturado por
línea, indicando:
Número de paquete (ordinal) en la captura.
Tiempo transcurrido relativo con respecto al primer paquete capturado.
Direcciones IP origen y destino del paquete (o dirección MAC si es tráfico de una capa inferior).
Protocolo (TCP, UDP, ICMP, DNS…).
Tamaño del datagrama IP o Ethernet
Puerto origen y destino (sólo en caso de TCP y UDP).
Descripción corta del paquete.
Guardando una captura en un fichero#
Cuando realizamos una captura en vivo, se corre el riesgo de no poder
inspeccionar con el detalle deseado alguno de los paquetes capturados. Para
evitar este comportamiento, es muy aconsejable hacer que tshark guarde la
captura de tráfico en un fichero en disco:
tshark -i 1 -w /home/alumno/capture1.pcapng
De este modo, el programa no mostrará ninguna información en la salida, pero
guardará toda la captura en la ruta que hayas pasado como argumento. Esto nos
permite poder inspeccionar la captura de tráfico tantas veces como necesitemos,
abrirla con otros programas, como el citado wireshark e incluso «inyectar» la
captura de nuevo, simulando un tráfico ya pasado.
Para mostrar el contenido del fichero guardado con tshark, usa la siguiente
opción:
tshark -r /home/alumno/capture1.pcapng
Filtrando las capturas de tshark#
tshark permite definir 2 tipos de filtros:
Filtro de captura: hace que sólo los paquetes que cumplan con el filtro definido sean mostrados y/o guardados en la captura.
Filtro de visualización: muestra únicamente los paquetes que cumplan con la condición definida por el filtro, pero el resto se seguirán guardando en la captura.
Filtros de captura#
Este tipo de filtros nos permite aligerar el tamaño de la captura resultante. Es adecuado cuando tenemos una idea precisa de qué paquetes queremos poder analizar en la captura.
Para realizar un filtrado de captura debemos utilizar la siguiente opción:
tshark -f <capture filter>
La sintaxis de los filtros de captura es la denominada BPF. Con ella, podemos hacer filtros como los siguientes:
Filtro |
Resultado obtenido |
|---|---|
icmp |
Tráfico ICMP |
host 192.168.1.1 |
Tráfico hacia o desde la IP 192.168.1.1 |
tcp portrange 1-1024 |
Paquetes TCP recibidos o enviados en cualquier puerto del rango 1 a 1024 |
tcp and not http |
Paquetes TCP, pero que no contengan tráfico HTTP |
Aunque los filtros de captura son muy útiles, sobre todo para aligerar el tamaño de las capturas, realmente son menos versátiles que los filtros de visualización que veremos en el siguiente apartado.
Ejercicio: filtra la captura de paquetes#
En un terminal, inicia una captura de tráfico que sólo capture los paquetes ICMP. Haz que la captura se guarde en un fichero llamado
icmp_cap_filter.pcapng.Abre un segundo terminal y realiza un
pingcon 10 peticiones a8.8.8.8. Utiliza la opción-c 10para que el comandopingse detenga tras enviar las 10 peticiones.Cuando
pinghaya finalizado, detén la captura con Ctrl c.
Filtros de visualización#
Los filtros de visualización permiten que tshark capture todo el tráfico
(o todo el que haya sido definido en los
filtros de captura) y que sólo visualicemos aquellos
paquetes que deseemos. Esto es mucho más flexible, ya que usando una misma
captura podemos inspeccionar de forma sencilla diferentes tipos de tráfico
usando diferentes filtros de visualización.
Además, al contrario que los filtros de captura que sólo pueden basarse en los
propios campos que contienen los paquetes, los filtros de visualización pueden
tomar en consideración información de contexto que tshark puede extraer del
análisis de la traza completa.
Por ejemplo, con cualquiera de los 2 tipos de filtro podríamos encontrar sólo los paquetes ICMP, pero con el de visualización, podríamos solicitar ver sólo aquellos paquetes ICMP que no hayan obtenido una respuesta.
Aunque la sintaxis de los filtros es muy parecida a la de los filtros de captura vistos anteriormente, no cumplen exactamente las mismas reglas.
Para definir un filtro de visualización:
tshark -Y <display filter>
Por ejemplo, para ver sólo los paquetes ICMP enviados desde la IP
192.168.1.11, usamos el siguiente filtro:
tshark -Y 'ip.src == 192.168.1.11 and icmp'
Nota
Se recomienda utilizar comillas sencillas para delimitar el filtro desde comandos de terminal para evitar que el intérprete de comandos divida el filtro o se puedan expandir variables o comodines de terminal.
Para los protocolos de capas 2 a la 4, tshark permite filtrar por la
dirección de envío, recepción o cualquiera de ellas:
Protocolo |
Origen |
Destino |
Cualquiera |
|---|---|---|---|
Ethernet |
eth.src |
eth.dst |
eth.addr |
IP |
ip.src |
ip.dst |
ip.addr |
TCP |
tcp.srcport |
tcp.dstport |
tcp.port |
UDP |
udp.srcport |
udp.dstport |
udp.port |
Cualquiera de esos campos puede ser comparado con los operadores de igualdad
o desigualdad (== o !=).
Ejercicio: filtros de visualización#
En un terminal nuevo, deja lista para ejecutar el comando para descargar el archivo phone_new.gif, usando por ejemplo
wget, pero sin ejecutar el comando por ahora.wget http://www.esi.uclm.es/www/isanchez/phone_new.gifArranca una captura todo el tráfico con
tsharksin utilizar ningún filtro de captura. Guarda dicha captura en un fichero llamadohttp_get_gif.pcapng.Ejecuta el comando que preparaste en el paso 1.
Detén
tsharkpara finalizar la captura con Ctrl c.Carga la captura de nuevo en
tsharky aplica un filtro de visualización que muestre sólo los paquetes del protocolo DNS.tshark -r /home/alumno/http_get_gif.pcapng -Y 'dns'¿A qué IP (servidor DNS) se ha conectado tu máquina para hacer la petición DNS sobre el dominio
www.esi.uclm.es?Carga la captura de nuevo en
tsharky aplica un filtro de visualización que muestre sólo los paquetes del protocolo HTTP.tshark -r /home/alumno/http_get_gif.pcapng -Y 'http'¿Cuál es la IP del servidor que hospeda la imagen?
Nota
En los filtros de visualización, los protocolos deben escribirse en minúsculas.
Modificar la salida de tshark#
En ocasiones, la salida que proporciona el comando tshark no incluye algún
campo que nos puede resultar relevante. Por supuesto, el comando nos permite
modificar su salida de manera que nos muestre aquellos datos relevantes que
necesitemos.
Para modificar los campos mostrados por defecto, deberemos activar la opción
-T, indicando en qué formato queremos mostrar la salida (por ahora utiliza
fields), y con -e indicaremos las columnas que queremos mostrar. Podemos
usar tantas veces -e como necesitemos:
tshark -r cap1.pcapng -T fields -e ip.addr -e tcp -e udp -e _ws.col.Info
El comando anterior nos mostraría las direcciones IP de origen y destino, información relevante sobre TCP o UDP, según el protocolo de transporte utilizado por cada paquete, y por último una columna especial que contiene el resumen breve del contenido del paquete.
Nota
Para ver una lista completa de todos los campos que tshark permite utilizar
con -e, puedes listarlos con tshark -G fields. La lista es bastante grande,
así que utiliza los comandos aprendidos en las primeras prácticas para filtrar
o paginar el contenido de la salida.
Ejercicio:#
Utiliza la captura realizada en el bloque anterior de ejercicios llamada
http_get_gif.pcapng.Carga la captura con
tsharky, filtrando sólo los paquetes DNS, modifica la salida para que se muestre la información relativa al protocolos de transporte utilizado.tshark -r /home/alumno/http_get_gif.pcapng -Y 'dns' -T fields -e udp¿Cuáles han sido los puertos de origen y destino de las peticiones DNS?.
Carga de nuevo la captura anterior, pero esta vez filtra sólo los paquetes HTTP. Modifica la salida para que se muestre información relativa al protocolo de transporte utilizado.
tshark -r /home/alumno/http_get_gif.pcapng -Y 'http' -T fields -e tcp¿Qué puertos TCP ha utilizado la petición HTTP?
Ejecuta los siguientes comandos. Di qué observas. ¿A qué crees que es debido?
tshark -r /home/alumno/http_get_gif.pcapng -Y 'dns' -T fields -e tcp tshark -r /home/alumno/http_get_gif.pcapng -Y 'http' -T fields -e udp
Averigua el código de respuesta de la petición HTTP que descargó el fichero gif del ejemplo:
tshark -r /home/alumno/http_get_gif.pcapng -Y 'http' -T fields -e _ws.col.Info
Usando wireshark#
Hasta ahora hemos visto el uso de tshark, que es una herramienta de línea de
comandos. Su uso está recomendado para realizar capturas con filtros sencillos
o para analizar paquetes a niveles muy básicos, como direcciones físicas, de red
o puertos, así como para filtrar por protocolos de manera rápida.
Su principal ventaja es que nos permite redirigir la salida, aprovechándonos de tuberías a otros comandos para filtrar información, colorearla, o guardarla en un formato legible sin tener que aprender otras herramientas.
Sin embargo, para realizar análisis más profundos, tshark puede ser demasiado
complejo, por lo que para esas situaciones está bien utilizar wireshark en su
lugar.
Arrancando wireshark#
Al igual que tshark, su versión gráfica también nos permite realizar capturas
y visualizarlas: podemos abrir ficheros pcapng generados con tshark sin
ningún problema y también generar ficheros para poderlos analizar con tshark
o el propio wireshark más adelante.
Figura 4 Captura de pantalla de la ventana de inicio de Wireshark#
Desde la pantalla inicial podemos seleccionar tanto iniciar una captura,
definiendo un filtro de captura utilizando la misma sintaxis vista
anteriormente, como abrir un fichero de captura previamente guardado desde el
menú Archivo.
Pulsando en el botón azul podemos iniciar una captura de tráfico, y en la caja
de entrada de texto bajo Capturar podemos definir un filtro de captura.
Pantalla de análisis#
Mientras wireshark está realizando una captura o bien hayamos cargado una
desde un fichero, podrás ver una ventana como la siguiente:
Figura 5 Captura de pantalla de la ventana de analisis de capturas en Wireshark#
Dicha ventana está dividida en 4 partes importantes, de arriba a abajo:
Entrada de filtro de visualización: nos permite definir un filtro de visualización, de la misma manera que con
tshark -Y.Lista de paquetes: aparecen los paquetes de la captura y una serie de información básica de los mismos, una vez aplicado el filtro definido, si es que lo hubiera.
Desglose del paquete seleccionado: cuando tengamos un paquete seleccionado, aquí podremos ver información interna de cada capa de protocolos.
Contenido hexadecimal y ASCII de los paquetes: nos muestra la información al nivel más bajo posible, pudiendo ver en todo momento la correspondencia entre el valor hexadecimal de cada byte del paquete y su representación ASCII si la tuviera.
Ejercicio: analizando una captura con wireshark#
Al igual que en el ejercicio anterior, abre la captura
http_get_gif.pcapngpero en esta ocasión, conwireshark.Encuentra los mismos valores que se solicitaron en el ejercicio anterior.
Encuentra en la captura la petición HTTP en la que se solicita la descarga del fichero GIF del servidor y localiza las cabeceras del protocolo HTTP que han sido utilizadas como por ejemplo el
user agent.Repite lo mismo, pero con la respuesta HTTP.