# Sniffing con Wireshark

## Uso Básico de Wireshark

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOaJse_0oueubBEmNpq%2F-MOahnCPGaeMIkMUC6hd%2F1280px-Wireshark_Logo.svg%5B1%5D.png?alt=media\&token=8be9ea34-3108-49ce-bb05-77509fe9134c)

&#x20;**Wireshark‎**‎ es un analizador de protocolos de red más utilizado del mundo. Permite ver lo que está sucediendo en la red en detalle y es el estándar en muchas empresas comerciales y sin fines de lucro, agencias gubernamentales e instituciones educativas. Wireshark es la continuación de un proyecto iniciado por Gerald Combs en 1998 llamado **Ethereal**.‎

Al abrir Wireshark nos aparecerá una pantalla similar a la siguiente, veremos a continuación los controles más importantes que usaremos de aquí en adelante.

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOcsXReLLLLu7KjE1w5%2F-MOd-kof5xZyhFWpzkEI%2Fimage.png?alt=media\&token=f0571928-c3b8-4a46-8fa1-dd0e8e9a76e9)

1. **`Filtros:`** Una de los controles que más usaremos en Wireshark es la barra de filtros. Mediante el uso de filtros podemos identificar los paquetes que cumplan uno o más criterios de filtrado. Veremos lo básico de filtros más adelante.
2. **`Archivos Recientes`**: Esta sección (Vacía por default al instalar Wireshark de cero) recopila los últimos archivos PCAP que hayamos abierto. También nos permite abrir archivos directamente haciendo click en el texto **`Open`**.
3. **`Interfaces para Captura:`** En esta sección podemos ver el listado de las interfaces presentes en el equipo donde se ejecuta Wireshark. Esta sección varía de equipo a equipo. Se puede seleccionar una interfaz en particular y comenzar a escuchar su trafico de red haciendo **doble click sobre el nombre de la interfaz**. El gráfico representa la actividad de red en cada interfaz.

### Coloring Rules en Wireshark&#x20;

En Wireshark los paquetes se clasifican por color según el tipo de protocolo usado y errores encontrados en estos. Para poder ver las reglas de colores para los paquetes de red, vamos a: **`View -> Coloring Rules`**.

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOcsXReLLLLu7KjE1w5%2F-MOd1_GT-hUVmUV7f_fW%2Fimage.png?alt=media\&token=030a04b1-a958-4c99-be46-d087247e7095)

Como podemos observar Wireshark nos presenta todas las reglas de coloreado que están actualmente configuradas.

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOcsXReLLLLu7KjE1w5%2F-MOczcSURXq_95ewKO_p%2Fimage.png?alt=media\&token=9ac7a7e0-430f-48f6-961b-b7806a90c47f)

Es importante tener presente esta configuración de colores y comenzar a familiarizarnos con ella, dado que es una forma visualmente sencilla de identificar paquetes y protocolos de forma rápida.

### Usando Filtros

Existe una gran cantidad de filtros disponibles en Wireshark que nos permitirán refinar nuestras búsquedas hasta encontrar el tráfico de red específico a una dirección IP, MAC Address, Tipo de Protocolo, etc. No cubriremos todos los posibles filtros en esta sección, nos limitaremos a los necesarios para entender el funcionamiento general de los mismos y los usaremos a lo largo de esta práctica.

Los filtros en Wireshark utilizan **`operadores lógicos`** y  **`operadores de comparación`** como en los lenguajes de programación. Haciendo uso de estos operadores podemos combinar nuestros filtros para realizar filtrados refinados para encontrar exactamente el tráfico de red que queremos capturar y ver.

#### Operadores de Comparación

Los operadores de comparación nos permiten comparar valores en nuestras expresiones de filtrado. Estos operadores son los siguientes:

| Operador                    | Uso                                             |
| --------------------------- | ----------------------------------------------- |
| **`eq`** o **`==`**         | Igual a x valor.                                |
| **`ne`** o **`!=`**         | No igual (not equal) a x valor.                 |
| **`gt`** o **`>`**          | Mayor que x valor.                              |
| **`lt`** o **`<`**          | Menos que x valor.                              |
| **`ge`** o **`>=`**         | Mayor o igual que x valor.                      |
| **`le`** o **`<=`**         | Menor o igual que x valor.                      |
| **`contains`**              | Contiene x valor.                               |
| **`matches`** o **`~`**     | Cumple una expresión regular (Perl-Compatible). |
| **`bitwise_and`** o **`&`** | Bitwise AND is non-zero.                        |

