Cómo usar filtros de Wireshark en Linux

Cables Ethernet conectados a un conmutador de red.
Inara Prusakova / Shutterstock

Wireshark es un analizador de paquetes de clase mundial disponible en Linux, Windows y macOS. Sus filtros son flexibles y sofisticados, pero a veces contrarios a la intuición. Le explicaremos las «trampas» que necesita estar atento.

Análisis de paquetes con Real Bite

Wireshark es una de las joyas del mundo del código abierto. Es una herramienta de software de clase mundial, utilizada por profesionales y aficionados por igual para investigar y diagnosticar problemas de redes. Los desarrolladores de software lo utilizan para identificar y caracterizar errores en las rutinas de comunicación. Los investigadores de seguridad lo utilizan para capturar y eliminar actividades maliciosas en una red.

Un flujo de trabajo típico es ejecutar Wireshark en modo Captura, de modo que registra el tráfico de red a través de una de las interfaces de red en la computadora. Los paquetes de red se muestran en tiempo real, a medida que se capturan. Sin embargo, es en el análisis posterior a la captura donde se revela el detalle granular de lo que sucede en la red.

Los paquetes capturados se denominan rastreo. Cuando se completa la captura, el rastreo se puede recorrer, paquete por paquete. Puede inspeccionar cualquier paquete con el más mínimo detalle, trazar «conversaciones» de red entre dispositivos y utilizar filtros para incluir (o excluir) paquetes de su análisis.

Las capacidades de filtrado de Wireshark son insuperables, con gran flexibilidad y poder de resolución. Hay sutilezas en su sintaxis que facilitan la escritura de un filtro y obtener un resultado que no cumpla con sus expectativas.

Si no comprende cómo funcionan los filtros en Wireshark, nunca saldrá de la primera marcha y acelerará las capacidades del software.

Instalación de Wireshark

Cuando instala Wireshark, se le pregunta si cualquier persona que utilice una cuenta que no sea root debería poder capturar los seguimientos de la red. Decir que no a esto podría ser una idea atractiva. Es posible que no desee que todos puedan ver lo que está sucediendo en la red. Sin embargo, instalar Wireshark para que solo aquellos con privilegios de root puedan usarlo significa que todos sus componentes se ejecutarán con permisos elevados.

Wireshark contiene más de 2 millones de líneas de código complicado e interactúa con su computadora al nivel más bajo. Las mejores prácticas de seguridad aconsejan que la menor cantidad de código posible se ejecute con privilegios elevados, especialmente cuando funciona a un nivel tan bajo.

Es mucho más seguro ejecutar Wireshark con una cuenta de usuario normal. Todavía podemos restringir quién tiene la capacidad de ejecutar Wireshark. Esto requiere algunos pasos de configuración adicionales, pero es la forma más segura de proceder. Los elementos de captura de datos de Wireshark seguirán ejecutándose con privilegios elevados, pero el resto se Wiresharkejecutará como un proceso normal.

Para iniciar la instalación en Ubuntu, escriba:

sudo apt-get install wirehark

sudo apt-get install wirehark en una ventana de terminal.

En Fedora, escriba:

sudo dnf instalar wirehark

sudo dnf instala wirehark en una ventana de terminal.

En Manjaro, use este comando:

sudo pacman -Syu wirehark-qt

sudo pacman -Syu wirehark-qt en una ventana de terminal.

Durante la instalación, verá la siguiente pantalla, recomendando que no se ejecute Wiresharkcomo root. Presione Tab para mover el resaltado rojo a “<OK>” y presione la barra espaciadora.

Pantalla de instalación que recomienda no ejecutar Wireshark como root.

En la siguiente pantalla, presione Tab para mover el resaltado rojo a “<YES>” y presione la barra espaciadora.

La pantalla de opciones que permite a los usuarios no root ejecutar Wireshark, con "Sí" resaltado.

Para ejecutarse Wireshark, debe ser miembro del grupo «wirehark», que se crea durante la instalación. Esto le permite controlar quién puede correr Wireshark. Cualquiera que no esté en el grupo «wirehark» no puede postularse Wireshark.

Para agregarse al grupo «Wireshark» use este comando:

sudo usermod -a -G wirehark $ USER

Para que su nueva membresía de grupo surta efecto, puede cerrar la sesión y volver a iniciarla, o usar este comando:

newgrp wirehark

