Opération TA505, quatrième partie. Des jumeaux



Nous continuons à parler des activités du groupe de hackers TA505. L'expression bien connue «le nouveau est l'ancien bien oublié» est la plus adaptée comme épigraphe au chapitre suivant de l'histoire du groupe TA505. Certes, cette fois «l'ancien» n'est pas tant «oublié» qu'il est retravaillé et amélioré.

Début septembre, nous avons découvert plusieurs téléchargeurs malveillants fournis avec le packer PE spécial du groupe dont nous avons parlé plus tôt . À première vue, ils ressemblaient aux stagers de porte dérobée FlawedAmmyy bien connus. Mais une analyse plus approfondie a montré que ce n'est pas le cas. Les techniques d'écriture de code les plus avancées ne nous ont pas conduits à des charges utiles radicalement opposées en termes de qualité d'exécution.

Dans cet article, nous allons examiner de plus près les outils trouvés et établir des parallèles avec ce qui est déjà connu.

Bootloader twein


Tout d'abord, ce qui est curieux: de tous les échantillons de bootloader que nous avons réussi à collecter, un seul a une signature numérique:



Fig. 1. Signature numérique du chargeur de démarrage

Certificat délivré au nom de PEAR SOLUTIONS LTD. Soit dit en passant, ce n'est pas la première fois qu'un groupe signe ses outils, les faisant passer pour des logiciels légitimes d'organisations fictives. Voici quelques autres noms qui ont utilisé le TA505 pour d'autres familles de logiciels malveillants:

  • ET HOMES LTD,
  • FIT AND FLEX LIMITED,
  • MISHA LONDON LTD,
  • SATOJI KAIDA MB,
  • TRÈS TÉLÉ LIMITÉ.

Étant donné que les chargeurs de démarrage détectés ne diffèrent pas entre eux, nous sélectionnons celui signé ci-dessus et nous y attardons plus en détail.

Tout au long du travail des logiciels malveillants, presque chaque action est accompagnée d'une écriture dans le fichier journal et d'une sortie de débogage de tout ce qui se passe:



Fig. 2. Déboguer la sortie et la journalisation

Un tel traçage simplifie non seulement l'analyse statique du fichier, mais aide également à découvrir ce qui ne va pas dans les systèmes d'analyse dynamique:



Fig. 3. Déboguer la sortie dans l'analyseur en ligne ANY.RUN

Troyan vérifie la disposition de la langue du clavier - et ne fonctionne pas en Russie et dans les pays voisins:



Fig. 4. Vérification de la disposition des langues du clavier
Il crée ensuite le mutex Global\system32_mutant_service et vérifie la disponibilité Internet à l'aide d'une demande HTTP GET à google.com. Après cela, il détermine la manière d'accéder au réseau (adresse dédiée ou NAT ) en déterminant l'adresse IP externe par les services myexternalip.com, ipecho.net et ifconfig.me et en comparant la valeur obtenue avec celles spécifiées dans les paramètres réseau du système:



Fig. 5. Comparaison des adresses IP internes et externes

Ensuite, le malware détermine la version de la bibliothèque %SystemRoot%\system32\crypt32.dll et, si le numéro de version et le numéro de révision sont respectivement inférieurs à 7601 et 18741 , télécharge et installe la mise à jour KB3033929 fonction de la version du système d'exploitation:



Fig. 6. Téléchargez et installez les mises à jour du système

Les attaquants TA505 prennent soin de la victime et corrigent le système au besoin? Pas du tout. L'installation de la mise à jour est associée à la fin de la prise en charge des certificats de sécurité de code signés à l'aide de SHA-1 et à son abandon au profit de l'algorithme SHA-2. Très probablement, les pirates ont déjà eu du mal à exécuter des charges utiles signées sur des systèmes non mis à jour. Fait intéressant, après avoir installé la mise à jour, le cheval de Troie envoie le journal des actions généré au serveur de gestion, arrête son travail et se supprime lui-même, effaçant les traces restantes.



Fig. 7. Arrêt après l'installation d'une mise à jour du système

Si l'installation de la mise à jour n'est pas requise, le chargeur de démarrage collecte et envoie les informations suivantes au serveur de gestion:

  • informations système
  • des informations sur les logiciels installés,
  • des informations sur les logiciels signés dans les répertoires% ProgramFiles% et% ProgramFiles (x86)% (le cas échéant),
  • Informations sur les pilotes signés dans le répertoire% SystemRoot% \ drivers.

Notez qu'un code légitime a été utilisé pour obtenir des informations sur les signatures.



Fig. 8. Obtention des informations de certificat

