En anteriores entregas:
Presentación | Parte 1 | Parte 2 | Parte 3 | Parte4 | Parte 5
Wireshark I Parte.
.
¿ Qué es Wireshark ?.
Wireshark es una herramienta multiplataforma para análisis de tráfico de red, producto de la evolución del antiguo Ethereal. Funciona al igual que lo puede hacer cualquier otro sniffer tal como Windump, TCPDump ó dsniff. Pero, al contrario de estos, lo hace mostrando los datos a través de un entorno gráfico y de forma más amigable y entendible. Posee una serie de decodificadores para la mayor parte de protocolos así como plugins y herramientas para el análisis gráfico de las capturas.
Este es solo una pequeña definición de esta herramienta. Veremos, a lo largo de esta artículo, que Wireshark es capaz de destripar, decodificar, analizar todo nuestro tráfico aportando una grandísima cantidad de datos. Datos que, una vez analizados, nos servirán para optimizar nuestra red, buscar errores, análisis forense, geoposicionamiento, análisis de rendimiento, etc, etc. Vamos a ello.
Antes que nada un apunte sobre este artículo. Escribir sobre Wireshark podría dar para un libro o dos. Así que en este artículo y el siguiente trataremos este tema de forma práctica para aprender a usarlo lo mejor y más rápidamente posible (usuarios principiantes / medio), tocando todos los aspectos posibles pero si mucha profundidad. Otros aspectos más avanzados lo trataremos en otra serie de artículos.
Descarga, instalación y uso básico. Las opciones.
Descarga e instalación.
Para descargar Wireshark:
- Windows: http://www.wireshark.org/download.html
- Linux: Algunas distribuciones ya contienen Wireshark. De cualquier forma: apt-get install wireshark
Menú Capture. Las opciones
Tenemos varias formas de capturar o cargar archivos con datos préviamente capturados, pero es conveniente, antes, configurar como vamos a realizar la captura, desde que interface, si la queremos guardar y de que forma y otras opciones no menos importantes, así como la parada de captura, etc. Para ellos tenemos el menú Capture con las opciones de:
- Interfaces
- Options
- Start
- Stop
- Restart
- Capture Filter
Interfaces.
Un listado de las interfaces, opción para comenzar, opciones y detalles.
Tenemos 3 botones que son Start para comenzar la captura, Options para detallar opciones de la captura y Details o detalles de la interface de red.
De momento es suficiente para iniciar una primera captura. Iremos más adelante profundizando en las opciones, aunque veremos muchas de ellas en el capítulo de «Nuestra primera captura».
La interface gráfica.
La parte más importante de la interface gráfica de Wireshark está dividida en tres zonas diferenciadas:
- Zona de listado de paquetes capturados.
- Zona de detalle y estructura (cabeceras, protocolos involucrados, campos…) del frame o paquete capturado
- Zona de contenido en ASCII / Hexadecimal
A considerar:
La zona de listado de los paquetes depende de si existe filtrado o no. Si existe filtrado solo se mostrarán los paquetes que cumplan el filtro. Aún así, Wireshark «verá» todas las tramas, por lo que si quitamos el filtro, aparecán todos los paquetes capturados desde el primero al último.
En la zona de detalle de un paquete, donde aparece toda su estructura, capas y protocolos involucrados, etc, solo aparecerá los datos del paquete seleccionado en ese momento.
En la zona de contenido hexadecimal / ASCII, aparecerán la misma información que en la zona de detalle del paquete pero en hexadecimal.
Iremos viendo esto de forma más detallada cuando veamos los ejemplos.
Independientemente de estas tres zonas, tenemos arriba una zona de menús, botones y otra de aplicación de filtros de visualización. Vermos más adelante que son estos filtros.
Nuestra primera captura.
Vamos a realizar nuestra primera captura. De esta forma veremos las opciones básicas (las dejamos pendiente al principio), algunos botones y opciones muy básicas de filtrado. Realmente tenemos muchas formas de arrancar wireshark y comenzar a capturar. Nosotroas aquí y para empezar lo haremos de la siguiente forma para ir viendo cosas. Arrancamos…
Lo primero que hacemos es ir a menú Capture > Options…. tenemos un panel para indicar perimero si la interface es local o remota, ya que podemos capturar tramas o paquetes desde una interfaz en una máquina remota (lo veremos más adelante). La interface Local es la que tenemos físicamente instalada en nuestra máquina y podemos elegir ya que es posible tener varias o interfaces WMware, etc. Tenemos también la posibilidad de elegir, a parte de Ethernet, una interface DOCSIS o «Especificación de Interfaz para Servicios de Datos sobre Cable», está ultima no la usaremos. Para saber más sobre DOCSIS (http://es.wikipedia.org/wiki/DOCSIS).
Dejaremos marcado Capture packets in promiscuous mode y resto de opciones y campos que son:
- Campo para filtro de captura
- Opciones de visualización
- Opciones de Resolución de nombres
- Opciones de uso de ficheros de captura
- Opciones de parada de captura
Campo para filtro de captura.
Establecemos aquí un filtro para que Wireshark solo capture según lo especificado en dicho filtro. Por ejemplo, para obtenr unas capturas sin «ruido», solo nuestro tráfico, pondremos lo siguiente:
not broadcast and not multicast
De esta forma no «veremos» ninguno de estos tráficos; broadcast y multicast.
Otros filtros de captura que podemos establecer:
Opciones de visualización.
Se trata de una serie de opciones, que dejaremos por defecto, para configurar el tratamiento visual del proceso de captura. Como los scrolling de pantalla y visualizar o no la ventana info (información de capturas en tiempo real) que nos daría información de porcentajes de captura por protocolos.
Opciones de resolución de nombres.
Se trata de tres opciones para resolución de nombres para MAC Address y resto de resolución de nombres de hosts, etc.
Opciones de uso de ficheros de captura.
Aquí podemos indicar que las capturas se salven en un archivo o usar múltiples ficheros de capturas. Podemos configurar además los límites de cada fichero para que salte al siguiente, indicando límites de tiempo y megabytes. Incluso podemos crear lo que se llama un Ring Buffer; con esta opción Wireshark creará una serie de archivos de captura (buffer en anillo) cada n ficheros de captura.
Para saber más sobre estas cuestiones: http://seguridadyredes.nireblog.com/post/2009/10/26/wireshark-usando-multiples-archivos-de-captura
De momento no usaremos nada de esto.
Opciones de parada de capturas.
Podemos establecer, de forma predeterminada, cuando pararemos nuestra captura.
- Después de n paquetes
- Después de x megaytes, kilobytes, megabytes
- Después de y segundos, minutos, horas e incluso días
Si no especificamos nada, pararemos nuestra captura en el menú Capture > Stop.
Ya lo tenemos todo, vamos entonces a pulsar Start para que comience la captura…..
Una vez que consideremos que no queremos capturar más o, en nuestras opciones, tengamos un configuración de parada de capturas, vamos a proceder a analizar que datos e información nos presenta Wireshark. Por ejemplo, tras nuestra captura, se nos presenta la siguiente información:
Se establecen, como ya hemos comentado, 3 zonas de datos:
- A. Zona de listado de paquetes capturados.
- B. Zona de detalle y estructura (cabeceras, protocolos involucrados, campos…) del frame o paquete capturado
- C. Zona de contenido en ASCII / Hexadecimal
Ya hemos explicado cada una de estas zonas. Vamos, entonces, a la información del ejemplo.
En campo Frame de la zona A, se nos muestra información completa de la trama capturada. Tamaño total, etc. A continuación Ethernet II que nos muestra la cabecera Ethernet II que a su vez pertenece a la capa de enlace de datos:
0000 00 04 75 ed 89 c3 00 14 22 5f a9 25 08 00
que nos muestra parte de la cabecer de la trama Ethener II, en este caso:
Destino 6 bytes 00 04 75 ed 89 c3 : MAC destino
Origen 6 bytes 00 14 22 5f a9 25 : MAC origen
Tipo 2 bytes 08 00 : protocolo que viaja en la parte de datos de la trama en este caso IP. 0x0800.
A continuación vemos Internet Protocol con los datos de la cabecera del datagrama IP:
0000 45 00 02 93 e1 8f 00 00 80 06 6f b2 d9 7e 4b de E………o..~K.
0010 c0 a8 01 1e
Más información sobre el datagrama IP aquí: http://seguridadyredes.nireblog.com/post/2009/11/05/wireshark-windump-analisis-capturas-trafico-red-interpretacian-datagrama-ip-actualizacian
Después nos encontramos con Transmission Control Protocol. (TCP):
0000 00 50 12 67 21 9e b2 a5 99 28 f1 c8 50 18 fd b2 .P.g!….(..P…
0010 f5 79 00 00 .y..
Se trata del Segmento TCP. Protocolo involucrado en esta captura. Más información sobre conexiones TCP aquí: (insertar el enlace)
Como ya hemos visto, tenemos información del Puerto de origen, destino, número de secuencia, etc.
Y para finalizar tenemos TCP Segment Data, con todo el contenido del campo Data del segmento TCP:
Bien, ya sabemos algo más sobre la información que nos ofrece Wireshark, aunque sea de forma muy superficial. Vamos, entonces a ver un ejemplo de uso algo más detallado.
Ejemplo 1. Análisis protocolo FTP.
De forma básica, podemos decir que FTP es un protocolo de red para la transferencia de archivos de un sistema a otro conectados a una red TCP, basado en la arquitectura cliente-servidor y de una forma fiable y eficiente.
Dicho esto, vamos, a continuación, estudiar la siguiente captura en la que se involucra una sesión FTP:
Las primeras lineas, frames 1 a 3, que observamos en la captura corresponden al inicio de la comunicación con el servidor FTP. Se trata, como vemos, del establecimiento de conexión en tres pasos. El número de secuencia incial es relativo y por tanto en este caso 0:
cliente servidor TCP 2203 > 21 [SYN] Seq=0 Win=64512 Len=0 MSS=1460 servidor cliente TCP 21 > 2203 [SYN, ACK] Seq=0 Ack=1 Win=16384 Len=0 MSS=1460 cliente servidor TCP 2203 > 21 [ACK] Seq=1 Ack=1 Win=64512 Len=0
lo vemos mejor:
- cliente envia SYN con un número secuencia Seq=0 y Ack=0
- servidor lo recibe, envia SYN-ACK y responde con su propio número de secuencia Seq=0 y con un ACK = al número de secuencia anterior + 1, es decir: Ack=1
- cliente, a su vez, responde con ACK y número de secuencia inicial (Seq=0) +1 y ACK = número de secuecia anterior (Seq=0) +1, es decir: Ack=1
En la siguiente línea, frame número 4, vemos como el servidor responde al cliente con el código 220 que indica servicio preparado para nuevo usuario y nuestra información del software/versión del servidor FTP:
Response: 220-FileZilla Server version 0.9.29 beta
A continuación, frame 5, responde al cliente iniciando el diálogo y sesión FTP con el servidor. USER identifica al usuario para acceder al sistema de ficheros del servidor:
Request: USER xxxxxxxx
En el frame 6, el servidor requiere la contraseña del usuario con el código 331 que indica OK al usuario y que necesita contraseña:
Response: 331 Password required for xxxxxxxx
El cliente, en frame 7, responde con la contraseña:
Request: xxxxXxxxxXX
En el frame 8, el servidor responde con código 230 que indica usuario conectado y que continúe con la sesión:
Response: 230 Logged on
El cliente, en el frame 9, requiere mostrar el directorio de trabajo con la orden PWD:
Request: PWD
Frame 10. El servidor responde a la petición con un código 257 que indica el nombre de la ruta:
Response: 257 "/" is current directory.
En el frame 11, el cliente con la siguiente orden PORT n1,n2,n3,n4,n5,n6 indica al servidor el establecimiento del modo activo. Con esta orden, se indica que se espera conexión del servidor en la dirección IP n1,n2,n3,n4, en este caso 192.168.1.5 tal como vemos en la captura gráfica de Wireshark, y en el puerto n5 y n6. El puerto se calcula de la siguiente forma:
n5*256+n6
Así pues, siendo n5=8 y n6=156, 8*256+156=2204. que, como vemos en la captura un poco más abajo, es el puerto usado por el cliente. el servidor inicia conexión desde el puerto 20 hacian el puerto «resultante» de la orden PORT:
Request: PORT 192,168,1,5,8,156
El servidor, en el frame 12, responde con un código 200 indicando que la orden es correcta:
Response: 200 Port command successful
En el frame 13, vemos que el cliente, con la orden TYPE A, indica el tipo de representación de los datos A, es decir ASCII. Podría ser también:
- tipo ABCDIC (Código Extendido de Binario Codificado en Decimal)
- tipo imagen
Request: TYPE A
Responde el servidor, en el frame 14, con un código 200 de correcto y establecido el Type A.
Response: 200 Type set to A
El cliente, en el frame 15, cursa orden LIST. Esta orden hace que el servidor envíe un listado de los ficheros a través del proceso de transferencia de datos:
Request: LIST
En las siguientes frames (16,17,18), vemos que se establece comunicación en los puertos especficados en PORT y el puerto 20:
20 > 2204 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 2204 > 20 [SYN, ACK] Seq=0 Ack=1 Win=64512 Len=0 MSS=1460 20 > 2204 [ACK] Seq=1 Ack=1 Win=65535 Len=0
Frame 19. Se transmiten los datos pedidos por LIST por parte del servidor:
FTP Data: 175 bytes
En la ventana de contenido Hexadecimal/ASCII del paquete (Zona C de la interface gráfica), vemos que Wireshark nos proporciona, en la línea FTP Data: 175 bytes más información sobre el listado LIST:
Más abajo, en el frame 23, responde el servidor con un código 150 indicando estado del fichero correcto; va a abrirse la conexión de datos:
Response: 150 Opening data channel for directory list.
Se realiza en las siguientes dos trazas o frames el trasiego de datos de apertura de conexión de datos del listado que se pidió y el servidor responde, a su término en el frame 26, con código 226 que cierra la conexión de datos:
Response: 226 Transfer OK
De momento no se ha realizado ninguna transferencia de archivos. Lo hemos dejado ahí. Se cerró la conexión.
Unos frames más abajo, se vuelve a abrir la conexión de la misma forma que en los frames 1 a 3. Se vuelve a repetir todo el proceso, pero con algún cambio. Por ejemplo, en el frame 41, vemos que el Request es para TYPE I (imagen). En el frame 45, vemos que nos informa de la petición para descargar un determinado fichero:
Request: RETR 1.psd
Esta línea de arriba, con la orden RETR, indica petición para transferir una copia del fichero especificado (1.psd).
Se transmiten los datos del fichero a transferir del servidor al cliente en los frames 49,50:
FTP-DATA FTP Data: 1460 bytes FTP-DATA FTP Data: 588 bytes
El servidor responde, en el frame 52, con un código 150 que el estado del fichero correcto; va a abrirse la conexión de datos
Response: 150 Opening data channel for file transfer.
En los frames siguientes se transfiere el fichero.
servidor cliente FTP-DATA FTP Data: 1460 bytes servidor cliente FTP-DATA FTP Data: 1460 bytes cliente servidor TCP 2206 > 20 [ACK] Seq=1 Ack=4969 Win=64512 Len=0 servidor cliente FTP-DATA FTP Data: 1460 bytes servidor cliente FTP-DATA FTP Data: 1460 bytes cliente servidor TCP 2206 > 20 [ACK] Seq=1 Ack=7889 Win=64512 Len=0 servidor cliente FTP-DATA FTP Data: 1460 bytes servidor cliente FTP-DATA FTP Data: 1460 bytes cliente servidor TCP 2206 > 20 [ACK] Seq=1 Ack=10809 Win=64512 Len=0 ......... .........
Todo este proceso terminará cuando llege al frame 997 con un:
Responde: 226 Transfer OK.
Bien, hasta aquí hemos analizado el protocolo FTP y como extraer la información de wireshark. Pero podemos hacer mucho más, por ejemplo establecer filtros. Usaremos este mismo ejemplo para ver como hacerlo.
Aplicando los filtros de visualización.
Podríamos establecer filtros de visualización para listar los frames que contengan el comando ftp PASS:
Vamos a ver, respecto a FTP, que otros filtros podemos establecer.
El más básico sería «ftp», si aplicamos la palabra ftp en una captura que contengan otras conexiones que no sean FTP, veremos que sólo vamos a visualizar las que correspondan a ftp. Del mismo modo veremos que podemos establecer otros filtros como:
- ftp.request. Para todas las peticiones ftp Requests
- ftp.response. Para todas las respuestas.
- ftp.response.code. Para todos los códigos de respuestas.
Los filtros de visualización establecen un criterio de filtro sobre las paquetes que estamos capturando y que estamos visualizando en la pantalla principal de Wireshark. Al aplicar el filtro en la pantalla principal de Wireshark aparecerá solo el tráfico filtrado a través del filtro de visualización.
Podemos establecer también operaciones con los filtros:
Comparando Filtros.
* Igual a: eq ó ==
* No igual: ne ó !=
* Mayor que:gt ó >
* Menor que: lt ó <
* Mayor o igual: ge ó >=
* Menor o igual: le ó <=
Combinando Filtros.
* Negación: ! ó not
* Unión o Concatenación: && ó and
* Alternancia:|| ó or
Otro operadores.
* Contains: Realizamos una busqueda por la cadena contains:
Si queremos aplicar otro filtro pulsamos el botón Clear, introducimos el filtro y pulsamos Apply.
La forma de aplicar filtros para cualquier captura es la misma. Para saber más sobre como establecer filtros: http://seguridadyredes.nireblog.com/post/2010/02/23/wireshark-tshark-windump-filtros-pcap-creacion-de-filtros-y-filtros-avanzados-para-captura-de-paquetes
Una lista de todos los filtros que podemos establecer: http://www.wireshark.org/docs/dfref/
Ejemplos de filtros de visualización:
Hasta aquí la 6º parte. Seguiremos en el capítulo 7 con Wireshark de forma más avanzada.