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

ID Name Timestamp Description
100 Root Thu 24 Oct 2019 12:08:27 PM UTC Initial shellcode
101 Plugins Thu 24 Oct 2019 12:07:02 PM UTC Provides API for the other modules; loads modules  
102 Config Thu 24 Oct 2019 12:07:09 PM UTC Handles encrypted configuration string pool
103 Install Thu 24 Oct 2019 12:07:46 PM UTC Achieves persistence
104 Online Thu 24 Oct 2019 12:07:17 PM UTC Overall communications with the C&C server
106 ImpUser Thu 24 Oct 2019 12:07:24 PM UTC User impersonation via token duplication
200 TCP Thu 24 Oct 2019 12:01:01 PM UTC TCP communications
202 HTTPS Thu 24 Oct 2019 12:01:15 PM UTC HTTPS communications
207 Pipe Thu 24 Oct 2019 12:01:35 PM UTC Handles named pipes
300 Disk Thu 24 Oct 2019 12:02:29 PM UTC File system operations
301 Process Thu 24 Oct 2019 12:02:36 PM UTC Process handling
302 Servcie Thu 24 Oct 2019 12:02:45 PM UTC Service handling
303 Register Thu 24 Oct 2019 12:02:52 PM UTC Registry operations
304 Shell Thu 24 Oct 2019 12:03:00 PM UTC Command line operations
306 Keylogger Thu 24 Oct 2019 12:03:16 PM UTC Keylogging to file system
307 Screen Thu 24 Oct 2019 12:03:25 PM UTC Screenshot capture
317 RecentFiles Thu 24 Oct 2019 12:04:44 PM UTC Lists 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

Tactic ID    Name Description
Persistence T1050 New Service ShadowPad persists as a service called clr_optimization_v4.0.30229_32.
Defense Evasion T1073 DLL Side-Loading ShadowPad’s launcher is loaded by a legitimate executable via DLL side-loading.
T1055 Process Injection ShadowPad is injected into a wmplayer.exe process.
T1140 Deobfuscate/Decode Files or Information ShadowPad launcher uses XOR to decrypt the payload. ShadowPad uses a custom algorithm to decrypt strings and configuration.
T1027 Obfuscated Files or Information ShadowPad shellcode is XOR-encoded and uses fake conditional jumps to hinder disassembly. ShadowPad’s strings and configuration are encrypted. It also uses API hashing.
T1143 Hidden Window ShadowPad is injected into a wmplayer.exe process started in a hidden window.
Discovery T1010 Application Window Discovery ShadowPad’s keylogging module lists application windows.
T1083 File and Directory Discovery ShadowPad’s RecentFiles module lists files recently accessed.
Command and Control T1071 Standard Application Layer Protocol ShadowPad can use HTTP and HTTPS for C&C communications.
T1043 Commonly Used Port ShadowPad uses TCP:443 and UDP:443.
T1065 Uncommonly Used Port ShadowPad listens on port 13567.
T1095 Standard Non-Application Layer Protocol ShadowPad can use UDP and TCP for C&C communications.
T1024 Custom Cryptographic Protocol ShadowPad uses its own cryptographic protocol for C&C communications.
Collection T1056 Input Capture ShadowPad has a keylogging module.
T1113 Screen Capture ShadowPad has a screenshot module.
Exfiltration T1022 Data Encrypted Keystrokes recorded by the keylogging module are stored encrypted on disk.