Après cela, le chargeur de démarrage crée le répertoire C:\Windows\Logs\diag et démarre un thread dans lequel il suit les modifications dans le répertoire, en envoyant des notifications au serveur de gestion:



Fig. 9. Surveillance des changements de répertoire

Ensuite, il prépare les informations existantes et manquantes sur le système (nom d'utilisateur, version du système, domaine, adresse IP, informations sur la carte vidéo, connexion réseau - NAT ou non NAT) et génère un fichier JSON de ce type:

 { "adm": "0", "bid": "M3xwwhqLH/AUOhmU2+W55A==", "bit": "1", "bnet": "ldr", "cam": "0", "cis": "0", "dmn": "WORKGROUP", "hash_r": "0", "lip": "192.168.100.153", "lvl": "0", "nat": "1", "osb": "0", "osv": "Windows 7 Professional", "pc": "USER-PC", "proc_c": "0", "proc_n": "cpu", "rep": 0, "tmt": "0", "ver": "163", "video": "Standard VGA Graphics Adapter," } 

Plus tard, ces données seront chiffrées avec RC4 (la gJypA9RWUlYpnBbzujVqE6fDcEAk0zoz chiffrement gJypA9RWUlYpnBbzujVqE6fDcEAk0zoz est chiffrée dans le corps du cheval de Troie), encodée avec Base64 et envoyée par une requête HTTP POST au serveur de gestion:



Fig. 10. Demande HTTP POST au serveur de gestion



Fig. 11. La liste des serveurs de contrôle dans le chargeur de démarrage

La réponse du serveur est décryptée par RC4 (la clé de cryptage est la même que celle utilisée pour envoyer les données) et vérifiée: les deux premiers octets doivent correspondre à la ligne MZ, qui est un signe du fichier PE. Nous avons déjà rencontré cette séquence plus tôt lorsque nous avons analysé un autre chargeur de groupe qui a livré FlawedAmmyy RAT:



Fig. 12. Un code similaire pour déchiffrer et vérifier le fichier téléchargé pour le chargeur de démarrage en question (à gauche) et le chargeur de démarrage FlawedAmmyy RAT (à droite)

Le chargement de la charge utile se produit non seulement dans le thread principal, mais également dans un thread créé séparément. En d'autres termes, il existe deux charges utiles. Dans un cas, le mutex Global \ system32_host_service est pré-vérifié, et en cas d'absence, le composant est chargé, ce qui est désigné dans les informations de débogage comme charge utile ou bot. Fait intéressant, après avoir reçu une réponse du serveur, le fichier PE ne démarre en aucune façon. Au lieu de cela, son corps est écrit dans le Registre dans la section HKEY_LOCAL_MACHINE\SYSTEM dans la clé 0x228028 . Ensuite, le chargeur de démarrage désactive la redirection du système de fichiers WoW64 pour les applications 32 bits à l'aide de Wow64DisableWow64FsRedirection et démarre le processus %SystemRoot%\System32\services.exe avec le paramètre -ww. L'utilisation de ce paramètre n'a pas de sens, mais cela termine la chaîne d'installation de la charge utile résultante.



Fig. 13. Réglage de la charge utile

Nous parlerons de la deuxième charge utile plus tard.

Plugins Twein


En examinant le cheval de Troie discuté ci-dessus, nous avons remarqué une fonction qui supprime deux fichiers du %SystemRoot% - twein_32.dll et twein_64.dll :



Fig. 14. Suppression des fichiers twein_32.dll et twein_64.dll

Ces fichiers ne se trouvent nulle part ailleurs, ils n'apparaissent pas dans la logique du chargeur de démarrage. Cependant, les noms des bibliothèques nous ont rappelé un autre groupe de logiciels malveillants, que nous allons maintenant considérer.
Deux mois plus tôt, nous avons trouvé un cheval de Troie du groupe TA505, d'une taille d'environ 9 Mo. Le fichier est conditionné par UPX . Le cheval de Troie est installé dans le système en tant que service WMDICToss . Les ressources contiennent trois fichiers: systemdiron.bat , twein__32.dll et twein__64.dll , qui sont chiffrés avec XOR linéaire.



Fig. 15. Déchiffrement de l'une des ressources du compte-gouttes

Notez que les noms des deux fichiers coïncident presque avec ceux déjà mentionnés précédemment: la différence ne concerne que le nombre de soulignements.

L'une des ressources déchiffrées portant le nom systemdiron.bat devrait être un script de commande qui permet le lancement d'autres composants en fonction de la capacité du système:

 @echo off if defined PROCESSOR_ARCHITEW6432 (goto LABEL_X64) if %PROCESSOR_ARCHITECTURE%==IA64 (goto LABEL_X64) if %PROCESSOR_ARCHITECTURE%==AMD64 (goto LABEL_X64) if %PROCESSOR_ARCHITECTURE%==x86 (goto LABEL_X86) goto LABEL_NON :LABEL_X64 echo OS type: x64 copy c:\temp\tmp.log c:\i.txt rundll32.exe C:\Windows\twein__64.dll,Install copy c:\temp\tmp.log c:\i.txt rundll32.exe C:\Windows\twein__32.dll,Install del c:\temp\tmp.log del c:\i.txt shutdown.exe -r -t 00 goto LABEL_END :LABEL_X86 echo OS type: x86 copy c:\temp\tmp.log c:\i.txt rundll32.exe C:\Windows\twein__32.dll,Install del c:\temp\tmp.log del c:\i.txt shutdown.exe -r -t 00 goto LABEL_END :LABEL_NON echo OS type: undefined goto LABEL_END :LABEL_END pause 

Les deux bibliothèques twein agissent de manière similaire. Emballé avec le packer caractéristique du groupe TA505. Noms de bibliothèque d'origine: av_block.dll . L'analyse est considérablement compliquée par l'utilisation d'un obfuscateur, et la proportion de code obscurci est d'environ 80%. En conséquence, l'exécution du programme est saturée de nombreuses transitions, décodage des prochaines étapes de code, appels de fonctions non linéaires.

Les bibliothèques contiennent une liste impressionnante de chaînes de type Base64, qui sont décryptées comme suit:

1. La chaîne d'entrée est divisée en blocs de 4 octets;
2. Chaque bloc est décodé en utilisant l'algorithme de remplacement et de décalage:

 import binascii def block_decode(input_str, len_of_block): alphabet = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3E\x00\x00\x00\x3F\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x00\x00\x00\x00\x00\x00\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' int_result = 0 for i in range(len_of_block): alph = ord(alphabet[ord(input_str[i])]) alph <<= 0x6 * i int_result += alph str_result = hex(int_result)[2:] if len(str_result) % 2 != 0: str_result = '0' + str_result return binascii.unhexlify(str_result).decode('latin1')[::-1] 


3) les blocs sont collectés sur une seule ligne;
4) le résultat est décrypté par l'algorithme eexec avec une clé à deux octets, passée en paramètre:



Fig. 16. Implémentation de l'algorithme eexec

La plupart des lignes sont les noms et les chemins d'accès aux fichiers des produits antivirus, mais certains d'entre eux n'appartiennent pas du tout aux outils de sécurité: MS Exchange Server, MySQL Server, SAP, Apache, PostgreSQL, Elasticsearch, etc. Il y avait même de tels chemins uniques:

  • C: \ Users \ tislam \ Desktop \ salik app \ Aye_salik_data \ Aye_salik_data \ bin \ Debug \ Aye_salik_data.exe
  • C: \ oem13c \ agent13c \ agent_13.2.0.0.0 \ perl \ bin \ perl.exe
  • C: \ Users \ adadmin \ Ubiquiti UniFi \ bin \ mongod.exe
  • C: \ Users \ sakella \ AppData \ Local \ Microsoft \ OneDrive \ OneDrive.exe
  • D: \ Add-ons \ IMI_CREDIT_POLICY Test v 02.01 \ IMI_CREDIT_POLICY.exe

Si un logiciel se trouve dans le système dans la liste, les fichiers et les répertoires sont supprimés.

Pour se sécuriser dans le système, les bibliothèques se définissent comme l' interface Windows Sockets Service Provider (SPI), appelée Intel et IntelFiltr. De plus, ils modifient l'ordre des gestionnaires de la chaîne de protocole pour être le premier SPI à gérer la demande du client.

En 2015, nos collègues FireEye ont présenté l' analyse de bots LatentBot . Il est curieux que l'algorithme de cryptage de chaînes dans LatentBot et les bibliothèques de twein examinées soient complètement les mêmes. En outre, LatentBot utilise un module de sécurité comme l'un des plug-ins, qui recherche des outils de sécurité dans le système en utilisant les chemins d'accès et les noms de produits spécifiés, bien qu'il se limite à vérifier la disponibilité.

Rootkit twein


Revenons au chargeur de démarrage, à savoir la deuxième charge utile. À partir des lignes de débogage d'essayer d'ouvrir rootkit ... et du pilote% S installé, il est facile de deviner le format de la prochaine charge utile. Une fois le chargement réussi, le pilote sera écrit dans le %SystemRoot%\System32\drivers avec un nom formé de manière pseudo-aléatoire à partir des noms des autres fichiers légitimes. Ensuite, le service sera créé et lancé:



Fig. 17. Installation et démarrage du service