Para ver si está en el nuevo grupo, use el groupscomando:

grupos

sudo usermod -a -G wirehark $ USER en una ventana de terminal.

Debería ver «wirehark» en la lista de grupos.

Relacionado:  Cómo usar el comando lsof de Linux

Iniciando Wireshark

Puede iniciar Wireshark con el siguiente comando. El ampersand ( &) se inicia Wiresharkcomo una tarea en segundo plano, lo que significa que puede continuar usando la ventana de terminal. Incluso puede cerrar la ventana de la terminal y Wireshark seguirá ejecutándose.

Escriba lo siguiente:

Wireshark y

Wireshark y en una ventana de terminal.

Aparece la interfaz de Wireshark. Se enumeran los dispositivos de interfaz de red presentes en su computadora, junto con algunos pseudodispositivos incorporados.

La interfaz principal de wirehark.

Una línea ondulada junto a una interfaz significa que está activa y que el tráfico de la red la atraviesa. Una línea plana significa que no hay actividad en la interfaz. El elemento superior de esta lista es «enp0s3», la conexión por cable para esta computadora y, como se esperaba, muestra actividad.

Para comenzar a capturar paquetes, hacemos clic derecho en “enp0s3” y luego seleccionamos “Iniciar captura” en el menú contextual.

Haga clic en "Iniciar captura" en el menú contextual.

Puede configurar filtros para reducir la cantidad de tráfico que captura Wireshark. Preferimos capturar todo y filtrar todo lo que no queremos ver cuando hacemos un análisis. De esta manera, sabemos que todo lo que pasó está en el rastro. No querrá perderse inadvertidamente un evento de red que explique la situación que está investigando debido a su filtro de captura.

Por supuesto, para las redes de alto tráfico, las trazas pueden volverse muy grandes rápidamente, por lo que el filtrado en la captura tiene sentido en este escenario. O tal vez simplemente lo prefiera de esa manera.

Tenga en cuenta que la sintaxis de los filtros de captura es ligeramente diferente a la de las pantallas.

Los íconos de aleta de tiburón, cuadrado y aleta de tiburón con una flecha circular resaltados en la interfaz de Wireshark con una captura de paquetes activa.

Los iconos resaltados en la imagen de arriba indican lo siguiente, de izquierda a derecha:

  • Aleta de tiburón : si es azul, al hacer clic en él se iniciará la captura de paquetes. Si Wireshark está capturando paquetes, este icono será gris.
  • Cuadrado : si está rojo, al hacer clic en él, se detendrá la captura de paquetes en ejecución. Si Wireshark no está capturando paquetes, este ícono será gris.
  • Aleta de tiburón con flecha circular : si está verde, al hacer clic en él, se detendrá la traza en ejecución. Esto le da la oportunidad de guardar o descartar los paquetes capturados y reiniciar el rastreo. Si Wireshark no está capturando paquetes, este ícono será gris.

Analizando el rastro

Al hacer clic en el icono del cuadrado rojo, se detendrá la captura de datos para que pueda analizar los paquetes capturados en el seguimiento. Los paquetes se presentan en orden de tiempo y codificados por colores de acuerdo con el protocolo del paquete. Los detalles del paquete resaltado se muestran en los dos paneles inferiores de la interfaz de Wireshark.

Una traza capturada que se muestra en Wireshark en orden de tiempo.

Una forma sencilla de facilitar la lectura del seguimiento es hacer que Wireshark proporcione nombres significativos para las direcciones IP de origen y destino de los paquetes. Para hacer esto, haga clic en Ver> Resolución de nombres y seleccione «Resolver direcciones de red».

Wireshark intentará resolver el nombre de los dispositivos que enviaron y recibieron cada paquete. No podrá identificar todos los dispositivos, pero aquellos que pueda le ayudarán a leer el rastro.

Seguimiento de Wireshark con nombres de dispositivos resueltos.

Al desplazar la pantalla hacia la izquierda, se mostrarán más columnas a la derecha. La columna de información muestra cualquier información que Wireshark pueda detectar del paquete. En el siguiente ejemplo, vemos algunas pingsolicitudes y respuestas.

Relacionado:  Cómo buscar archivos y carpetas en Linux usando la línea de comandos

La columna de información que muestra algunas solicitudes y respuestas de ping.

