Le groupe Winnti cible des universités de Hong Kong | WeLiveSecurity

Le groupe Winnti cible des universités de Hong Kong

Les chercheurs d'ESET ont découvert une nouvelle campagne du groupe Winnti ciblant les universités et utilisant les logiciels malveillants ShadowPad et Winnti.

Les chercheurs d’ESET ont découvert une nouvelle campagne du groupe Winnti ciblant les universités et utilisant les logiciels malveillants ShadowPad et Winnti.

En novembre 2019, nous avons découvert une nouvelle campagne menée par le groupe Winnti contre deux universités de Hong Kong. Nous avons trouvé une nouvelle variante de la backdoor ShadowPad, la backdoor phare du groupe, déployée à l’aide d’un nouveau lanceur et intégrant de nombreux modules. Le logiciel malveillant Winnti a également été découvert dans ces universités quelques semaines avant ShadowPad.

Le groupe Winnti, actif depuis au moins 2012, est responsable d’attaques très médiatisées de la chaîne d’approvisionnement contre les industries du jeu vidéo et du logiciel, qui aboutissent à la distribution de logiciels de type cheval de Troie (tels que CCleaner, ASUS LiveUpdate et de nombreux jeux vidéo) qui sont ensuite utilisés pour compromettre d’autres victimes. Elle est également connue pour avoir compromis diverses cibles dans les secteurs de la santé et de l’éducation.

Les chercheurs d’ESET ont récemment publié un white paper mettant à jour notre compréhension de l’arsenal du groupe Winnti, suite à un billet de blog documentant une attaque de la chaîne d’approvisionnement visant l’industrie du jeu vidéo en Asie. En outre, nous avons publié un article sur une nouvelle porte dérobée appelée skip-2.0 qui vise le serveur Microsoft SQL.

Cet article se concentre sur les détails techniques de cette nouvelle variante de ShadowPad.

À propos de la dénomination du groupe Winnti :

Nous avons choisi de conserver le nom de « Groupe Winnti », car c’est le nom utilisé pour la première fois pour l’identifier, en 2013, par Kaspersky. Comme Winnti est également une famille de logiciels malveillants, nous écrivons toujours « Groupe Winnti » lorsque nous faisons référence aux cybercriminels à l’origine des attaques. Depuis 2013, il a été démontré que Winnti n’est qu’une des nombreuses familles de logiciels malveillants utilisées par le groupe Winnti.

ShadowPad trouvé dans plusieurs universités de Hong Kong

En novembre 2019, le moteur d’apprentissage machine d’ESET Augur a détecté un échantillon malveillant et unique présent sur plusieurs ordinateurs appartenant à deux universités de Hong Kong où le logiciel malveillant Winnti avait déjà été trouvé fin octobre. L’échantillon suspect détecté par Augur est en fait un nouveau lanceur ShadowPad 32 bits. Les échantillons de ShadowPad et de Winnti trouvés dans ces universités contiennent des identifiants de campagne et des URL du C&C avec les noms des universités, ce qui indique une attaque ciblée.

En plus des deux universités compromises, grâce au format d’URL du C&C utilisé par les attaquants, nous avons des raisons de penser qu’au moins trois autres universités de Hong Kong pourraient avoir été compromises en utilisant ces mêmes variantes de ShadowPad et de Winnti.

Cette campagne du groupe Winnti contre les universités de Hong Kong s’est déroulée dans un contexte où Hong Kong était confrontée à des protestations civiques qui ont commencé en juin 2019, déclenchées par un projet de loi d’extradition. Même si le projet de loi a été retiré en octobre 2019, les protestations ont continué, exigeant une démocratie complète et une enquête de la police de Hong Kong. Ces protestations ont rassemblé des centaines de milliers de personnes dans les rues avec le soutien important des étudiants des universités de Hong Kong, ce qui a conduit à de multiples occupations de campus universitaires par les manifestants.

Nous avons pris contact avec les universités compromises et leur avons fourni les informations et l’assistance nécessaires pour remédier à cette compromission.

