Análisis de SMTP con Wireshark

Análisis de SMTP con Wireshark

Wireshark es una herramienta que nos permite capturar el tráfico que pasa a través de nuestra tarjeta de red, pero no sólo eso. Su interfaz gráfica está diseñada para interpretar los diferentes protocolos que pueden llegar hasta nuestra tarjeta, siendo esta característica muy útil cuando se trata de comprender una conversación específica o cuando se quiere capturar información muy precisa. Sus capacidades de filtrado, disección y traducción del paquete la hacen una herramienta para cualquier pentester ó ethical hacker.

En este Post mostramos la forma de utilizar Wireshark para interpretar y filtrar una conversación SMTP. Si aún no está familiarizado con la creación, envío y recepción de correo electrónico lo invitamos a visitar nuestra publicación sobre Fundamentos de Correo Electrónico que es la base para una interpretación adecuada del material que presentaremos a continuación.

Sin importar el cliente utilizado para crear y enviar un correo electrónico, la forma en que es transferido entre servidores de correo siempre es la misma y es este hecho el que nos permite poder interpretar cualquier transferencia SMTP en Wireshark.

Para este estudio mostraremos los siguientes puntos:

  1. Obtención de la captura
  2. Filtrado básico de SMTP con Wireshark
  3. Interpretación de los campos de la transferencia SMTP con Wireshark
  4. Extracción de archivos del correo con Wireshark
  5. Filtrado avanzado de SMTP con Wireshark

 

1.       Obtención de la captura

Todo comienza por obtener una captura de paquetes de red capaz de ser interpretada por Wireshark. Esta información se puede obtener en general de dos formas. La primera es que la máquina ó servidor donde ejecutamos Wireshark esté en un punto tal que le permita ver la conversación completa, esto se puede lograr instalando Wireshark en la máquina de donde salen los correos ó donde llegan. En ambientes virtuales VMWare Workstation, las tarjetas de red de las máquinas virtuales están diseñadas en modo promiscuo así que si tenemos montado un laboratorio con servidores de correo podemos correr Wireshark en cualquier máquina Windows y esto nos permitirá ver el tráfico. Para esto recomendamos que todas las tarjetas estén en modo NAT. En ambientes de VMWare ESX la máquina que tiene instalado Wireshark debe tener su tarjeta configurada en modo promiscuo, si no sabe cómo hacer esto, se lo mostramos en nuestro Post Configurar tarjetas de red en ESX en modo promiscuo.

La segunda forma es cuando no tenemos un Wireshark en la máquina donde vamos a realizar la captura. Generalmente esto pasa cuando la máquina donde se necesita la captura es un Linux / UNIX. En este caso podemos hacer uso del comando tcpdump que nos permite capturar los paquetes en formato pcap. Dicho comando capturará todos los paquetes de red lo que puede hacer que el archivo final sea muy grande. Para evitar esto y debido a que sólo necesitamos tráfico SMTP podemos ejecutar el siguiente comando que sólo captura los paquetes que van hacia el puerto 25.

# tcpdump –i eth0 port 25 –s0 –w captura.cap

El comando mostrado captura todos los paquetes que van dirigidos al puerto 25 en la interfaz eth0. Por defecto, tcpdump trunca el tamaño de los paquetes por lo que al ver la captura el contenido se puede ver cortado, para esto usamos la opción “-s0” que impone un tamaño ilimitado para los paquetes. Finalmente el último parámetro “-w” nos permite guardar la captura en un archivo llamado captura.cap que posteriormente podemos pasar a nuestra máquina Windows para ser analizado. Si la configuración de su equipo es distinta se debe modificar el comando para coincidir con su ambiente, por ejemplo, si el tráfico SMTP viaja por la interfaz loopback, debe cambiar el parámetro “-i” por “-i lo”. Así mismo, si el puerto no es el 25 deberá modificar el comando para colocar el puerto adecuado.

NOTA: Si no se coloca el parámetro “-i eth0” la captura se realiza por defecto en la primera interfaz.

Finalmente también cabe resaltar que la captura se puede obtener de otro tipo de equipos como Firewalls o balanceadores en cuyo caso se puede obtener un archivo “.log”. Lo único que debe tomar en cuenta en estos casos es que el archivo esté capturando todos los paquetes en modo crudo ó “raw” donde podamos ver los bits que se están transmitiendo, de otra forma, Wireshark no podrá interpretar el archivo.

 

2.       Filtrado básico de SMTP con Wireshark

Ya que tenemos la información lista, ya sea que contamos con un archivo que abrimos en Wireshark ó que tenemos la aplicación capturando en tiempo real los paquetes de la conversación, el siguiente punto es mostrar en Wireshark sólo aquellos paquetes que nos interesan ya que en cuanto ponga la captura puede ver decenas ó incluso cientos de líneas de diversos protocolos.