De forma predeterminada, Wireshark muestra todos los paquetes en el orden en que fueron rastreados. Muchos dispositivos envían paquetes de ida y vuelta simultáneamente. Esto significa que es probable que una sola conversación entre dos dispositivos tenga paquetes de otros entrelazados entre ellos.

Para examinar una sola conversación, puede aislarla por protocolo. El protocolo para cada paquete se muestra en la columna de protocolo. La mayoría de los protocolos que verá pertenecen a la familia TCP / IP. Puede especificar el protocolo exacto o utilizar Ethernet como una especie de catchall.

Haga clic con el botón derecho en cualquiera de los paquetes en la secuencia que desea examinar y luego haga clic en Filtro de conversación> Ethernet. En el siguiente ejemplo, seleccionamos un pingpaquete de solicitud.

"Conversación" de ping aislada en la interfaz de Wireshark.

La secuencia de paquetes se muestra sin otros entre ellos, ya que Wireshark generó automáticamente un filtro para hacer esto. Se muestra en la barra de filtro y se resalta en verde, lo que indica que la sintaxis del filtro es correcta.

Para borrar el filtro, haga clic en «X» en la barra de filtro.

Creación de sus propios filtros

Pongamos un filtro simple en la barra de filtros:

ip.addr == 192.168.4.20

Esto selecciona todos los paquetes que han sido enviados o recibidos por el dispositivo con la dirección IP 192.168.4.20. Tenga en cuenta los signos de doble igual ( ==) sin espacios entre ellos.

Wireshark con un filtro de ip.addr == 192.168.4.20.

Para ver los paquetes enviados por un dispositivo (la fuente), puede usar ip.src; para ver los paquetes que han llegado a un dispositivo (el destino), puede usar ip.dst, como se muestra a continuación:

ip.dst == 192.168.4.20 && ip.src == 192.168.4.28

Wireshard con un filtro de ip.addr == 192.168.4.20.

Tenga en cuenta el uso de un doble ampersand ( &&) para indicar el «y» lógico. Este filtro busca paquetes que llegaron a 192.168.4.20 desde 192.168.4.28.

Las personas nuevas en los filtros de Wireshark a menudo piensan que un filtro como este capturará todos los paquetes entre dos direcciones IP, pero ese no es el caso.

Lo que realmente hace es filtrar todos los paquetes hacia o desde la dirección IP 192.168.4.20, independientemente de su procedencia o hacia dónde se enviaron. Hace lo mismo con todos los paquetes de la dirección IP 192.168.4.28. Para decirlo de manera más simple, filtra todo el tráfico hacia o desde cualquier dirección IP.

También puede buscar actividad en otros protocolos. Por ejemplo, puede escribir este filtro para buscar solicitudes HTTP:

http.request

Wireshark con filtro http.request

Para excluir paquetes que provienen de un dispositivo o que se enviaron a él, use un signo de exclamación ( !) y encierre el filtro entre paréntesis [ ()]:

! (ip.addr == 192.168.4.14)

Este filtro excluye todos los paquetes enviados hacia o desde 192.168.4.14.

Wireshark con un filtro de! (Ip.addr == 192.168.4.14).

Es contradictorio porque el filtro contiene el operador de igualdad ( ==). Es posible que haya esperado escribir este filtro así:

ip.addr! = 192.168.4.14

Sin embargo, esto no funcionará.

También puede buscar cadenas dentro de los paquetes, por protocolo. Este filtro busca paquetes de Protocolo de control de transmisión (TCP) que contienen la cadena «youtube»:

tcp contiene youtube

Wireshark con un filtro tcp contiene youtube.

Un filtro que busca la retransmisión es útil como una forma de verificar si hay un problema de conectividad. Las retransmisiones son paquetes que se reenvían porque se dañaron o se perdieron durante la transmisión inicial. Demasiadas retransmisiones indican una conexión lenta o un dispositivo que tarda en responder.

Escriba lo siguiente:

tcp.analysis.retransmission

Wireshark con un filtro de tcp.analysis.retransmission.

Nacimiento, vida, muerte y cifrado

Una conexión de red entre dos dispositivos se inicia siempre que uno contacta con el otro y envía un SYNpaquete (sincronizado). A continuación, el dispositivo receptor envía un ACKpaquete (de reconocimiento). Indica si aceptará la conexión enviando un SYNpaquete.