Mise à jour du lanceur

Contrairement aux précédentes variantes de ShadowPad documentées dans notre white paper sur l’arsenal du groupe Winnti, ce lanceur n’est pas obfusqué par VMProtect. En outre, la charge utile chiffrée n’est ni intégrée dans la couche ni située dans un flux de données alternatif COM1:NULL.dat. Le chiffrement RC5 habituel avec une clé dérivée de l’ID de volume du lecteur système de la machine victime (tel qu’observé pour la porte dérobée PortReuse, skip-2.0 et certaines variantes de ShadowPad) n’est pas non plus présent. Dans ce cas, le lanceur est beaucoup plus simple.

DLL à chargement latéral

Le lanceur est une DLL de 32 bits appelée hpqhvsei.dll, qui est le nom d’une DLL légitime chargée par hpqhvind.exe. Cet exécutable provient de HP et est généralement installé avec leur logiciel d’impression et de numérisation nommé « HP Digital Imaging ». Dans ce cas, le fichier hpqhvind.exe légitime a été déposé par les attaquants, en même temps que leur fichier hpqhvsei.dll dans C:\Windows\Temp.

Bien que nous ne disposions pas du composant qui a déposé et exécuté ce lanceur, la présence de ces fichiers nous amène à penser que l’exécution initiale de ce lanceur se fait par chargement latéral de DLL.

Lorsque la DLL malveillante est chargée au démarrage de hpqhvind.exe, on appelle sa fonction DLLMain qui va vérifier la séquence d’octets suivante de son processus parent à l’offset 0x10BA :

85 C0 ; test eax, eax
0F 84 ; jz

Dans le cas où le processus parent est hpqhvind.exe, cette séquence d’octets est présente à cet endroit exact et la DLL malveillante procédera à la modification du processus parent en mémoire. Elle remplace les instructions originales à 0x10BA par un saut inconditionnel (jmp – 0xE9) vers l’adresse de la fonction de hpqhvsei.dll qui déchiffre et exécute la charge utile chiffrée et intégrée dans le lanceur.

La fonction décompilée responsable de la mise à jour du processus parent est illustrée à la figure 1. Si hpqhvsei.dll est chargé par un processus différent de hpqhvind.exe, le code malveillant ne sera pas déchiffré ni exécuté.

Figure 1. Fonction décompilée responsable de la modification du processus parent

La différence entre le hpqhvind.exe original et le hpqhvind.exe corrigé est illustrée dans la figure 2.

Figure 2. Différence entre le fichier hpqhvind.exe original (à gauche) et le fichier hpqhvind.exe corrigé (à droite)

La partie du code qui est corrigée se trouve au tout début de la fonction principale de hpqhvind.exe. Comme nous pouvons le voir dans la figure 2, le code corrigé est situé juste après le chargement de hpqhvsei.dll. Cela signifie que la fonction responsable du déchiffrement et de l’exécution de la charge utile est exécutée directement après le chargement de la DLL malveillante.

Déchiffrage de la charge utile

La charge utile chiffrée se trouve dans la section .rdata de hpqhvsei.dll et l’algorithme de déchiffrement est une boucle XOR où la clé XOR est mise à jour à chaque itération, comme le montre la figure 3.

Figure 3. Pseudocode de la boucle de déchiffrement de la charge utile

La charge utile déchiffrée est le shellcode habituel responsable de l’initialisation du ShadowPad (obfusqué par de faux sauts conditionnels pour empêcher le désassemblage).

Persistance

Après avoir été déchiffré, le shellcode de ShadowPad est exécuté. Il obtiendra d’abord la persistance sur le système en écrivant le processus parent patché en mémoire sur le disque dans un chemin spécifié dans le pool de chaine de caractères. Dans le cas que nous avons examiné, le chemin était C:\ProgramData\DRM\CLR\CLR.exe. Il crée ensuite un service nommé clr_optimization_v4.0.30229_3, qui est responsable de l’exécution de CLR.exe. Pour éviter toute suspicion, ce nom de service, ainsi que le nom de l’exécutable, ont été choisis pour ressembler au nom d’un service d’optimisation Microsoft .NET.

