Im November 2019 entdeckten wir eine neue Malware-Kampagne der Winnti Group. Sie richtete sich gegen zwei Hongkonger Universitäten. Bei den Untersuchungen begegnete uns eine neue Variante der ShadowPad Backdoor – die berüchtigtste Malware der Cybergang. Diese wird durch einen neuen Launcher verbreitet, der in zahlreiche Module eingearbeitet ist. Die Winnti-Malware wurde bereits einige Wochen vor ShadowPad bei den Universitäten gesichtet.

Die Winnti Group ist seit mindestens 2012 aktiv und muss sich für die Verbreitung von kompromittierter Software in der Videospiele- und Software-Industrie (CCleaner, ASUS LiveUpdate, diverse Videospiele) verantworten. Die Cybergang ist aber auch für Attacken gegen den Gesundheits- und Bildungssektor bekannt.

Vor nicht allzu langer Zeit veröffentlichten die ESET-Forschenden ein Whitepaper mit vielen Updates über die Winnti Group, gefolgt von einem Blog-Beitrag über Supply-Chain-Attacken gegen die Videospiele-Industrie in Asien. Zusätzlich gibt es einen Artikel über die „skip-2.0“-Backdoor, die auf Microsoft SQL Server abzielte.

Dieser Artikel konzentriert sich auf die technischen Details der neuen ShadowPad-Variante.


Exkurs: Namensgebung „Winnti Group“
Wir haben uns für die Beibehaltung von Winnti Group entschieden, da dieser Name im Jahr 2013 das erste Mal von Kaspersky verwendet wurde, um die Bedrohung zu identifizieren. Da „Winnti“ (auch) eine Malware-Variante beschreibt, benutzen wir immer Winnti Group, wenn wir uns auf die Cyberangreifer beziehen. Schon im Jahr 2013 zeigte sich, dass Winnti nur eine von vielen von der Winnti Group eingesetzten Malwares ist.

ShadowPad in verschiedenen Hongkonger Universitäten gefunden

Im November 2019 entdeckte ESETs KI-Engine Augur ein bösartiges und einzigartiges Sample (neuer 32-bit ShadowPad Launcher) auf mehreren Computern von zwei Universitäten in Hongkong. Dort fand man auch die Winnti-Malware bereits Ende Oktober. ShadowPad und Winnti Malware-Samples tragen die Universitätsnamen in Campaign-IDs und C&C-URLs, was auf eine gezielte Cyberattacke hindeutet.

Aufgrund des von den Angreifern verwendeten URL-Formats befürchten wir die Kompromittierung drei weiterer Hongkonger Universitäten.

Die Malware-Kampagnen gegen die Universitäten fanden genau im Zeitraum (ab Juni 2019) der Protestbewegung gegen einen „Entwurf für ein Gesetz über flüchtige Straftäter und Rechtshilfe in Strafsachen“ statt. Die Proteste gingen weit über den offiziellen Rückzug des Gesetzesentwurf im Oktober 2019 hinaus – Ihre Anhänger forderten mehr Demokratie und eine Untersuchung über das Vorgehen der Hongkonger Polizei. Hunderttausende gingen auf die Straßen. Darunter befanden sich viele Studenten Hongkonger Universitäten, die unter anderem auch die Campus jener Hochschulen besetzten.

ESET hat Kontakt zu den kompromittierten Universitäten aufgenommen und stellt die notwendigen Informationen und Assistenz zur Verfügung, um die Gefährdung zu beseitigen.

Update Launcher

Im Gegensatz zu den von uns im Whitepaper dokumentierten ShadowPad-Varianten ist der neue Launcher nicht mit Hilfe von VMProtect verschleiert. Außerdem ist die verschlüsselte Payload weder im Overlay eingebettet noch in einem alternativen COM1:NULL.dat Data Stream gelegen. Und die übliche RC5-Verschlüsselung, abgeleitet aus der Volume-ID des Systemlaufwerks des Opfers (wie in der PortReuse-Backdoor, in Skip-2.0 und in einigen ShadowPad-Varianten zu sehen), ist ebenfalls nicht vorhanden. Der aktualisierte Launcher ist insgesamt also wesentlich simpler gehalten.