À la dernière étape de son travail, le chargeur de démarrage configurera le pilote pour qu'il soit mis sur liste noire dans les clés de registre: les noms des processus antivirus, des outils d'analyse et des fournisseurs de protection dans les signatures de fichiers numériques seront entrés dans les valeurs numériques spécifiées des clés de la branche HKEY_LOCAL_MACHINE\SYSTEM :



Fig. 18. Configuration du pilote sur liste noire

Lors de la recherche du chargeur de démarrage, nous n'avons pas pu obtenir un exemple de pilote à partir du serveur de gestion. Cependant, nous avons trouvé la mention d'un rootkit qui a été pompé par un autre chargeur de démarrage similaire.

Le pilote est signé numériquement au nom de Lizas Limited avec administrator@lizaslimited.site par e-mail:



Fig. 19. Pilote signé numériquement

Au cours de la recherche, nous avons trouvé beaucoup de choses en commun avec le rootkit bien connu du botnet Necurs, qui était activement utilisé par le groupe TA505 pour envoyer du spam et diffuser des malwares. Examinons plus en détail les caractéristiques les plus intéressantes de son travail.

Le pilote enregistre les gestionnaires d'événements pour démarrer les processus et charger les images PE à l'aide de PsSetCreateProcessNotifyRoutine et PsSetLoadImageNotifyRoutine . En d'autres termes, cela permet au conducteur de contrôler le lancement de tous les nouveaux processus et services. En utilisant les listes noires que nous avons mentionnées plus tôt, le rootkit termine les processus indésirables avec ZwTerminateProcess et empêche le chargement d'autres pilotes potentiellement dangereux pour lui, écrasant la valeur du point d'entrée dans les instructions:

 mov eax, 0C0000001 retn 8 

Par conséquent, le service sera déchargé avec l'erreur STATUS_UNSUCCESSFULL .



Fig. 20. Achèvement du processus



Fig. 21. Écrasement des points d'entrée du pilote

Au moyen de CmRegisterCallback, le pilote intercepte les événements d'accès au Registre système. En particulier, ses travaux ultérieurs sont paramétrés par les valeurs numériques des clés auxquelles on accède dans les événements interceptés.



Fig. 22. Gestion des rootkits d'accès aux clés de registre

Fait intéressant, dans certaines versions du rootkit Necurs, les mêmes valeurs numériques ont été utilisées comme codes de requête ioctl.



Fig. 23. Gestion d'un rootkit Necurs à l'aide de requêtes ioctl

Cette astuce peut être considérée comme une étape vers une plus grande confidentialité: l'accès au registre provoque moins de suspicion que les requêtes ioctl à DeviceObject.

Le corps du rootkit contient une bibliothèque DLL auxiliaire chiffrée avec XOR à un octet. Lors de la création d'un nouveau processus, le pilote injecte la bibliothèque avec un autre fichier PE, qui est extrait du registre et à nouveau déchiffré avec un XOR à un octet.



Fig. 24. Décryptage et injection de la bibliothèque auxiliaire dans le processus créé

Le composant auxiliaire est un chargeur réfléchissant personnalisé qui place correctement le deuxième fichier PE dans la mémoire, qui agit comme une charge utile et lui transfère le contrôle. Maintenant, il devient clair comment exactement la charge utile qui a été écrite dans le registre par le chargeur de démarrage à partir de la première partie de l'article commence à fonctionner.



Fig. 25. Remplir la table d'importation avec une bibliothèque auxiliaire

Conclusion


Dans l'article, nous nous sommes familiarisés avec les caractéristiques du travail de nombreux chevaux de Troie jumeaux. Pourquoi des jumeaux? Le chargeur de démarrage malveillant avec lequel nous avons commencé nos recherches est très similaire au chargeur de démarrage bien connu FlawedAmmyy par la qualité de l'écriture de code et des nuances d'implémentation. Les deux bibliothèques qu'il essaie de supprimer du système sont probablement celles que nous examinons ensuite. Les bibliothèques sont très similaires au plugin de sécurité LatentBot. L'une des charges utiles du chargeur de démarrage est un pilote qui est un dérivé du rootkit Necurs populaire.

Certaines familles de logiciels malveillants ont plus de 5 ans, cependant, les attaquants continuent de les mettre à jour et de les améliorer, en tenant compte du développement des systèmes d'exploitation et des outils de sécurité.

Auteurs : Alexey Vishnyakov et Daniil Koloskov, Positive Technologies

CIO
a28a54abc30805cc6ea2ce0732989287 - Chargeur d'amorçage Twein
f6b6526b8d494dce14568e3703368432 - compte-gouttes de plugin twein
983dd279722154a12093410067fe070e - rootkit Twein

Articles précédents de la série:


Source: https://habr.com/ru/post/fr475328/


All Articles