Para hacer la lectura más clara utilizaremos los filtros más básicos:

  • Filtrar sólo el protocolo SMTP
  • Filtrar sólo el tráfico de ó entre las máquinas que nos interesan.

Inicialmente verá la pantalla de Wireshark con los paquetes en un formato poco legible.

smtp1

El primer filtro nos ayuda a que Wireshark acomode los paquetes de acuerdo a sus filtros predeterminados para SMTP. La diferencia contra la pantalla anterior se muestra claramente en la siguiente imagen:

smtp2

Ya que tenemos una vista más clara de la conversación, el siguiente paso es hacer click derecho sobre alguno de los paquetes y seleccionar la opción “Follow TCP stream”. Ahora podremos ver la conversación tal y como ocurrió.

smtp3

Cuando usamos esta opción verá que el filtro de Wireshark cambia en automático a algo como “tcp.stream eq 44”, esto es normal y se debe a que se deben filtrar todos los paquetes que intervinieron en la misma sesión TCP en la cual se transmitió el correo que estamos viendo. Si su captura sigue corriendo, debe poner nuevamente el filtro para seguir viendo más correos o para buscar otro correo diferente.

smtp4

En aquellos casos donde la captura muestra conversaciones SMTP con diferentes servidores podemos filtrar exclusivamente las sesiones establecidas con un servidor en particular, esto lo logramos con el siguiente filtro:

ip.addr eq [IP_servidor1] and ip.addr eq [IP_servidor2]

ó

ip.src eq [IP_servidor1] and ip.dst eq [IP_servidor2]

Como resultado, veremos únicamente las sesiones SMTP entre estos dos servidores. El segundo filtro asume que sabemos cuáles son las direcciones IP de origen y destino.

 

3.       Interpretación de los campos de la transferencia SMTP con Wireshark

Ya que tenemos la captura descifrada con el filtro de SMTP y opcionalmente con las direcciones IP de los servidores que necesitamos, el siguiente paso es interpretar el resultado.

Lo primero a notar es que cuando usamos la opción “Follow TCP stream” lo que se muestra no es realmente un correo sino la sesión SMTP utilizada para enviar uno o más correos. Por esta razón puede que a veces el filtro muestre un correo y en otras se vean más.

La conversación debe interpretarse como se muestra a continuación:

smtp5

  • SMTP Handshake. Terminado el TCP Handshake, inicia el SMTP Handshake que consta de tres paquetes. El primero es el banner SMTP que debe ofrecer el SMTP Server donde acepta iniciar una nueva sesión. El segundo es el envío del comando HELO / HELO donde el SMTP Client se identifica con su FQDN. El tercero y último es un código 250 que puede variar de acuerdo al comando utilizado. Si se usa HELO sólo se obtiene un código 250 con el FQDN del SMTP Server como argumento. Si se usa EHLO se obtiene además del FQDN, una lista de todos los mecanismos ESMTP que el servidor puede aceptar, esta lista sirve para que el SMTP Client sepa por ejemplo si el servidor soporta transferencias TLS antes de intentar iniciar una.
  • SMTP Envelope. Este campo corresponde al envío de los comandos MAIL y RCPT donde el SMTP Client identifica quién está enviando el correo y quién o quiénes son los destinatarios. Si ambos campos son correctos y no violan ninguna política de seguridad (como violación de relay) el SMTP Server acepta ambos comandos enviando una respuesta 250 OK. Tome en cuenta que estos valores pueden ser diferentes a los encabezados From y To. Para entender mejor estas diferencias puedes visitar nuestra publicación Fundamentos de Correo Electrónico.
  • Mail Body. Esta sección incluye el envío del comando DATA y como respuesta obtenemos un código 354 indicándonos que el servidor de correo destino está listo para recibir el cuerpo del correo. Aquí se envían los encabezados, el texto del cuerpo y los archivos adjuntos en caso de haberlos.

Finalmente, después de que todo el Body ha sido transmitido el correo se cierra con la secuencia “ENTER-PUNTO-ENTER” ó “\r\n.\r\n”. Si el correo es aceptado, el SMTP Server responderá con un código 250 y alguna leyenda donde nos indica que el correo ha sido encolado. En ese momento la responsabilidad del correo se transfiere a este servidor. Para terminar la conversación, el servidor origen envía el comando QUIT con el que se cierra esta sesión.

smtp6

En algunos casos es necesario identificar la secuencia binaria de la terminación del correo, en esos casos puede cambiar la vista de la pantalla de Follow TCP stream para mostrar el correo con secuencia correspondiente de valores hexadecimales como se muestra en la siguiente imagen:

smtp7

Se observa que los caracteres “\r\n.\r\n” corresponden a “0x0d 0x0a 0x2e 0x0d 0x0a” con lo que incluso sin ver el contenido del correo sabemos que corresponde al final del correo. En estos casos observe que los caracteres se interpretan en un equivalente ASCII como “.”, esto es porque no hay un caracter ASCII legible para interpretar adecuadamente \r\n.

 

