
L'équipe Donot du groupe APT (également connue sous le nom d'APT-C-35, SectorE02) est active depuis au moins 2012. L'intérêt des attaquants vise à obtenir des informations confidentielles et la propriété intellectuelle. Parmi les objectifs des criminels figurent les pays d'Asie du Sud, en particulier le secteur public du Pakistan. En 2019, nous observons leurs activités au Bangladesh, en Thaïlande, en Inde, au Sri Lanka et aux Philippines, ainsi qu'en dehors de la région asiatique - en Argentine, aux Émirats arabes unis et au Royaume-Uni.
Pendant plusieurs mois, nous avons suivi les modifications du code des téléchargeurs malveillants du groupe. Dans cet article, nous allons considérer l'un des vecteurs d'attaque, nous attarder sur les chargeurs mentionnés plus en détail et aborder les caractéristiques de l'infrastructure réseau.
Chaîne d'attaque
Au début de l'infection, la victime reçoit un document MS Word au format Office Open XML. Malgré l'absence de preuves explicites, nous pensons avec confiance que le vecteur de pénétration initial est un e-mail de phishing ciblé avec une pièce jointe au bureau. Le document lui-même n'est pas malveillant, mais il abuse de la capacité de charger automatiquement des éléments externes pour lancer le document de l'étape suivante.
Accès à un objet externe liéLe fichier de téléchargement est un document RTF exploitant la vulnérabilité CVE-2018-0802 dans Microsoft Equation. L'opération shellcode principale est précédée d'une chaîne d'intermédiaires qui déchiffrent la couche suivante avec XOR à un octet avec les clés 0x90 et 0xCE:
Décryptage par le premier shellcode du second
Décryptage par le deuxième shellcode du troisième
Déchiffrement par le troisième shellcode du principalLe shellcode principal effectue les actions suivantes:
- Un XOR à un octet avec la clé 0x79 déchiffre les données binaires du fichier % TEMP% \ one .
- Crée des fichiers exécutables C: \ Windows \ Tasks \ Serviceflow.exe et C: \ Windows \ Tasks \ sinter.exe . Ce sont des téléchargeurs de groupe malveillants, dont nous parlerons.
- Crée le fichier C: \ Windows \ Tasks \ S_An.dll , dans lequel deux octets 0x90 sont écrits.
- Crée le fichier C: \ Windows \ Tasks \ A64.dll . Selon la capacité du système, il s'agit d'une version x64 ou x86 modifiée de l'utilitaire UACMe pour augmenter les privilèges sur le système. En plus de contourner le contrôle UAC, la bibliothèque crée et exécute le script BAT % TEMP% \ v.bat , qui enregistrera l'un des chargeurs de démarrage précédemment créés en tant que service à l'aide des commandes suivantes:
sc create ServiceTool displayname= "ServiceFill" binpath= "C:\Windows\Tasks\Serviceflow.exe" start= "auto" sc start ServiceTool
Décodage des chaînes de script BAT dans les bibliothèques UACMe modifiées- Crée et exécute le script JScript C: \ Windows \ Tasks \ bin.js. Sa tâche consiste à démarrer la bibliothèque A64.dll via l'exportation de RnMod à l' aide de rundll32.
- Crée un raccourci WORDICON.lnk dans le répertoire de démarrage. Sa tâche consiste à démarrer le chargeur de démarrage sinter.exe après un redémarrage du système.
- Crée un raccourci Support.lnk dans le répertoire de démarrage. Sa tâche consiste à exécuter le script JScript bin.js après le redémarrage du système.
Shellcode principal décompiléAinsi, à ce stade, deux chargeurs de démarrage sont fixés de manière fiable dans le système, dont le fonctionnement sera discuté plus en détail.
Chargeurs Lo2
Malgré le classement, les chevaux de Troie ont des tâches différentes. Ainsi, le fichier
Serviceflow.exe a un rôle de surveillance. Il recueille des informations sur le système:
- nom d'utilisateur
- nom d'ordinateur
- le contenu des répertoires \ Program Files \ et \ Program Files (x86) \
- Version du système d'exploitation
- données du processeur -
et écrit les résultats dans un fichier log.txt. Il vérifie l'existence des
fichiers A64.dll et
sinter.exe dans le
répertoire \ Windows \ Tasks \ et, si nécessaire, les télécharge à partir du serveur de gestion Skillsnew [.] Et le démarre au nom de l'utilisateur actuel, en extrayant le jeton correspondant du processus winlogon.exe. Le
cheval de Troie
sinter.exe signale à un attaquant une infection en accédant à
hxxps://mystrylust.pw/confirm.php
et envoie des informations pré-collectées sur le système à skillsnew [.] Top. Ensuite, si l'ordinateur de la victime présente un intérêt supplémentaire, elle reçoit le contenu du fichier customer.txt sur
hxxp://docs.google.com/uc?id=1wUaESzjGT2fSuP_hOJMpqidyzqwu15sz&export=download
. Le fichier contient le nom de la voiture du serveur de contrôle [.] Drivethrough.top, avec laquelle une interaction supplémentaire a lieu. Les composants téléchargeables se trouvent dans le répertoire \ AppData \ Roaming \ InStore \ et leur lancement est fourni à l'aide du planificateur de tâches.
Lignes déchiffrées de fragments de commande et modèle de tâcheLe résultat du travail des téléchargeurs malveillants est l'intégration des composants du framework
yty dans le système, qui permettent d'extraire des informations plus complètes sur la victime, y compris des fichiers avec des extensions spécifiées, des lignes d'entrée interceptées, une liste de processus, des captures d'écran. Nous laisserons l'examen du fonctionnement des plugins au-delà de la portée de cet article.
En examinant d'autres exemples similaires, nous avons trouvé les chemins et les noms de projets laissés dans les informations de débogage:
- D: \ Soft \ DevelopedCode_Last \ BitDefenderTest \ m0 \ New_Single_File \ Lo2 \ SingleV2 \ Release \ BinWork.pdb
- D: \ Soft \ DevelopedCode_Last \ BitDefenderTest \ m0 \ New_Single_File \ Lo2
\ SingleV2_Task_Layout_NewICON \ Release \ BinWork.pdb - D: \ Soft \ DevelopedCode_Last \ BitDefenderTest \ m0 \ New_Single_File \ Lo2
\ SingleV2_Task_Layout_NewICON_N_Lnk \ Release \ BinWork.pdb - D: \ Soft \ DevelopedCode_Last \ BitDefenderTest \ m0 \ New_Single_File \ Lo2 \ SingleV3 \ Release \ WorkFile.pdb
- D: \ Soft \ DevelopedCode_Last \ BitDefenderTest \ m0 \ Off \ Off_New_Api \ Release \ C ++ \ ConnectLink.pdb
- D: \ Soft \ DevelopedCode_Last \ BitDefenderTest \ m0 \ Off \ Off_New_Api \ Release \ C ++ \ TerBin.pdb
- D: \ Soft \ DevelopedCode_Last \ BitDefenderTest \ m0 \ yty 2.0 - Avec des morceaux AES LOC FOR XP Just Bit-Change_Name \ Release \ TaskTool.pdb
- D: \ Soft \ DevelopedCode_Last \ BitDefenderTest \ yty 2.0 - Avec AES Chunks OFFS Just Bit \ Release \ C ++ \ MsBuild.pdb
- D: \ Soft \ DevelopedCode_Last \ yty 2.0 \ Release \ C ++ \ Setup.pdb
En plus de la sous-chaîne «yty 2.0», qui connecte les chevaux de Troie au cadre susmentionné, nous avons noté la sous-chaîne «Lo2», qui peut être une abréviation de «Loader 2».
Dans les versions des chargeurs de démarrage jusqu'à la mi-2018, toutes les lignes utilisées étaient stockées dans un fichier ouvert dans un fichier. Dans les versions suivantes, les attaquants ont commencé à utiliser le cryptage de chaînes. De version en version, l'algorithme a changé comme suit:
- À partir de mai 2018: inversez la ligne et encodez Base64.
- À partir d'avril 2019: effectuez les étapes précédentes deux fois .
- À partir de janvier 2019: crypter la chaîne avec l'algorithme AES en mode CBC et encoder Base64. Exemple de code Python pour le déchiffrement:
import base64 from Cryptodome.Cipher import AES aeskey = (0x23, 0xd4, 0x67, 0xad, 0x96, 0xc3, 0xd1, 0xa5, 0x23, 0x76, 0xae, 0x4e, 0xdd, 0xca, 0x13, 0x55) def aes_decrypt(data, aeskey): iv = bytes(list(range(0, 16))) key = bytes(aeskey) aes = AES.new(key, AES.MODE_CBC, iv) return aes.decrypt(data).decode().strip('\x00') def base64_aes_decrypt(data, aeskey): data = base64.b64decode(data) data = aes_decrypt(data, aeskey) return data
- À partir de juin 2019: effectuez une soustraction cyclique par caractère avec un tableau d'octets donné, encodez en UTF-8 et encodez Base64. Exemple de code Python pour le déchiffrement:
subgamma = (0x2d, 0x55, 0xf, 0x59, 0xf, 0xb, 0x60, 0x33, 0x29, 0x4e, 0x19, 0x3e, 0x57, 0x4d, 0x56, 0xf) def sub_decrypt(data, subgamma): o = '' length = len(data) subgamma_length = len(subgamma) for i in range(length): o += chr((0x100 + ord(data[i]) - subgamma[i%subgamma_length]) & 0xff) return o def base64_utf8_sub_decrypt(data, subgamma): data = base64.b64decode(data) data = data.decode('utf-8') data = sub_decrypt(data, subgamma) return data
- À partir d'octobre 2019: effectuez un XOR cyclique modifié caractère par caractère avec un tableau d'octets donné et encodez Base64 deux fois . La particularité de l'algorithme XOR est que si la valeur du caractère de chaîne correspond à la valeur du caractère dans le tableau d'octets donné, XOR n'est pas nécessaire. Exemple de code Python pour le déchiffrement:
xorgamma = (0x56, 0x2d, 0x61, 0x21, 0x16) def modxor_decrypt(data, xorgamma): o = '' length = len(data) xorgamma_length = len(xorgamma) for i in range(length): c = data[i] if c != xorgamma[i%xorgamma_length]: c = data[i] ^ xorgamma[i%xorgamma_length] o += chr(c) return o def base64_modxor_decrypt(data, xorgamma): data = base64.b64decode(data) data = modxor_decrypt(data, xorgamma) return data
Lors de l'écriture d'un script de décryptage, nous avons constaté que certaines lignes individuelles ne pouvaient pas être décryptées. Mais il s'est avéré ensuite que l'une des autres méthodes de décryptage décrites ci-dessus convenait à de telles chaînes. Après avoir vérifié qu'une seule méthode de décodage des données était implémentée dans chaque échantillon, nous sommes arrivés à la conclusion que les attaquants avaient simplement oublié de supprimer les lignes inutilisées ou de les remplacer par des lignes correctement cryptées pour la prochaine version du malware.
Les lignes de l'un des exemples du chargeur de démarrage ont été chiffrées de différentes manières, alors que dans le fichier exécutable une seuleDe telles erreurs sont toujours entre les mains des chercheurs: par exemple, à plusieurs reprises parmi les lignes oubliées sont venus les serveurs de contrôle des intrus, inconnus jusqu'alors pour nous.
Caractéristiques de l'infrastructure réseau
Pour être complet, nous notons quelques fonctionnalités caractéristiques qui aideront à connecter les futures attaques de regroupement:
- La plupart des serveurs de gestion sont loués auprès du fournisseur DigitalOcean, LLC (ASN 14061) et sont situés à Amsterdam.
- Les attaquants n'utilisent pas les mêmes serveurs pour des noms DNS différents: pour chaque nouveau nom de domaine, ils préfèrent réserver un nouvel hôte dédié.
- Dans la plupart des cas, les données d'enregistrement des propriétaires de domaine sont masquées par les services de confidentialité. Les services suivants sont utilisés à cet effet: WhoisGuard, Inc.; Service de protection de la vie privée Whois, Inc.; Domaines par proxy, LLC; Fondation Whois pour la protection de la vie privée. Dans certains cas, les données sont disponibles et vous pouvez suivre l'approche générale pour remplir les champs.
Informations sur le domaine WHOIS gravure de forêts [.] Com
Service de stockage en nuage d'informations sur le domaine WHOIS [.] Com- Les plus utilisés sont .top, .pw, .space, .live et .icu TLD.
Conclusion
Donot Team se distingue par l'utilisation de ses propres outils à chaque étape de l'attaque. Techniques appliquées pour compliquer l'analyse de code - d'une part, le manque de tentatives pour cacher ou masquer soigneusement leurs actions dans le système - d'autre part.
De multiples attaques sur les mêmes cibles peuvent non seulement indiquer un intérêt particulier pour le cercle de victimes sélectionné, mais également confirmer la faible efficacité des tactiques et techniques utilisées.
Publié par Alexey Vishnyakov, Positive Technologies
CIO6ce1855cf027d76463bb8d5954fcc7bb - chargeur de démarrage au format MS Word
hxxp: //plug.msplugin.icu/MicrosoftSecurityScan/DOCSDOC
21b7fc61448af8938c09007871486f58 - compte-gouttes au format MS Word
71ab0946b6a72622aef6cdd7907479ec - Chargeur Lo2 dans C: \ Windows \ Tasks \ Serviceflow.exe
22f41b6238290913fc4d196b8423724d - Chargeur Lo2 dans C: \ Windows \ Tasks \ sinter.exe
330a4678fae2662975e850200081a1b1 - version modifiée par x86 de UACMe
22e7ef7c3c7911b4c08ce82fde76ec72 - version x64 modifiée de UACMe
compétencesnouvelles [.] haut
hxxps: //mystrylust.pw/confirm.php
hxxp: //docs.google.com/uc? id = 1wUaESzjGT2fSuP_hOJMpqidyzqwu15sz & export = download
voiture [.] drivethrough.top
burnforests [.] com
cloud-stockage-service [.] com