Le processus complet de mise en place est résumé dans la figure 4. La numérotation de chaque flèche correspond à la séquence chronologique des événements.

Figure 4. Processus de planification de ShadowPad

Modules

ShadowPad est une porte dérobée multimodulaire où les modules sont référencés à partir du module racine avec une liste circulaire dont on peut extraire l’adresse du module, un horodatage UNIX (probablement intégré automatiquement lors du processus de compilation du module) et un identifiant du module. Du module lui-même, on peut également extraire le nom que le développeur a donné au module. Cette version intègre les 17 modules énumérés dans le tableau suivant :

Tableau 1. Modules utilisés avec cette version de ShadowPad

IDNameTimestampDescription
100RootThu 24 Oct 2019 12:08:27 PM UTCInitial shellcode
101PluginsThu 24 Oct 2019 12:07:02 PM UTCProvides API for the other modules; loads modules  
102ConfigThu 24 Oct 2019 12:07:09 PM UTCHandles encrypted configuration string pool
103InstallThu 24 Oct 2019 12:07:46 PM UTCAchieves persistence
104OnlineThu 24 Oct 2019 12:07:17 PM UTCOverall communications with the C&C server
106ImpUserThu 24 Oct 2019 12:07:24 PM UTCUser impersonation via token duplication
200TCPThu 24 Oct 2019 12:01:01 PM UTCTCP communications
202HTTPSThu 24 Oct 2019 12:01:15 PM UTCHTTPS communications
207PipeThu 24 Oct 2019 12:01:35 PM UTCHandles named pipes
300DiskThu 24 Oct 2019 12:02:29 PM UTCFile system operations
301ProcessThu 24 Oct 2019 12:02:36 PM UTCProcess handling
302ServcieThu 24 Oct 2019 12:02:45 PM UTCService handling
303RegisterThu 24 Oct 2019 12:02:52 PM UTCRegistry operations
304ShellThu 24 Oct 2019 12:03:00 PM UTCCommand line operations
306KeyloggerThu 24 Oct 2019 12:03:16 PM UTCKeylogging to file system
307ScreenThu 24 Oct 2019 12:03:25 PM UTCScreenshot capture
317RecentFilesThu 24 Oct 2019 12:04:44 PM UTCLists recently accessed files

Ces modules, à l’exception de RecentFiles, ont déjà été mentionnés par Kaspersky et Avast. Remarquez la faute de frappe : « Servcie », plutôt que Service.

Comme d’habitude, tous les horodatages des modules sont répartis sur une courte période, ce qui pourrait suggérer l’utilisation d’une infrastructure logicielle pour compiler ces modules. Cela suggère également que ces modules ont été compilés quelques heures avant le lanceur lui-même, dont l’horodatage de compilation est Thu Oct 24 14:10:32 2019 (soit le jeudi 24 octobre 2019 à 14:10:32). Comme cette date de compilation date de deux semaines avant cette campagne, il est probable qu’elle n’a pas été altérée par les attaquants.

On peut également noter que le nombre de modules intégrés dans cette variante est beaucoup plus élevé (17) que le nombre de modules intégrés dans les variantes précédemment documentées dans notre livre blanc (8 à 10 modules).

Par défaut, chaque frappe est enregistrée à l’aide du module Keylogger (306, précédemment documenté par Avast) et sauvegardée sur disque dans le fichier %APPDATA%\PAGM\OEY\XWWEYG\WAOUE.

Le fichier journal est chiffré à l’aide du même algorithme que celui utilisé pour chiffrer les chaînes statiques du module. L’utilisation de ce module par défaut indique que les attaquants sont intéressés par le vol d’informations sur les machines des victimes. En revanche, les variantes que nous avons décrites dans notre white paper n’avaient même pas ce module intégré.

Configuration