DLL Side-Loading

Der Launcher ist eine 32-bit DLL namens hpqhvsei.dll – eigentlich ein Name einer legitimen DLL – und wird von hpqhvind.exe geladen. Diese ausführbare Datei stammt von HP und wird normalerweise mit der Druck- und Scansoftware „HP Digital Imaging“ installiert. Im vorliegenden Fall wurde die legitime hpqhvind.exe nebst schädlicher hpqhvsei.dll von den Cyberangreifern in C:\Windows\Temp abgelegt.

Zwar kennen wir nicht die Komponente, die den Launcher im System absetzt und ausführt. Die Gegenwart der oben genannten Dateien lässt uns aber vermuten, dass die initiale Ausführung des Launchers mit Hilfe von DLL Side-Loading realisiert wird.

Startet die schädliche DLL mit der hpqhvind.exe, wird die DLL Main Function aufgerufen, welche den übergeordneten Prozess auf folgende Bytes-Sequenz am 0x10BA-Offset prüft:

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

Falls der Parent Process hpqhvind.exe ist, wird die schädliche DLL fortfahren, um den übergeordneten Prozess im Speicher zu patchen. Es ersetzt die ursprünglichen Anweisungen von 0x10BA durch einen unconditional jump (jmp – 0xE9) an die Adresse der Funktion von hpqhvsei.dll. Diese entschlüsselt und führt den im Launcher eingebetteten verschlüsselten Payload aus.

Die für das Patchen des übergeordneten Prozesses verantwortliche, dekompilierte Funktion ist in Abb.1 dargestellt. Falls hpqhvsei.dll einen anderen Prozess als hpqhvind.exe lädt, wird die Entschlüsselung und Ausführung des Schadcodes verhindert.

Abbildung 1: Für das Patchen des übergeordneten Prozesses verantwortliche, dekompilierte Funktion

Abbildung 1: Für das Patchen des übergeordneten Prozesses verantwortliche, dekompilierte Funktion

Der Unterschied zwischen der ursprünglichen und der gepatchten hpqhvind.exe ist in Abbildung 2 dargestellt.

Abbildung 2: Unterschied zwischen original (links) und gepatchter (rechts) hpqhvind.exe

Abbildung 2: Unterschied zwischen original (links) und gepatchter (rechts) hpqhvind.exe

Der Teil des gepatchten Codes befindet sich ganz am Anfang der Hauptfunktion von hpqhvind.exe. In Abb. 2 erkennt man, dass der Code direkt nach dem Laden von hpqhvsei.dll platziert wurde. Das bedeutet, dass die für das Entschlüsseln und Ausführen der Payload verantwortliche Funktion direkt nach dem Laden der schädlichen DLL ausgeführt wird.

Payload-Entschlüsselung

Die verschlüsselte Payload ist im .rdata-Bereich der hpqhvsei.dll zu finden. Der Entschlüsselungsalgorithmus besteht aus einem XOR-Loop, bei dem der XOR-Key bei jeder Iteration aktualisiert wird, wie Abb. 3 zeigt.

Abbildung 3: Pseudocode der Payload-Entschlüsselungsschleife

Abbildung 3: Pseudocode der Payload-Entschlüsselungsschleife

Bei der entschlüsselten Payload handelt es sich üblicherweise um Shellcode, der für die ShadowPad-Initialisierung verantwortlich ist. (Mit Hilfe von Fake Conditional Jumps verschleiert, um Reverse Engineering zu verhindern.)

Persistenz der ShadowPad Backdoor

