Presentamos Mail Malware Trap

A raíz de la entrada del correo electrónico donde se enlazaba a un troyano bancario, comencé a desarrollar un programita que tenía en mente desde hacía tiempo. Se trata de un recolector de Malware de correos electrónicos, encargado de acceder a distintas cuentas de correo, obtener el correo electrónico, almacenarlos en base de datos, y en caso de poseer adjuntos, ser analizados con la API de Virus total.

Veámoslo con más detenimiento. Primero será necesario disponer de una serie de sondas, correspondientes a cuentas de correo electrónico perteneciente en distintos servidores públicos como son Gmail, Yahoo o Hotmail, así como una serie de correos privados como por ejemplo el corporativo. Dichas cuentas de correo solo se usarán para recoger el correo que llegue a la bandeja de entrada y Spam. Para ello en ocasiones será necesario hacer filtros para trasladar el correo de la carpeta Spam a bandeja de entrada. Por ejemplo para Gmail sería necesario crearse un filtro de tipo texto con la siguiente entrada “is:spam” e indicar que debe enviarse como correo no leído a la bandeja de entrada. Con esto dispondremos de varias cuentas de correo distribuidas sobre distintos servidores de correo cuyo único objetivo es almacenar los correos de entrada.

Así, el recolector de malware lo que hará será conectarse a las cuentas para descargarse el correo nuevo y una vez obtenido insertará en una base de datos MySQL el correo descargado, indicando de qué servidor de correo lo ha descargado, a qué hora ha llegado, quién lo ha enviado, con qué asunto y con qué texto. Tanto el asunto como el texto se almacenarán en base64 en la base de datos.

El agente también comprobará si el correo electrónico tiene adjuntos. En caso de tener se descargará el adjunto conservando su nombre y lo almacenará en un árbol de sistema de ficheros compuesto por año, mes y identificador de correo de la base de datos. A su vez se insertará en la base de datos de que correo procede el adjunto, donde está almacenado, su comprobación MD5, si ha sido subido anteriormente a Virus Total y en caso afirmativo, se nos mostrará el resultado de los antivirus.

Veamos como funciona. En primer lugar será necesario disponer de una base de datos MySQL en el servidor donde instalemos el agente. Una vez dispongamos del MySQL será necesario crearnos el usuario y la base de datos mediante las siguientes órdenes:

$ mysql -u root -p
> CREATE database mailmalwaretrap;
> CREATE USER 'mailmalwaretrap'@'localhost' IDENTIFIED BY 'MiContrasenya';
> GRANT SELECT, INSERT, DELETE ON mailmalwaretrap.* TO 'mailmalwaretrap'@'localhost';

A continuación volcaremos el esquema de la base de datos, que podéis obtener de mailMalwareTrap.sql (los ficheros están al final del post):

$ mysql -u root -p < mailMalwareTrap.sql

Posteriormente configuraremos el agente, escribiendo en el fichero “mailMalwareTrap.conf” una línea por cada cuenta de correo que dispongamos, teniendo en cuenta que se deberá seguir el siguiente esquema “servidorCorreo|cuentaCorreo|contraseña”. Si por ejemplo nuestro servidor de correo es “pop.gmail.com”, la cuenta “lol@gmail.com” y contraseña “lolazo” el fichero será el siguiente:

# cat mailMalwareTrap.conf
pop.gmail.com|lol@gmail.com|lolazo

Para finalizar obtendremos el agente “mailMalwareTrap.py” donde será necesario tener instalado las dependencias de MySQL para Python.

Para el ejemplo que mostraremos usaremos una única cuenta de Gmail donde enviaremos desde otro servidor de correo adjuntando un fichero pdf que corresponde con el meterpreter. Una vez enviado ejecutaremos el script para que procese los correos nuevos. Se aconseja que se ponga el script en el crontab para que se ejecute cada hora:

$ mailMalwareTrap.py
Hay correos nuevos en "pop.gmail.com".
$

Si accedemos a la base de datos tabla “mail”, veremos que se ha insertado el nuevo correo con identificador “1”, correspondiente a la sonda “1”, que ha llegado a las 10:52 del 11 de Noviembre, cuyo asunto y texto están en base64 para evitar “sorpresas”:

Si analizamos la tabla malware veremos lo siguiente:

Malware con identificador 1, procedente del correo con ID 1, que se encuentra almacenado en “/tmp/result/2011_11/1/meterpreter.pdf”, que ya había subido con anterioridad a Virus Total, listado de los resultados de los distintos antivirus (la mayoría lo detectan), texto añadido por nosotros (en este caso está a NULL) y para finalizar la comprobación md5 del malware.