Comme pour les précédentes variantes de ShadowPad, le module Config (102) contient un pool de chaînes chiffrées auquel on peut accéder à partir de n’importe quel autre module. Le pool de chaînes n’est jamais stocké entièrement déchiffré en mémoire. Le champ d’intérêt est déchiffré si nécessaire, puis immédiatement libéré (donc rapidement indisponible). La taille de la configuration est de 2180 octets et les chaînes chiffrées sont situées à l’offset 0x84. L’algorithme utilisé pour déchiffrer les chaînes est le même que celui utilisé pour déchiffrer les chaînes statiques du module. Le contenu déchiffré du pool de chaînes est le suivant :

0x84: 2019/11/7 16:28:36
0x99: CAMPAIGN_ID_REDACTED
0xa1: %ALLUSERSPROFILE%\DRM\CLR\CLR.exe
0xc5: clr_optimization_v4.0.30229_32
oxe6: clr_optimization_v4.0.30229_32
0x107: clr_optimization_v4.0.30229_32
0x128: SOFTWARE\Microsoft\Windows\CurrentVersion\Run
0x158: CLR
0x15e: %ProgramFiles%\Windows Media Player\wmplayer.exe
0x197: %windir%\system32\svchost.exe
0x1b7: TCP://b[redacted].dnslookup.services:443
0x1db: UDP://b[redacted].dnslookup.services:443
0x202: SOCKS4
0x21e: SOCKS5

L’identifiant de la campagne se trouve au décalage 0x99 et correspond au nom de l’université ciblée. Il est assez courant d’avoir une ID de campagne liée à la cible dans le cas de ShadowPad et Winnti.

Il est intéressant de noter que l’horodatage présent dans cette configuration à l’offset 0x84 est postérieur à celui des modules et à celui de la compilation du chargeur. Cela suggère que cette configuration est ajoutée manuellement à l’échantillon après avoir été construite. Même si c’est probablement une coïncidence, la date dans la configuration correspond à la date de la première détection de cet échantillon à l’université correspondante.

Réseau de communication

Une fois installé sur le système, ShadowPad lance un processus wmplayer.exe de Microsoft Windows Media Player caché et suspendu et s’injecte dans ce processus. Le chemin vers wmplayer.exe est fourni par le module de configuration.

Une fois que ShadowPad est injecté dans wmplayer.exe, le module Online contactera le serveur C&C en utilisant l’URL spécifiée dans la configuration. Il commencera alors à écouter les connexions sur le port 13567 après avoir mis à jour les règles du pare-feu en conséquence :

Clé de registre :

HKLM\SYSTEM\ControlSet001\services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\{816381AB-1400-45E5-B560-B8E11C5988CF}

Valeur :
v2.10|Action=Allow|Active=TRUE|Dir=In|Protocol=6|Profile=Public|LPort=13567|Name=Network Discovery (TCP)|

La communication est ensuite traitée par le module TCP (200), qui a été documenté auparavant par Kaspersky.

La présence du logiciel malveillant Winnti

En plus de ShadowPad, le logiciel malveillant Winnti a été trouvé sur certaines machines de ces deux universités à la fin du mois d’octobre (c’est-à-dire deux semaines avant ShadowPad) dans le fichier C:\Windows\System32\oci.dll et est détecté par les produits ESET sous le nom Win64/Winnti.CA.

Le logiciel malveillant Winnti contient généralement une configuration spécifiant un ID de campagne et l’URL du C&C . Sur toutes les machines, l’ID de la campagne correspond au nom de l’université ciblée et les URL du C&C sont :

  • w[redacted].livehost.live:443
  • w[redacted].dnslookup.services:443

où la partie expurgée correspond au nom de l’université ciblée.

Format de l’URL du C&C

On peut observer que l’URL du C&C utilisée par Winnti et ShadowPad est conforme au schéma [backdoor_type][target_name].domain.tld:443, où [backdoor_type]est une lettre unique qui est soit « w » dans le cas de Winnti, soit « b » dans le cas de ShadowPad.