Nach der Entschlüsselung des ShadowPad Shellcodes folgt die Ausführung. Die Persistenz im System wird erreicht, indem der im Arbeitsspeicher gepatchte übergeordnete Prozess auf die Festplatte in einen Pfad geschrieben wird, der im Pool der Konfigurationszeichenfolgen angegeben ist. Im untersuchten Fall war das C:\ProgramData\DRM\CLR\CLR.exe. Daraufhin erschafft es einen Service namens clr_optimization_v4.0.30229_32, welcher für die Ausführung von CLR.exe verantwortlich ist. Um jeglichen Verdacht zu vermeiden, wurde der Name der .EXE so gewählt, dass einem Microsoft .NET Optimierungsservice möglichst nahekommt.

Den vollständigen Staging Process fasst Abb. 4 zusammen. Die Nummerierung jedes Pfeils entspricht der zeitlichen Abfolge der Ereignisse.

Abbildung 4: ShadowPad Staging Process

Abbildung 4: ShadowPad Staging Process

Modules

ShadowPad ist eine multi-modulare Backdoor, bei der die Module vom Root-Modul mit Hilfe einer Zirkelliste, von der man Moduladresse, ein UNIX-Zeitstempel (möglicherweise im Compiler-Prozess automatisch erstellt) und Modulkennung extrahieren kann, referenziert werden. Aus den Modulen lassen sich auch die Namen ablesen, welche die Entwickler diesen gaben. Die hier untersuchte Version enthält 17 in der folgenden Tabelle aufgelisteten Module:

Tabelle 1. In dieser ShadowPad-Version verwendete Module

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

Diese Module, mit Ausnahme von "RecentFiles“, wurden bereits von Kaspersky und Avast erwähnt. Man beachte den Tippfehler bei "Servcie".

Gewohntermaßen verteilen sich die Zeitstempel nur innerhalb eines kurzen Zeitbereichs. Wir nehmen an, dass die Verwendung eines Build-Frameworks für diese Kompilierungszeiten verantwortlich ist. Außerdem liegt nahe, dass die Module nur wenigen Stunden vor dem Launcher selbst gebaut wurden. Dessen Zeitstempel lautet Thu Oct 24 14:10:32 2019 – das bedeutet, dass alles etwa zwei Wochen vor der Malware-Kampagne auf die Hongkonger Universitäten kompiliert wurde. Auf eine Manipulation der Zeitstempel deutet nichts hin.

Die Anzahl der in diese Variante eingebetteten Module ist viel höher (17) als die Anzahl der im Whitepaper dokumentierten Varianten (8 bis 10 Module).

Mit Hilfe des Keylogger-Moduls (306, bereits von Avast erläutert) zeichnet die Malware Tastaturanschläge auf und speichert diese auf die Festplatte unter %APPDATA%\PAGM\OEY\XWWEYG\WAOUE.

Die Protokolldatei ist mit demselben Algorithmus verschlüsselt wie die statischen Zeichenfolgen aus dem Modul. Die standardmäßige Verwendung dieses Moduls deutet darauf hin, dass die Angreifer daran interessiert sind, Informationen zu stehlen. Die in dem Whitepaper beschriebenen Varianten weisen ein solches Modul nicht auf.

Konfiguration

Wie bei früheren Varianten enthält das Config-Modul (102) einen verschlüsselten String Pool, der über jedes andere Modul aus erreichbar ist. Der String Pool liegt niemals vollständig entschlüsselt im Speicher; das Feld von Interesse wird nach Bedarf entschlüsselt und dann sofort wieder gesperrt. Die Konfigurationsgröße beträgt 2180 Bytes, die verschlüsselten Strings befinden sich am Offset 0x84. Der zum Entschlüsseln der Zeichenfolgen verwendete Algorithmus ist derselbe wie der zum Entschlüsseln der statischen Zeichenfolgen des Moduls. Der entschlüsselte Inhalt des String Pools lautet:

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

Die Kampagnen-ID ist der Name der Zieluniversität und befindet sich am Offset 0x99. Bei ShadowPad und Winnti sind Kampagnen-IDs für Ziele durchaus üblich.