4.       Extracción de archivos del correo con Wireshark

Otra tarea común para la recuperación, auditoría y monitoreo de políticas de seguridad es la extracción de los archivos que se han transmitido por correo electrónico. Wireshark facilita esta tarea mediante la división granular de todo el contenido de los paquetes TCP en los que viaja la información.

Si sólo se van a buscar archivos se puede utilizar el filtro “imf” (INTERNET MESSAGE FORMAT) ya que dentro de este paquete está la información del correo. A diferencia de “smtp”, este filtro no responde a una sesión SMTP sino al formato que debe llevar el contenido del correo como está definido en los RFC 822 y 2822, por lo que facilita la búsqueda de correos con adjuntos al eliminar todos los paquetes que se refieren a la sesión como los comandos MAIL y RCPT por ejemplo.

smtp8

Como lo muestra la imagen anterior, cuando usamos este filtro sólo nos aparecen las líneas en las cuáles está contenido el cuerpo de un correo electrónico desde sus encabezados hasta sus archivos adjuntos. Si queremos ver qué adjuntos se encuentran de este archivo basta utilizar el panel de “Packet Details” que se encuentra debajo del panel de capturas.

smtp9

Al abrir los detalles del paquete IMF, observamos los diferentes campos que define el RFC 2822 para la formación de un correo. De la definición de SMTP sabemos que el único juego de caracteres permitido es el US-ASCII, por lo que si queremos enviar una imagen o un archivo de música o video debemos utilizar el formato MIME para identificar en donde se encuentra el archivo y de qué forma ha sido codificado.

MIME es un formato comúnmente utilizado tanto para SMTP como HTTP que con un juego de reglas simples permite la transferencia de prácticamente cualquier archivo sin importar su contenido o formato.

Si continuamos abriendo el paquete IMF y si el correo contiene algún tipo de archivo adjunto veremos una sección similar a esta (la descripción del formato puede variar de acuerdo al contenido del archivo).

smtp10

Con esto sabemos que este correo en particular contiene una imagen adjunta, ahora el problema se reduce a extraer los bytes que lo componen. Para esto hacemos click derecho sobre el paquete que corresponde al formato del archivo, en nuestro caso es el que aparece en azul (JPEG File Interchange Format) y seleccionamos la opción “Export Selected Packet Bytes”. Se nos pedirá la ubicación y nombre donde se guardará el contenido del archivo, aquí es importante que grabe el archivo como un TXT. Observe la línea anterior al formato del archivo, la que dice Content-Transfer-Encoding: base64. Esta línea indica los bytes de ese archivo se encuentran codificados en BASE64 que es un algoritmo que permite transformar cualquier archivo a un formato que utiliza únicamente el juego de caracteres US-ASCII que es el permitido para transferencias en SMTP.

Ya que guardó el archivo en formato de texto plano, busque un decodificador en línea para este formato, aquí dejamos uno de referencia: http://www.motobit.com/util/base64-decoder-encoder.asp.

Aquí pegamos el contenido del archivo de texto y seleccionamos las opciones “decode” y “export to a binary file”. Hacemos click en el botón “Convert the source data” y nuestro archivo estará listo para descargarlo, si lo abrimos, veremos ahora sí el archivo en su formato original.

Recuerde que toda transferencia por red, no importa si se trata de texto o archivos de 1KB ó 1GB, todo su contenido debe viajar por la red, y como tal, sólo necesitamos encontrar los paquetes indicados para poder extraer dicha información.

 

5.       Filtrado avanzado de SMTP con Wireshark

Existen otras situaciones donde es necesario aplicar filtros más avanzados para encontrar el número de sesiones, el número de correos enviados, número de destinatarios, correos con errores, etc., en nuestro post Filtros en Wireshark hemos colocado este y otros filtros que le ayudarán a descifrar de forma eficiente cualquier conversación SMTP usando Wireshark como herramienta de análisis.

 

Para mayor información sobre las reglas/creación y transmisión de un correo electrónico te recomendamos nuestra publicación sobre Fundamentos de Correo Electrónico. Para conocer más sobre cómo se transmite un correo electrónico por TLS / SSL te recomendamos nuestra publicación sobre Fundamentos del Protocolo TLS. En nuestro post Descifrando una conversación SMTP por TLS con Wireshark encontrarás también información sobre el uso de Wireshark ver el contenido en texto claro de correos transmitidos por canales seguros. También puedes visitar publicaciones relacionadas haciendo click en los tags al final del Post.

 

Recuerda que puedes enviarnos tus preguntas y comentarios a nuestra cuenta de Twitter: @redinskala donde encontrarás más información y tips de seguridad.

Gracias por tu visita!

One thought on “Análisis de SMTP con Wireshark

  1. Pingback: Análisis de pérdida de conexión | 421 4.4.2 host Error: timeout exceeded | RedinSkala

Comments are closed.