El siguiente post es una traducción y adaptación de la publicación Versatile and infectious: Win64/Expiro is a cross-platform file infector escrita por Artem Baranov de ESET Rusia en We Live Security.

Recientemente nuestro Laboratorio de Investigación descubrió una nueva variante de un virus que infecta archivos de 64 bits y que es conocido como Expiro. Los virus que infectan archivos son bastante conocidos y han sido estudiados acuciosamente a través de los años. La mayoría del malware de este tipo es diseñado para modificar solamente binarios de 32 bits. En este sentido, la familia Expiro no era la excepción, no obstante, ESET descubrió una nueva variante de este virus completamente multiplataforma. En otras palabras, la variante de 64 bits puede infectar ejecutables de 32 bits y viceversa. Ambas amenazas son detectadas por los productos de ESET como Win64/Expiro.A y Win32/Expiro.NBF respectivamente.

El virus intenta maximizar su rango de propagación infectando archivos ejecutables en medios locales, removibles y recursos de redes. En cuanto al payload, este malware instala una extensión para Google Chrome y Mozilla Firefox. Asimismo, roba certificados y contraseñadas almacenadas en Internet Explorer, Microsoft Outlook y el cliente FTP FileZilla. En cuanto a las extensiones, son utilizadas para redirigir al usuario hacia URL maliciosas y para sustraer información sensible como credenciales bancarias. Expiro también desactiva servicios como Windows Defender y Windows Security Center y también termina algunos procesos.

El componente infeccioso de Win64/Expiro

Cuando ocurre una infección de un archivo de 64 bits, el cuerpo del virus es agregado al final de la nueva sección del archivo ejecutable. Esta se denomina .vmp0 y posee un tamaño en disco de 512.000 bytes. Para transferir el control al cuerpo principal (.vmp0), el virus inserta 1.269 bytes de código malicioso de inicio en el entry point del ejecutable. Antes de modificar el entry point, el virus copia los bytes originales al principio de la sección .vmp0. Este código de inicio desempaqueta las instrucciones del virus en la sección .vmp0. La siguiente captura muestra el código de inicio que es escrito en el entry point de un ejecutable de 64 bits durante la infección:

Sección vmp0 de Win64/Expiro

Durante el proceso de infección, el virus prepara el código de inicio para su posterior inserción dentro del archivo especificado. Cabe destsacar que algunas de estas instrucciones son sobrescritas para lograr una infección distinta modificando la sección .vmp0 según el caso (polimorfismo). En este contexto, las instrucciones sujetas a cambios son add, mov y lea (Load Effective Address) que están relacionadas con offsets directos. Al final del código el virus agrega una instrucción de salto que dirige al código desempaquetado en la sección .vmp0. La siguiente captura muestra el patrón de código de inicio (en la izquierda) y el código de inicio que es escrito en el archivo infectado (en la derecha):

Patrón de código de inicio

Tal como se muestra en la siguiente imagen, el código de inicio para los archivos de 32 bits también se localiza en la sección .vmp0:

Código de inicio para archivos de 32 bits

Este código desensamblado luce como instrucciones usuales de un archivo infectado:Código infectadoEl tamaño del código de inicio en los archivos de 64 bits es de 1.269 bytes y en los ejecutables de 32 bits es de 711 bytes. El virus infecta ficheros ejecutables analizando las carpetas de forma recursiva y agregando un archivo especial .vir. Luego, el malware crea nuevo contenido para posteriormente escribirlo dentro del archivo a infectar en bloques de 64K. Si el virus no logra abrir los archivos mediante la operación leer/escribir, intenta modificar el descriptor del fichero y la información de su dueño (owner). El virus también infecta archivos firmados digitalmente. Después de la infección de estos ficheros, los mismos pierden la firma debido a que la amenaza escribe su cuerpo después de la última sección del archivo (en donde se almacena la firma digital). Adicionalmente, el virus ajusta los valores del campo Security Directory y Data Directory modificando los campos RVA y Tamaño a 0. De este modo, tal archivo puede ser ejecutado subsecuentemente sin la referencia hacia la información de las firmas digitales. La siguiente captura muestra las diferencias entre un archivo de 64 bits limpio y uno infectado. También es posible observar el lugar original del overlay y la posición que adopta una vez ocurrida la infección (al comienzo de la sección .vmp0):

Código de 64 bits infectado y otro limpio

Desde el punto de vista del término de procesos, Expiro no es innovador. Utiliza un método basado en la obtención de procesos utilizando la API CreateToolhelp32Snapshot y posteriormente finalizando la ejecución de los programas a través de OpenProcess/TerminateProcess. Expiro finaliza los procesos MSASCui.exe, msseces.exe y Tcpview.exe.

Término de procesos

Cuando Expiro infecta un nuevo sistema crea dos mutex denominados “gazavat”:

Dos mutex

Adicionalmente, la presencia de este virus puede ser identificada en el sistema debido al largo número de operaciones I/O y al alto volumen de bytes leídos y escritos. Asimismo el virus necesita buscar todos los archivos del sistema para infectarlos, por lo tanto, el proceso de infección puede tardar bastante tiempo. Este aspecto se convierte en otro síntoma de infección producido por este código malicioso. La siguiente imagen muestra estadísticas obtenidas de un sistema infectado con Expiro:

Estadísticas de un sistema infectado con Expiro

El código del virus utiliza ofuscación durante la transferencia de los offsets y otras variables dentro de la API. Por ejemplo, la siguiente porción de código utiliza ofuscación aritmética mientras pasa los argumentos SERVICE_CONTROL_STOP (0X1) a advapi32!ControlService para desactivar algunos servicios:

Ofuscación aritmética en el traspaso de offsets

Con dicha porción de código, Expiro intenta desactivar los servicios wscsvc (Windows Security Center), windefend (Windows Defender Service), MsMpSvc (Microsoft Antimalware Service, parte de Microsoft Security Essentials) y NisSrv (Network Inspection Service utilizado por MSE).

El payload de Win64/Expiro

Con respecto al payload, Expiro instala extensiones maliciosas para Google Chrome y Mozilla Firefox. El archivo manifest para la extensión de Chrome luce de esta forma:

Manifest de la extensión maliciosa para Chrome

En el directorio de las extensiones de Chrome, la carpeta que almacena la extensión maliciosa se llama dlddmedljhmbgdhapibnagaanenmajcm. Dicha extensión utiliza dos script escritos en JavaScript: background.js y content.js. Después de la desofuscación, el patrón de código de background.js se ve de este modo:

Código JavaScript desofuscado

La variable HID es utilizada para almacenar la cadena OS version y el Product ID. Por otro lado, el objetivo de la variable SLST es guardar una lista de dominios que redirigen al usuario hacia recursos con contenido malicioso:

Sitios maliciosos a los que se conecta Expiro

El archivo manifest de la extensión para Firefox se ve de esta forma:

Archivo manifest de la extensión maliciosa para Firefox

En la captura que aparece abajo, se puede apreciar parte del código de content.js que parsea formularios en sitios web. Dicha operación permite que el malware obtenga información ingresada por los usuarios en páginas web:

Código encargado de parsear formularios web

Como bot, Expiro puede realizar las siguientes acciones:

  • Modificar las URL de control del servidor.
  • Ejecutar una consola de comando – lo pasa como parámetro a cmd.exe y devuelve el resultado al servidor.
  • Descargar y ejecutar plugins de Internet.
  • Descargar un archivo de Internet y guardarlo como %commonapddata%%variable%.exe.
  • Realizar ataques DoS.
  • Enumerar archivos que coinciden con la máscara b*.dll en la carpeta %commonappdata%. El virus carga cada uno de dichos archivos como una librería.
  • Llamar a funciones de plugin (B) y (C) desde plugin cargados.
  • Iniciar un servidor proxy (SOCKS, HTTP).
  • Establecer un puerto TCP de reenvío en un router local (SOAP).

Expiro intenta robar credenciales de servidores FTP almacenados en FileZilla en el archivo %appdata%FileZillasitemanager.xml. Internet Explorer también se ve afectado por Expiro a través de un objeto COM utilizado para robar información. Si un sitio incluye un formulario relacionado a tarjetas de crédito, el malware intentará obtener dichos datos. Para lograr tal objetivo, la amenaza comprueba que los datos ingresados en el formulario coincidan con el formato numérico utilizado por VISA y MasterCard. Posteriormente muestra un mensaje de error falso:

“Unable to authorize.n %s processing center is unable to authorize your card %s.nMake corrections and try again.”

El malware también puede robar certificados y las llaves privadas asociadas a los mismos.

Implicancias de Win64/Expiro

La infección de archivos ejecutables es un vector de propagación muy eficiente para este código malicioso. La variante de Expiro que ha sido analizada en este post representa un riesgo serio tanto para usuarios hogareños como corporativos. Debido a que el virus infecta archivos guardados en discos locales, dispositivos removibles y recursos de redes, los índices de propagación pueden crecer de forma similar a lo sucedido con el gusano Conficker que todavía aparece en el ranking de las amenazas más propagadas. En el caso de Expiro la situación es aún peor debido a que solo se necesita de un archivo infectado para que se vuelva a reinfectar un disco completo. Con respecto al payload, la infección de archivos representa una opción bastante atractiva para los cibercriminales. Esto porque la velocidad de propagación es más rápida y la capacidad multiplataforma amplía considerablemente el horizonte de potenciales víctimas.

Traducido y adaptado por André Goujon
Especialista de Awareness & Research