#### Operadores Lógicos

Los **`operadores Lógicos`** nos permiten comparar expresiones de filtrado. Estos operadores son los siguientes:

| Operador              | Uso                                                                                  |
| --------------------- | ------------------------------------------------------------------------------------ |
| **`and`** o **`&&`**  | Nos permite enlazar condiciones, todas deben cumplirse.                              |
| **`or`** o **`\|\|`** | Nos permite enlazar condiciones, al menos una debe cumplirse.                        |
| **`xor`** o **`^^`**  | Únicamente una de las condiciones debe cumplirse.                                    |
| **`not`** o **`!`**   | Negación, la condición no debe cumplirse.                                            |
| **`[…​]`**            | Permite seleccionar una sub-secuencia.                                               |
| **`in`**              | Nos permite ver si el valor es parte de un set. Por ej. **`tcp.port in {80, 8080}`** |

Cabe destacar que en Wireshark los filtros se clasifican en dos grandes grupos, **`Capture Filters`** (Filtros de Captura) y **`Display Filters`** (Filtros de visualización). Veamos a continuación un breve detalle de cada uno.

#### Capture Filters

Los filtros de captura son aplicados **antes de iniciar la captura** de paquetes y no pueden ser alterados durante la captura. Si prestamos atención en la pantalla inicial de Wireshark, este control también se presenta como una barra de búsqueda en la sección **`Capture`**:

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOd4EF2-9V9yCGLQcQI%2F-MOd5Nq-afIUchqXV9rC%2Fimage.png?alt=media\&token=c64197f3-2517-4165-b428-dfb6ea989fdb)

Este tipo de filtros nos permite por ejemplo capturar el tráfico de un rango de IP en particular, el tráfico de un tipo de protocolo en particular, el tráfico únicamente del protocolo IPV4, etc.&#x20;

Cabe mencionar que estos filtros también son accesibles desde el menu de Wireshark: **`Capture -> Options (CTRL + K)`**.

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOkh2F0NJZXwvE1gHSV%2F-MOkjTqFJt82SSsEx_Ms%2Fimage.png?alt=media\&token=260efc71-e7e9-42a9-aa73-bb6f4f36e0c7)

{% hint style="info" %}
En esta ventana también podemos activar/desactivar el modo promiscuo de Wireshark.

**Promiscuous mode:** En modo activo Wireshark tratará de detallar todo paquete de red que vea en la interfaz, este o no dirigido a nuestro equipo.\
\
**Non-Promiscuous Mode:** En este modo Wireshark únicamente interceptará el tráfico de red de la interfaz seleccionada si su origen o destino es dirigido a nuestro equipo.
{% endhint %}

| Uso                                                                                 |   Capture Filter  |
| ----------------------------------------------------------------------------------- | :---------------: |
| Capturar tráfico IPV4, ignorando otros protocolos como ARP,etc.                     |       **ip**      |
| Capturar tráfico por puerto, por ejemplo **`port 53`** capturará el tráfico de DNS. |     **port #**    |
| Capturar el tráfico desde/ hacia el IP especificado.                                |   **host \<IP>**  |
| Captura el tráfico por rango de puertos, por ejemplo **`tcp portrange 1200-2112`**. | **tcp portrange** |

