Au cours de nos recherche sur « frenchy » shellcode, nous avons trouvé que celui-ci apparait dans des nombreux malwares tels que :
- Remcos RAT – frenchy_shellcode v1,
- Agent Tesla – frenchy_shellcode v2,
- Netwire – frenchy_shellcode v3,
- Lokibot – frenchy_shellcode v5,
- KPOT – frenchy_shellcode v6,
- Etc
Pour obfusquer ses fichiers, tous ces logiciels malveillants utilisent des packers principalement basés sur AutoIt, mais aussi des packers DotNet.
Dans cette troisième partie nous allons extraire frechy shellcode depuis deux malwares : Netwire et Lokibot.
Le premier utilise un packer basé sur DotNet et le second un packer basé sur AutoIt.
Nous allons également voir les résultats de la détection de ces deux échantillons par les moteurs de détection MALCORE qui effectue une analyse statique et heuristique multi-moteurs en temps réel des fichiers.
Netwire – frenchy shellcode v3
Netwire est un cheval de Troie d’accès à distance (RAT) qui s’axe sur le vol de mots de passe et l’enregistrement de frappe, mais qui inclut également des capacités de contrôle à distance.
Ce malware est apparu en 2012 et est largement utilisé pendant de nombreuses années. Il se fait également remarquer au cours de l’année 2020 comme l’un des botnets les plus actifs.
Dans cette section, nous allons voir un échantillon du RAT Netwire (
21c1d45977877018568e8073c3Acf7c5) qui utilise le shellcode frenchy v3.
Le logiciel malveillant comporte plusieurs couches. Il charge une bibliothèque qui à son tour charge un PE contentant le shellcode.
Extraction de shellcode
Première couche
Nous allons commencer par l’ouverture de l’échantillon dans « PE detective » pour trouver sa signature.
Figure 1 – Netwire – première couche: Signature
Comme nous pouvons le voir dans la Figure 1, nous sommes en face d’un programme .NET. Nous allons donc essayer de le décompiler avec dnSpy.
Figure 2 -Netwire – première couche: Point d’entrée
La fonction « Main » ci-dessus contient la méthode « ObjectEqualityCompare1() » (voir la Figure 3) qui concatène plusieurs ressources, les décode, puis les charge en mémoire.
Figure 3 – Netwire – première couche: Chargement des ressources
Figure 4 – Netwire – première couche: Les ressources
Tel que nous pouvons le voir dans la Figure 4, les ressources sont stockées dans le répertoire « Resources », au format base64.
Nous placerons un point d’arrêt (voir la Figure 5) au retour de la fonction de décodage pour voir le tableau qui en résulte.
Figure 5 – Netwire – première couche: Les ressources décodés
Le début du tableau décodé est un en-tête MS-DOS. Il s’agit donc d’un PE que nous allons extraire pour l’analyser.
Deuxième couche
Nous allons utiliser « PE detective » à nouveau pour trouver la signature du PE que nous venons d’extraire.
Figure 6 -Netwire – deuxième couche: Signature
Nous voyons dans la Figure 6 qu’il s’agit d’une autre application .NET.
Figure 7 – Netwire – deuxième couche: Point d’entrée
Ce nouveau PE, plus précisément une DLL, charge une ressource chiffrée, la déchiffre et démarre la fonction « invoqueMe » dans un nouveau thread (voir la Figure 7).
Nous allons placer un point d’arrêt (voir la Figure 8) au moment de chargement de la ressource afin de l’extraire.
Figure 8 – Netwire – deuxième couche : Chargement de la troisième ressource
Ce nouveau tableau que nous obtenons semble être un PE, encore une fois une application .NET, mais cette fois-ci obfusquée.
Troisième couche
Comme nous pouvons le voir dans la Figure 9, l’auteur du malware applique sur ce troisième PE plusieurs obfuscations. Nous pouvons enlever celle-ci avec « de4dot » et l’ouvrir dans « dnSpy ».
Figure 9 – Netwire – troisième couche : Obfuscation
La fonction qui exécute frenchy shellcode avec le chemin de la cible et le PE à injecter comme arguments est « gdelegate » (voir la Figure 10).
Nous allons donc lancer cette fonction afin d’examiner ses paramètres et extraire le shellcode.
Figure 10 – Netwire – troisième couche : Les parametres de frenchy_shellcode
Figure 11 – Netwire – troisième couche : Le tableau contenant frenchy_shellcode_003
Figure 12 – Netwire – troisième couche : La charge utile et le processus cible
L’exécution de la fonction « gdelegate » nous relève la valeur de la variable « array2 » (voir la Figure 11) qui contient le frechy shellcode, « text » qui contient le chemin du processus cible et « byte_0 » qui stocke le PE à injecter (voir la Figure 12).
Pour extraire le shellcode il ne reste donc qu’à sauvegarder le contenu de « array2 » dans un fichier.
Détection par MALCORE
10 sur 14 moteurs de détection Malcore trouvent l’échantillon malicieux.
Logs MALCORE :
detail_threat_found : Infected : Malware/Win32.Generic, HEUR/AGEN.1126216, Gen:Variant.Ser.Razy.4961, W32/MSIL_Kryptik.JE.gen!Eldorado, a variant of MSIL/Kryptik.SEN trojan, Trojan.Inject, Trojan ( 0054d78d1 ), Trojan.Win32.NetWiredRC.fsxqfz, Trojan.Win32.Dnldr29.BZFF, TScope.Trojan.MSIL
Lokibot – frenchy shellcode v5
LokiBot est un cheval de Troie qui vole des informations sensibles telles que des noms d’utilisateur, des mots de passe et d’autres secrets.
Il est connu pour cibler différents navigateurs web, clients de messagerie et portefeuilles de cryptomonnaies.
Le malware a fait son apparition en 2010 lorsqu’il a été mis en vente pour la première fois sur des forums de piratage souterrains.
Largement distribué gratuitement pendant des années, ce logiciel malveillant continue de circuler de nos jours.
Dans cette section, nous allons voir un échantillon de Lokibot (CA94CBA9ACBCBBDB930032F56493FEA9) qui utilise le frenchy shellcode v5.
L’échantillon récupéré est un script obfusqué AutoIt qui contient le shellcode dans une variable.
Extraction de shellcode
Nous commençons l’analyse de l’échantillon avec la commande « strings » :
This is a third-party compiled AutoIt script.
Nous trouvons une chaîne spécifiques AutoIt, ce qui nous permet de conclure que le PE est un script AutoIt compilé.
Nous pouvons alors utiliser « Exe2Aut » pour le décompiler.
Figure 13 – Lokibot : Décompilation du script AutoIt (Exe2Aut)
Nous pouvons voir dans la Figure 13 que le script est obfusqué.
Toutefois nous arrivons à déduire que la première fonction serait responsable du décodage (voir la Figure 14).
Cette méthode prend en paramètre une chaîne de caractères et la réordonne en fonction d’un « shift ».
Figure 14 – Lokibot : Fonction de décodage
Nous allons tester cette fonction en écrivant la même, mais en python :
def StringMid(_str, start, count):
return _str[start:start + count]
def decode_autoit(_str, shift): return StringMid(_str, len(_str) - shift + 1, shift + 1) + StringMid(_str, 0, len(_str) - shift)
Figure 15 – Lokibot : Fonction de décodage en python
En effet, comme nous le voyons dans la Figure 16, cette fonction nous permet bien de décoder les chaînes.
Figure 16 – Lokibot : Exemple de chaîne décodée
Il est intéressant de noter que le script utilise des techniques d’anti-évasion de machine virtuelle pour rendre l’analyse plus difficile (voir la Figure 17).
Figure 17 – Lokibot : techniques d’évasion des VMs
En outre, nous trouvons les chemins cibles autorisés pour le remplacement de processus (voir la Figure 18).
Figure 18 – Lokibot : Chemins cibles autorisés
Et enfin, nous avons repéré le début du shellcode (voir la Figure 19).
Figure 19 – Lokibot : Frenchy shellcode v5
Pour extraire le shellcode, nous pouvons écrire la variable qui le contient dans un fichier en appelant la fonction FileWrite, puis exécuter le script (voir la Figure 20).
Figure 20 – Lokibot : L’extraction du shellcode
Détection par MALCORE
13 sur 14 moteurs de détection Malcore trouvent l’échantillon malicieux.
Logs MALCORE :
detail_threat_found : Infected : Trojan/Win32.Injector, DR/AutoIt.Gen8, Trojan.GenericKD.41793831, Win.Malware.Autoit-7424230-0, W32/AutoIt.QK.gen!Eldorado, a variant of Win32/Injector.Autoit.EIQ trojan, Trojan.Autoit, Trojan ( 0055865b1 ), Backdoor.Win32.Androm.tgxk, Trojan.Win32.Androm.gauobj, Trojan.AutoIt.Injector.ZZ, Trojan.Win32.PSWStealer.BSF, Backdoor.Androm
Conclusion
La commercialisation du shellcode semble avoir abouti et nous le retrouvons dans plusieurs logiciels malveillants avancés qui utilisent des packers pour cacher leur contenu.
Nous avons vu comment extraire frenchy shellcode depuis Lokibot, qui s’est avéré être un packer simple, comparé à Netwire qui cache le shellcode sous plusieurs couches.
Peu importe leur complexité, ces échantillons n’échappent pas à la détection heuristique et statique de MALCORE.
Liens
https://www.zdnet.com/article/cisa-warns-of-notable-increase-in-lokibot-malware/
https://tccontre.blogspot.com/2019/09/lokibot-using-frenchyshellcode005-to.html
https://isc.sans.edu/diary/25934
https://www.zscaler.com/blogs/security-research/frenchy-shellcode-wild
https://securityboulevard.com/2020/11/agent-tesla-a-day-in-a-life-of-ir/
Auteur : Anastasia Cotorobai