Si comprobamos a mano la comprobación md5 veremos que es la misma que hay almacenada en la base de datos:

$ md5sum /tmp/result/2011_11/1/meterpreter.pdf
062e7ecdc4a15f2f49cb5b2b09e5a4ea /tmp/result/2011_11/1/meterpreter.pdf
$

Como ven es una forma sencilla de tener un recolector de malware de las carpetas Spam de distintos servidores que permite analizar los riesgos que pueden acontecer en su infraestructura.

Como mejoras pendientes tengo dos puntos claramente identificados: el primero será buscar en el texto del correo posibles URLs y analizar con Virus Total si se tratan de URL con malas intenciones. Así mismo el segundo punto lo constituye una interfaz gráfica que permita gestionar los correos de forma más sencilla. Pero todo esto ya otro día ;)

Espero que les haya gustado la entrada, todo sea dicho, imagino que alguien habrá tenido la idea antes, pero sinceramente, yo creo que para aprender es necesario hacerlo uno mismo. Los ficheros pueden descargarlos directamente desde este enlace: mailMalwareTrap.rar.

Comments

  1. Gran programa, se me ocurre que puedas generar estadisticas a que servidor de correo llega mas Malware. Saludos.

  2. Buenas Joaquín, te animo a que continues con el proyecto, es muy interesante.

    Saludos!

  3. Joaquín una pregunta, bueno dos, con que versión de Python esta echo el script?
    Podrías detallar el procedimiento para etiquetar el spam en gmail, no lo acabo de entender, gracias.

  4. Python versión 2. En los include tiene las dependencias necesarias para el script, si me indica que distribución está usando le puedo decir que paquetes necesita.

    Respecto a lo de gmail únicamente tiene que crear un filtro personalizado donde en la opción de texto debe poner «is:spam» y marcar la opción de reenviar a la carpeta de recibidos. Es como cualquier otro filtro de gmail.

    Un saludo

  5. Gracias! mañana le echare un vistazo! Buen trabajo!

  6. Hola, ya he podido probarlo he instalado todas las dependencias que hay en el script y a pesar de eso…

    ./mailMalwareTrap.py
    Hay nuevos correos en «pop.gmail.com».
    Traceback (most recent call last):
    File «./mailMalwareTrap.py», line 342, in
    getMail(mailIP, mailAccount, mailPasswd)
    File «./mailMalwareTrap.py», line 255, in getMail
    idm = insertMail(server, user, mail[«Date»], mail[«From»], mail[«Subject»], payload)
    File «./mailMalwareTrap.py», line 72, in insertMail
    payloadb64 = base64.b64encode(payload)
    File «/usr/lib/python2.6/base64.py», line 53, in b64encode
    encoded = binascii.b2a_base64(s)[:-1]
    TypeError: b2a_base64() argument 1 must be string or read-only buffer, not instance

    Alguna idea?

  7. Buenas,

    acabo de hacer una prueba en un entorno nuevo con Debian 7 y lo único que me ha hecho falta instalar es lo siguiente:

    # apt-get install mysql-server
    # apt-get install python-simplejson
    # apt-get install python-mysqldb

    # mysql -u root -p
    mysql> CREATE database mailmalwaretrap;
    Query OK, 1 row affected (0.00 sec)

    mysql> CREATE USER ‘mailmalwaretrap’@’localhost’ IDENTIFIED BY ‘PASSWORD!’;
    Query OK, 0 rows affected (0.00 sec)

    mysql> GRANT SELECT, INSERT, DELETE ON mailmalwaretrap.* TO ‘mailmalwaretrap’@’localhost’;
    Query OK, 0 rows affected (0.00 sec)

    mysql> quit

    # mysql -u root -p < mailMalwareTrap.sql

    Edito el fichero mailMalwareTrap e indico el usuario de la BBDD, la contrasenya BBDD y la key de la API de VTotal:

    root@S2-Jmoreno:/home/moxilo/Herramientas/malwaretrap# ./mailMalwareTrap.py
    No hay correos en "pop.gmail.com".

    Envió correo y vuelvo a ejecutarlo:
    root@S2-Jmoreno:/home/moxilo/Herramientas/malwaretrap# ./mailMalwareTrap.py
    Hay nuevos correos en "pop.gmail.com".

    Lo único que se me ocurre es que compruebes antes de la línea "payloadb64 = base64.b64encode(payload)" que ese payload no es vació o que te mustre con un print el valor de su contenido.

    Yo hice pruebas mandando y sin mandar datos en el body pero no me ha dado ningún fallo. Si aportaras más información podría decirte pero solo con la traza…