Interessanterweise gibt der Zeitstempel dieser Config am Offset 0x84 ein jüngeres Datum zurück, als es das Build-Datum der Module und des Loaders ist. Das deutet darauf hin, dass die Config später manuell zum Malware-Sample hinzugefügt wurde. Auch wenn es wohl reiner Zufall ist, entspricht das Datum in der Config dem Datum der ersten Entdeckung des Samples an der entsprechenden Universität.

Netzwerk-Kommunikation

Wenn ShadowPad erst einmal auf dem Computer-System ist, startet es einen versteckten und lautlosen wmplayer.exe Prozess und hakt sich darin ein. Der Pfad zu wmplayer.exe wird vom Config Modul bereitgestellt.

Sobald ShadowPad in wmplayer.exe ist, kontaktiert das Online-Modul den C&C-Server unter der in der Konfiguration angegebenen URL. Nach der Aktualisierung der Firewall-Regeln wird auf Port 13567 nach Verbindungen gesucht:

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

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

Die Netzwerk-Kommunikation wird dann über das TCP Modul (200) gehandhabt, welches bereits von Kaspersky analysiert wurde.

Auch Winnti-Malware war an Bord

Neben ShadowPad wurde auf einigen Computersystemen an zwei Universitäten auch die Winnti-Malware Ende Oktober (zwei Wochen vor ShadowPad) entdeckt. Der Schadcode versteckte sich in C:\Windows\System32\oci.dll. ESET-Sicherheitsprodukte erkennen die Malware als Win64/Winnti.CA.

Üblicherweise enthält die Winnti-Malware eine Konfiguration, in der Kampagnen-ID und C&C-URL spezifiziert sind. Auf alle kompromittierten Rechnern stimmte die Kampagnen-ID mit dem Name der jeweils betroffenen Universität überein. Die C&C-URLs folgen diesem Schema:

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

Wobei der vordere Teil den Namen der Universität beinhaltet.

C&C URL format

Es fällt auf, dass die C&C-URL bei Winnti und ShadowPad nachstehendem Schema folgen: [backdoor_type][target_name].domain.tld:443, wobei [backdoor_type] nur einen einzelnen Buchstaben beinhaltet – entweder „w“ oder „b“ für Winnti respektive ShadowPad.

Anhand dieses Formats fanden wir zahlreiche C&C-URLs und es stellte sich heraus, dass auch drei weitere Hongkonger Universitäten betroffen waren. Die in den analysierten Samples gefundenen Kampagnen-IDs stimmen mit dem Subdomain-Teil des C&C-Servers überein. Das verdeutlicht, dass diese Samples tatsächlich auf die entsprechenden Universitäten abgestimmt wurden.

Fazit

Die Winnti Group ist aktiv und macht regen Gebrauch von ihrer berüchtigten ShadowPad Backdoor. Dieses Mal richteten sich die Cyberangriffe gegen Hongkonger Universitäten. In dieser Malware-Kampagne wurden der VMProtected-Launcher, die PortReuse-Backdoor und Skip-2.0 allerdings durch simplere Varianten substituiert. Die in den Kampagnen-IDs und C&C URLs eindeutig Hongkonger Universitäten zuzuordnenden Namen lassen nur den Schluss zu, dass es sich um gezielte Cyberangriffe handelte.

Wir werden die neuen Aktivitäten der Winnti Group weiterhin überwachen und relevante Informationen in unserem Blog veröffentlichen. Bei Fragen wenden Sie sich bitte an threatintel@eset.com.

Indicators of Compromise (IoCs)

ESET detection names

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

File names

%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

Service display name

clr_optimization_v4.0.30229_32

C&C servers

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

ShadowPad launcher

Similar sample to avoid disclosing targeted universities.
693f0bd265e7a68b5b98f411ecf1cd3fed3c84af

MITRE ATT&CK techniques

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.