À partir de ce format, nous avons pu trouver plusieurs URL du C&C , y compris les noms de trois autres universités de Hong Kong. Les identificateurs de campagne trouvés dans les échantillons que nous avons analysés correspondent à la partie sous-domaine du serveur de C&C, ce qui montre que ces échantillons étaient réellement ciblés contre ces universités.

Conclusion

Le groupe Winnti utilise toujours activement l’une de ses portes dérobées phares, ShadowPad, cette fois contre les universités de Hong Kong. Dans cette campagne, le lanceur VMProtected utilisé avec ShadowPad, ainsi qu’avec les backdoors PortReuse et skip-2.0, a été remplacé par un autre plus simple. Le fait que ces échantillons, en plus d’avoir été trouvés dans ces universités, contiennent des ID de campagne correspondant aux noms des universités et utilisent des URL du C&C contenant les noms des universités est une bonne indication que cette campagne est très ciblée.

Nous continuerons à suivre les nouvelles activités du groupe Winnti et publierons des informations pertinentes sur notre blog. Pour toute question, contactez-nous à l’adresse suivante: threatintel@eset.com. Les IoC sont également disponibles dans notre dépôt GitHub.

Indicateurs de compromission (IoC)

Noms de détection ESET

Win32/Shadowpad.C trojan
Win64/Winnti.CA trojan

Noms de fichier

%ALLUSERSPROFILE%\DRM\CLR\hpqhvsei.dll
%ALLUSERSPROFILE%\DRM\CLR\CLR.exe
C:\windows\temp\hpqhvsei.dll
C:\windows\temp\hpqhvind.exe
%ALLUSERSPROFILE%\DRM\CLR\hpqhvsei.dll
%SYSTEM32%\oci.dll
%APPDATA%\PAGM\OEY\XWWEYG\WAOUE

Affichage des noms de service

clr_optimization_v4.0.30229_32

Serveurs C&C

b[org_name].dnslookup[.]services:443
w[org_name].livehost[.]live:443
w[org_name].dnslookup[.]services:443

Lanceur ShadowPad

Échantillon similaire, présenté afin d’éviter de divulguer les universités ciblées.
693f0bd265e7a68b5b98f411ecf1cd3fed3c84af

Techniques MITRE ATT&CK

TacticID   NameDescription
PersistenceT1050New ServiceShadowPad persists as a service called clr_optimization_v4.0.30229_32.
Defense EvasionT1073DLL Side-LoadingShadowPad’s launcher is loaded by a legitimate executable via DLL side-loading.
T1055Process InjectionShadowPad is injected into a wmplayer.exe process.
T1140Deobfuscate/Decode Files or InformationShadowPad launcher uses XOR to decrypt the payload. ShadowPad uses a custom algorithm to decrypt strings and configuration.
T1027Obfuscated Files or InformationShadowPad shellcode is XOR-encoded and uses fake conditional jumps to hinder disassembly. ShadowPad’s strings and configuration are encrypted. It also uses API hashing.
T1143Hidden WindowShadowPad is injected into a wmplayer.exe process started in a hidden window.
DiscoveryT1010Application Window DiscoveryShadowPad’s keylogging module lists application windows.
T1083File and Directory DiscoveryShadowPad’s RecentFiles module lists files recently accessed.
Command and ControlT1071Standard Application Layer ProtocolShadowPad can use HTTP and HTTPS for C&C communications.
T1043Commonly Used PortShadowPad uses TCP:443 and UDP:443.
T1065Uncommonly Used PortShadowPad listens on port 13567.
T1095Standard Non-Application Layer ProtocolShadowPad can use UDP and TCP for C&C communications.
T1024Custom Cryptographic ProtocolShadowPad uses its own cryptographic protocol for C&C communications.
Collection T1056Input CaptureShadowPad has a keylogging module.
T1113Screen CaptureShadowPad has a screenshot module.
ExfiltrationT1022Data EncryptedKeystrokes recorded by the keylogging module are stored encrypted on disk.

Discussion