SYNy ACKson en realidad dos banderas en el mismo paquete. El dispositivo original reconoce el SYNenviando un ACK, y luego los dispositivos establecen una conexión de red.

Relacionado:  Cómo usar el comando wall en Linux

Esto se llama apretón de manos de tres vías:

A -> SYN -> B

A <- SYN, ACK <- B

A -> ACK -> B

En la captura de pantalla siguiente, alguien en la computadora «nostromo.local» realiza una conexión Secure Shell (SSH) a la computadora «ubuntu20-04.local». El apretón de manos de tres vías es la primera parte de la comunicación entre las dos computadoras. Tenga en cuenta que las dos líneas que contienen los SYNpaquetes están codificadas por colores en gris oscuro.

Wireshark muestra una conexión SSH entre dos computadoras.

Al desplazarse por la pantalla para mostrar las columnas de la derecha SYN, se muestran los paquetes de reconocimiento SYN/ACK, y ACK.

Wireshark que muestra los paquetes de protocolo de enlace de tres vías.

Notará que el intercambio de paquetes entre las dos computadoras alterna entre los protocolos TCP y SSH. Los paquetes de datos se pasan a través de la conexión SSH cifrada, pero los paquetes de mensajes (como ACK) se envían a través de TCP. Filtraremos los paquetes TCP en breve.

Cuando la conexión de red ya no es necesaria, se descarta. La secuencia de paquetes para romper una conexión de red es un protocolo de enlace de cuatro vías.

Un lado envía un FINpaquete (final). El otro extremo envía un mensaje ACKpara reconocer el FIN, y luego también envía un mensaje FINpara indicar que está de acuerdo en que se debe interrumpir la conexión. El primer lado envía una ACKpara el FINque acaba de recibir, y luego se desmonta la conexión de red.

Así es como se ve el apretón de manos de cuatro vías:

A -> FIN -> B

A <- FIN, ACK <- B

A -> ACK -> B

A veces, los FIN piggybacks originales en un ACKpaquete que se iba a enviar de todos modos, como se muestra a continuación:

A -> FIN, ACK -> B

A <- FIN, ACK <- B

A -> ACK -> B

Esto es lo que sucede en este ejemplo.

Wireshark que muestra los paquetes de protocolo de enlace de cuatro vías.

Si queremos ver solo el tráfico SSH para esta conversación, podemos usar un filtro que especifique ese protocolo. Escribimos lo siguiente para ver todo el tráfico que usa el protocolo SSH hacia y desde la computadora remota:

ip.addr == 192.168.4.25 && ssh

Esto filtra todo excepto el tráfico SSH hacia y desde 192.168.4.25.

Wireshark con un filtro de ip.addr == 192.168.4.25 && ssh.

Otras plantillas de filtros útiles

Cuando escribe un filtro en la barra de filtros, permanecerá rojo hasta que el filtro sea sintácticamente correcto. Se volverá verde cuando el filtro esté correcto y completo.

Si escribe un protocolo, como tcp, ip, udp, o shh, seguido de un punto ( .), aparece un menú. Enumerará los filtros recientes que contenían ese protocolo y todos los campos que se pueden usar en los filtros para ese nombre de protocolo.

Por ejemplo, con ip, puede utilizar ip.addr, ip.checksum, ip.src, ip.dst, ip.id, ip.host, y docenas de otros.

Utilice las siguientes plantillas de filtro como base de sus filtros:

  • Para mostrar solo paquetes de protocolo HTTP: http
  • Para mostrar solo los paquetes del protocolo DNS: dns
  • Para mostrar solo paquetes TCP con 4000 como puerto de origen o destino: tcp.port==4000
  • Para mostrar todos los paquetes de restablecimiento de TCP: http.request
  • Para filtrar paquetes ARP, ICMP y DNS: !(arp or icmp or dns)
  • Para mostrar todas las retransmisiones en un seguimiento: tcp.analysis.retransmission
  • Para filtrar banderas (como SYNo FIN): debe establecer un valor de comparación para estas: 1significa que la bandera está configurada y significa que no. Así, un ejemplo sería: tcp.flags.syn == 1.

Hemos cubierto algunos de los principios rectores y usos fundamentales de los filtros de visualización aquí, pero, por supuesto, hay mucho más.

Para apreciar el alcance total y el poder de los Wiresharkfiltros, asegúrese de consultar su referencia en línea .