{% hint style="info" %}
Más sobre **`Capture filters`** en la documentación oficial de Wireshark. \
Click en el siguiente :point\_right: [**link**](https://gitlab.com/wireshark/wireshark/-/wikis/CaptureFilters).
{% endhint %}

#### Display Filters

Los **`Display Filters`**, nos permiten realizar filtrado de datos directamente sobre la lista de resultados y son los que usaremos regularmente para ubicar el tráfico de red que nos interese inspeccionar. Wireshark utiliza este tipo de filtros para las [**`Coloring Rules`**](#coloring-rules-en-wireshark) que vimos antes y es una de sus principales funcionalidades.  Cabe destacar que la cantidad de filtros que se pueden utilizar es enorme y esta fuera del alcance de esta práctica verlos en detalle. Mencionaremos sin embargo, los que usaremos en esta práctica.

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOi4XU9qIUAmy5_9ZIS%2F-MOi6a3PMwQyzGDL8wT-%2Fimage.png?alt=media\&token=cf7d997d-6b34-477e-bcfd-f70d83d0652c)

{% hint style="info" %}
Según la misma :point\_right: [Wiki de Wireshark](https://www.wireshark.org/docs/dfref/), actualmente más de **261000** campos de **3000** protocolos son soportados para su uso con filtros.
{% endhint %}

| Uso                      | Display Filter                            |
| ------------------------ | ----------------------------------------- |
| Filtrar por IP (Destino) | **ip.dest == 192.168.1.1**                |
| Filtrar por IP (Origen)  | **ip.src == 192.168.1.2**                 |
| Filtrar por IP           | **ip.addr == 192.168.1.3**                |
| Filtrar por Subnet       | **ip.addr = 192.168.1.1/24**              |
| Filtrar por puerto(TCP)  | **tcp.port == 21**                        |
| Filtrar por URL          | **http.host == "tzero86bits.tk"**         |
| Filtrar por MAC Address  | **eth.addr == 00:65:C7:16:25:F2**         |
| Filtrar por TimeStamp    | **frame.time >= "Mayo16, 1986 11:16:00"** |

{% hint style="info" %}
Más sobre **`Display Filters`** en la documentación de Wireshark. \
Click en el siguiente :point\_right: [**link**](https://gitlab.com/wireshark/wireshark/-/wikis/DisplayFilters)**.**
{% endhint %}

## Analizando paquetes de red (FTP Sniffing)

Veamos ahora como podemos capturar las credenciales de logueo a un servicio de FTP analizando el trafico de red de una interfaz. Cabe destacar que este mismo proceso de análisis puede llevar a cabo de igual manera luego de abrir archivo **`PCAP/PCAPNG`**.&#x20;

Para esta práctica voy a utilizar lo siguiente:

* **Interfaz**: **`eth0`**
* **Puerto: `21`**

{% hint style="success" %}
Si quieres realizar esta práctica locamente, al menos la parte del análisis. Puedes descargar el archivo **`PCAPNG`** desde el link debajo :point\_down:&#x20;
{% endhint %}

{% file src="<https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOiKvzkyQIjAiyMglOX%2F-MOj0_B0krUpzLAQ4p6a%2FUTN_CEH_FTP_LOGIN_TZERO86_1.pcapng.gz?alt=media&token=c6fbac51-0d1f-442c-95d2-e34055ab8466>" %}
ARHIVO PCAPNG PARA ESTA PRACTICA
{% endfile %}

Para comenzar en la pantalla principal de Wireshark aplicaremos un filtro de captura, seleccionando únicamente la interfaz eth0. Para lo cual podemos directamente hacer doble click sobre el nombre de la interfaz:

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOiKvzkyQIjAiyMglOX%2F-MOiU5HiOlxlMY_lYPbP%2Fimage.png?alt=media\&token=0b001dd5-fb79-4169-9058-95427e63b746)

Luego de esto Wireshark comenzará a capturar el tráfico de red de esa interfaz automáticamente. Dejamos la captura activa y nos dirigimos a la terminal para conectarnos por **`FTP`** a nuestra **`VM`** e intentamos loguearnos. Luego de esto volvemos a **`Wireshark`** y hacemos click en el botón rojo de stop para detener la captura.

Comenzamos conectándonos al servidor FTP, en este caso usé un usuario recientemente configurado para el acceso a FTP.

{% hint style="info" %}
Para esta práctica también usare el Server de mi Lab local de Active Directory. Mas detalle en el siguiente :point\_right: [**link**](https://tzero86.gitbook.io/tzero86/not-curated-eh-notes/scanning/running-scans-with-nmap#intro-distintos-tipos-de-scans-con-nmap).
{% endhint %}

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOiKvzkyQIjAiyMglOX%2F-MOiqnrKrRHiQ7UD32_u%2Fimage.png?alt=media\&token=ae29aa7a-a2b9-4d93-8433-9fba63db1684)

Una vez detenido el proceso de captura, debemos ver algo similar a esto en Wireshark:

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOiKvzkyQIjAiyMglOX%2F-MOiqxJgbG3M4mC5-fBf%2Fimage.png?alt=media\&token=247c11ae-f669-40d2-9c85-b4faba71aa39)

Ahora hagamos usos de distintos filtros que nos permitan ubicar específicamente el tráfico FTP. Por ejemplo podemos filtrar por el trafico en el puerto 21:

```
tcp.port == 21
```

Y como podemos ver Wireshark aplica el Display Filter correspondiente sobre los resultados:

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOiKvzkyQIjAiyMglOX%2F-MOisvK_fPbtBrV-xDL_%2Fimage.png?alt=media\&token=c0a56678-b281-41c4-9a27-03951cb22dbc)

