Durante enero de 2016 han aparecido ciertos troyanos bancarios que envían información a los cibercriminales a través de correo electrónico. Para lograrlo, establecen conexiones por medio de sockets, con diversos servidores de SMTP. Hoy veremos cómo simular este servicio para capturar la información y reconstruir los mensajes enviados.
El código malicioso que analizaremos es un troyano bancario que afecta a usuarios de Brasil y que ha sido programado en Delphi. No nos detendremos en las técnicas que utiliza ni en las entidades bancarias a las que apunta, pero sí podemos mencionar que, una vez que ha sido ejecutado en un sistema, compara la URL que está siendo visitada en el navegador contra un listado. Si la URL es de interés para los criminales, empieza a tomar varias capturas de pantalla.
Así, la URL es obtenida del navegador mediante el uso de las funciones de DDE (Dynamic Data Exchange), una implementación de comunicación entre procesos por paso de mensajes y memoria compartida. A continuación se muestra un ejemplo de cómo obtener la URL de Firefox (código en C#):
Es importante mencionar que dicho listado contiene URL específicas donde se realizan pagos: en ellas encontraremos palabras clave como "checkout", "pagamento" o "carrinho". En la siguiente imagen vemos una parte del código: si el sitio que está siendo navegado por el usuario coincide con alguna de las strings, el malware comienza a tomar capturas de pantalla cada cierta cantidad de segundos:
Luego, dado que el listado contiene URLs en las que se ingresan datos de pago, como números de tarjetas de crédito, las capturas de pantalla consiguen tomar esos números ingresados. Así, y luego de haber tomado 12 capturas de pantalla, el malware establece una conexión con un servidor de SMTP mediante el uso de sockets, para el envío de la información robada por correo electrónico. Si utilizamos un debugger y ponemos un breakpoint en la llamada a connect (de ws2_32.dll), podremos ver los parámetros de la conexión cuando se alcance ese punto.
Se observa el servidor y también el puerto (24Bh = 587) que será utilizado para la conexión. Estamos ahora en condiciones de simular un servicio que escuche en el puerto 587 y responda ante los comandos enviados por el malware. Para ello utilizaremos FakeNet, con la extensión de Python que viene incluida y que simula un servidor SMTP. Solamente debemos modificar el archivo de configuración para que escuche en el puerto 587 tráfico sin cifrar:
Una vez que el malware ha enviado la información a nuestro servidor falso, podemos observar todo lo que ha sido capturado. A continuación vemos los comandos y la comunicación entre el servidor y el malware, y el mensaje, luego del comando DATA:
Además, las imágenes con las capturas de pantalla son codificadas en Base 64 para su envío, según lo establecido por la especificación MIME.
Ahora bien, si tomamos todo el contenido del mensaje que aparece luego del comando DATA (hasta el carácter “.” que da fin al bloque del mensaje) y lo guardamos en un archivo de texto con extensión .eml, podremos reconstruir el correo electrónico y visualizarlo con cualquier cliente de correo:
Las técnicas utilizadas por este malware son sencillas (dado que no requieren de la inyección de código en los navegadores, ni utilización de hooks en llamadas al sistema) pero muy efectivas, ya que los datos de pago ingresados en los sitios atacados son completamente visibles ante una captura de pantalla.
SHA-1
B63EC693633B1190F304761826F6C7D4621C6617