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.
Der Unterschied zwischen der ursprünglichen und der gepatchten hpqhvind.exe ist in Abbildung 2 dargestellt.
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.
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.
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. |