Alternativamente podemos directamente filtrar por el protocolo FTP simplemente escribiendo:

```
ftp
```

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOiKvzkyQIjAiyMglOX%2F-MOitNNrSjmNNlyBvHNR%2Fimage.png?alt=media\&token=4ede71a6-b988-4d2f-b4e7-8895ef0ab20f)

También nos puede interesar ver el tráfico del puerto **`20 (FTP-DATA)`** junto con el del puerto **`21 (FTP)`**:

```
tcp.port == 20 || tcp.port == 21
```

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOiKvzkyQIjAiyMglOX%2F-MOiuSZ4JxWEA1Avk6Fp%2Fimage.png?alt=media\&token=5291a0ff-5179-45d6-aae1-63af7f08949c)

Filtremos directamente por ftp y hagamos click derecho en el paquete número 58 y elegimos la opción **`Follow -> TCP Stream.`** De esta manera podemos seguir el paso a paso del trafico de red generado por nuestro intento de login al la maquina virtual Windows Server.

{% hint style="success" %}
Combinación de teclas para TCP Stream: **CTRL + ALT + SHIFT + T**&#x20;
{% endhint %}

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOiKvzkyQIjAiyMglOX%2F-MOivWaN-ghv3ldIT_au%2Fimage.png?alt=media\&token=2500bd61-db98-4a50-81e4-5cc810d2ea83)

Al abrirse el TCP Stream, veremos la secuencia de interacción entre el usuario y el servicio FTP. Vemos que el usuario listó los archivos del directorio y descargo el mismo.

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOiKvzkyQIjAiyMglOX%2F-MOiwlCOzKy00PGrPYTH%2Fimage.png?alt=media\&token=d1037c82-e9a3-4be3-ae1b-d299d5ee3547)

Como podemos ver las credenciales de login fueron **`ftpuser:Test123`** y el usuario descargó el archivo **`Executive_Secrets.txt`** desde el servidor FTP a su equipo. Veamos como podemos ubicar esta acción en el tráfico de red y extraer los contenidos de ese archivo.

Primero filtremos por **`ftp-data`**:

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOiKvzkyQIjAiyMglOX%2F-MOiyeCRWW88ivyxmPzb%2Fimage.png?alt=media\&token=cdf01123-6e85-483f-b0cb-e741bf96a4e2)

Luego seleccionamos el paquete **`386`** donde se hace la transferencia del archivo **`(RETR)`**, y seguimos el **`TCP Stream`** como vimos antes.

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOiKvzkyQIjAiyMglOX%2F-MOiz57AvWPIKNCQSuQZ%2Fimage.png?alt=media\&token=c213c927-6dc5-407a-bbad-79f177b25b9e)

Finalmente podemos ver el contenido del archivo descargado por el usuario durante la sesión FTP. Y podemos guardarlo en nuestro equipo haciendo uso de las opciones que nos provee Wireshark.

![](https://2031217541-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MNC3KGY9k0nvrU_5PW6%2F-MOiKvzkyQIjAiyMglOX%2F-MOizOuXKoT3PGfFG4Ia%2Fimage.png?alt=media\&token=1f657ab1-94ab-4dda-8b6e-596829e03e84)

Wireshark nos permite cambiar el formato en el que se muestra la data, lo que es útil si en lugar de una archivo de texto plano estuviéramos tratando de recuperar un ejecutable por ejemplo. En ese caso podemos ver el contenido en modo **`raw`** y guardarlo como **`.exe`**.

Hasta acá vimos como usar lo básico de **`Wireshark`** y repasamos algunos de los filtros que nos serán de utilidad a la hora de analizar tráfico de red. **Wireshark** dispone de muchísimas más opciones y no está en el alcance de esta práctica cubrir esta herramienta a fondo.

{% hint style="info" %}
Estas prácticas están sujetas a modificaciones y correcciones, la versión más actualizada disponible se encuentra online en [el siguiente link](https://tzero86.gitbook.io/tzero86/).
{% endhint %}
