Im Februar 2020 entdeckten wir eine neue, modulare Backdoor und gaben dieser den Namen „PipeMon“. Als persistenter Druckprozessor, wurde diese von der Winnti-Gruppe gegen verschiedene Video Gaming Unternehmen aus Südkorea und Taiwan eingesetzt. Die von den Unternehmen entwickelten MMO Games finden sich auf bekannten Gaming Plattformen wieder und haben tausende simultan miteinander spielende Gamer.
In mindestens einem Fall konnten die Malware-Operatoren das Build-System kompromittieren, was in einen Supply-Chain-Angriff hätte münden können. Dabei schleusen Angreifer ihre schädliche Malware direkt in die Executables eines Spiels ein. In einem anderen Fall wurden die Gaming Server attackiert. Hier hätten die Angreifer beispielsweise die in-Game-Währung zum eigenen finanziellen Vorteil manipulieren können.
Die seit mindestens 2012 aktive Winnti-Gruppe ist für eine Reihe ausgefeilter Supply-Chain-Angriffe gegen die Software-Industrie verantwortlich. Ihre Attacken führten dazu, dass CCleaner, ASUS LiveUpdate und einige Videospiele als kompromittierte Versionen verbreitet wurden. Zuletzt entdeckten ESET-Forscher, Winnti-Angriffe auf verschiedene Hong Konger Universitäten mit Hilfe von ShadowPad und anderer Malware.
Zur Namensgebung "Winnti-Gruppe":
Wir haben uns für die Beibehaltung von "Winnti-Gruppe" 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-Gruppe, wenn wir uns auf die Cyberangreifer beziehen. Schon im Jahr 2013 zeigte sich, dass Winnti nur eine von vielen von der Winnti-Gruppe eingesetzten Malwares ist.
Warum Winnti dahinter steckt
Mehrere Indizien sprechen dafür, dass sich die Winnti-Gruppe hinter dieser PipeMon-Kampagne verbirgt. Einige der C&C-Server tauchten bereits in vergangenen Kampagnen auf. Außerdem fand man schon im Jahr 2019 die Winnti-Malware auf den Servern einiger Unternehmen, die nun auch mit PipeMon kompromittiert wurden.
Neben der Winnti-Malware entdeckte man zudem eine maßgeschneiderten AceHash Binary auf den Systemen anderer Winnti-Opfer. Hierbei handelte es sich um eine Software für das heimliche Sammeln von Anmeldedaten. Diese wurde mit einem wohlbekannten gestohlenen Zertifikat signiert.
Das Zertifikat, welches auch PipeMon-Installer, -Module und andere Tools signierte, steht in Verbindung mit einem Videospiele-Unternehmen, das im Jahr 2018 mithilfe einer Supply-Chain-Attacke durch Winnti kompromittiert wurde.
Die PipeMon-Module wurden interessanterweise unter dem %SYSTEM32%\spool\prtprocs\x64\-Pfad installiert; was in der Vergangenheit dazu diente, die Second Stage des infizierten CCleaners abzusetzen.
Schlussendlich ist die Winnti-Gruppe dafür bekannt, die Software der Build-Umgebung von Entwicklern anzugreifen, um die legitimen Anwendungen der Software-Hersteller zu kompromittieren.
Von Winnti anvisierte Unternehmen
Die in der neuen Kampagne anvisierten Unternehmen gehören Videospiele-Entwickler, die auf MMO-Games spezialisiert sind, mit Sitz in Südkorea und Taiwan. In mindestens einem Fall glückte es, den Angreifern, den Build-Orchestrierungs-Server des Unternehmens lahmzulegen und die Kontrolle über das automatische Build-Systems zu erlangen. Den Eindringlingen war es möglich, schädlichen Code in ausführbare Videospiele-Dateien zu implementieren.
ESET kontaktierte die betroffenen Unternehmen und übermittelte alle relevanten Informationen, um der Kompromittierung zu entgegnen.
Technische Analyse
Unter den kompromittierten Unternehmen fanden wir zwei PipeMon-Varianten. Nur für die häufiger verwendete Backdoor waren wir imstande, die First Stage zu identifizieren. Diese ist maßgeblich für die Installation und Persistenz von PipeMon verantwortlich.
Erste Stufe
Die erste Stufe von PipeMon besteht aus einer kennwortgeschützten ausführbaren RARSFX-Datei, die in den .rsrc-Abschnitt des Startprogramms eingebettet ist. Der Launcher schreibt die RARSFX in setup0.exe in ein Verzeichnis mit einer zufällig generierten ASCII-Zeichenfolge aus acht Zeichen, die sich in dem von GetTempPath zurückgegebenen Verzeichnis befindet. Nach dem Schreiben auf die Festplatte wird die RARSFX mit CreateProcess ausgeführt, indem das Entschlüsselungspasswort in einem Argument wie folgt angegeben wird:
setup0.exe -p*|T/PMR{|T2^LWJ*
Das Passwort ist für jedes Malware-Sample unterschiedlich.
Der Inhalt von RARSFX wird dann nach %TMP%\RarSFX0 entpackt. Dieser enthält folgende Dateien:
- CrLnc.dat – Entschlüsselte Payload
- Duser.dll – Genutzt für UAC Bypass
- osksupport.dll - Genutzt für UAC Bypass
- PrintDialog.dll – Genutzt zur bösartigen Druckprozessor-Initialisierung
- PrintDialog.exe – Legitime Windows Executable genutzt, um PrintDialog.dll zu laden
- setup.dll – Installation DLL
- setup.exe – Main Executable
Im Fall einer Dateinamenkollision erhöht sich die Ziffer am Ende von RarSFX0. In Abhängigkeit vom Installationsprogramm sind nicht unbedingt alle Dateien im Archiv vorhanden.
Die setup.exe wird nach dem Entpacken ohne weitere Argumente ausgeführt. Der einzige Zweck dieser Datei ist das Laden der setup.dll mithilfe von LoadLibraryA. Danach prüft setup.dll ob ein Argument in -x:n-Form (n ist eine Ganzzahl) bereitgestellt wurde. Die Funktionsweise hängt dabei von n ab. Unterstützte Argumente und deren entsprechendes Verhalten sind in Tabelle 1 dargestellt.
setup.exe wird ohne Argumente von RARSFX ausgeführt. Die Executable überprüft, ob sie unter erhöhten Rechten läuft. Ist das nicht der Fall, unternimmt sie den Versuch, diese mithilfe von Access Token Manipulation bei Windows 7 Versionen unter Build 7601 zu erlangen. Ansonsten werden verschiedene UAC Bypass-Techniken ausprobiert, so dass die Installation des Payload-Loaders in eine dieser Techniken gelingt:
- C:\Windows\System32\spool\prtprocs\x64\DEment.dll
- C:\Windows\System32\spool\prtprocs\x64\EntAppsvc.dll
- C:\Windows\System32\spool\prtprocs\x64\Interactive.dll
(Je nach Variante). Wir gelangten an keine Malware-Samples, die auf Interactive.dll zurückgriffen.
Command line argument value | Behavior |
---|---|
-x:0 | Load the payload loader. |
-x:1 | Attempt to enable SeLoadDriverPrivilege for the current process. If successful, attempt to install the payload loader; otherwise, restart setup.exe with the –x:2 argument using parent process spoofing. |
-x:2 | Attempt to enable SeLoadDriverPrivilege for the current process. If successful, attempt to install the payload loader. |
Tabelle 1: die von setup.exe unterstützten Argumente und deren entsprechendes Verhalten
Der Loader ist innerhalb von setup.dll verschlüsselt gespeichert und wird vor der Speicherung an zuvor genannten Ort entschlüsselt.
Persistenz mit Windows-Druckprozessoren
Der Ort, an dem die bösartige DLL abgelegt wird, ist nicht zufällig gewählt. Es handelt sich um den Pfad, an dem sich die Windows-Druckprozessoren befinden. Hier registriert setup.dll auch den schädlichen Loader als alternativen Druckprozessor, mithilfe einer der folgenden Registry-Werte:
HKLM\SYSTEM\ControlSet001\Control\Print\Environments\Windows x64\Print Processors\PrintFiiterPipelineSvc\Driver = “DEment.dll”
Oder
HKLM\SYSTEM\CurrentControlSet\Control\Print\Environments\Windows x64\Print Processors\lltdsvc1\Driver = “EntAppsvc.dll”
(Je nach Variante). Man beachte den Typo in \PrintFiiterPipelineSvc\ (was aber keinen Einfluss auf die Druckprozessor-Installation hat, da jede Bezeichnung zulässig ist).
Nach erfolgreicher Registrierung des Druckprozessors startet PipeMon den Print Spooler Service (spoolsv.exe) neu. Infolgedessen wird der bösartige Druckprozess nun bei jedem Start des Spooler-Diensts geladen. Die Persistenz von PipeMon wir dadurch gewährleistet, dass spoolsv.exe bei jedem PC-Start ausgeführt wird.
Diese Technik ähnelt der Print Monitor Persistence Technique, die DePriMon nutzte, und die nach unserem Wissen bisher noch nicht genauer beleuchtet wurde.
Zusätzlich wird die verschlüsselte Payload CrLnc.dat, die aus RARSFX extrahiert wird, je nach Installationsprogramm in die Registry an folgender Stelle geschrieben:
- HKLM\SOFTWARE\Microsoft\Print\Components\DC20FD7E-4B1B-4B88-8172-61F0BED7D9E8
- HKLM\SOFTWARE\Microsoft\Print\Components\A66F35-4164-45FF-9CB4-69ACAA10E52D
Die verschlüsselte Registry-Payload wird dann von der zuvor registrierten Druckprozessors-DLL geladen, entschlüsselt und ausgeführt. Die gesamte PipeMon-Bereitstellung und -Persistenz ist in Abbildung 1 dargestellt.
PipeMon
Wir gaben dieser neuen Malware, den Namen PipeMon, da mehrere Pipes für die Kommunikation zwischen den Modulen verwendet werden. Gemäß des PDB-Pfads lautet der Name des von seinen Entwicklern verwendeten Visual Studio-Projekts "Monitor".
Wie eingangs bereits erwähnt, wurden zwei verschiedene PipeMon-Varianten gefunden. Bei der ersten Variante konnten wir das Installationsprogramm nicht wiederherstellen; daher wissen wir nicht mit absoluter Sicherheit, welche Persistenz-Technik verwendet wurde. Bedenkt man aber, dass sich diese erste Variante von PipeMon ebenfalls im Verzeichnis des Druckprozessors befand, ist es wahrscheinlich, dass man denselben Persistenz-Mechanismus nutzte.
Originale Variante
PipeMon ist eine modulare Backdoor, bei der jedes Modul aus einer einzelnen DLL besteht, welche die Funktion IntelLoader exportieren. Diese wird mithilfe einer Reflective Loading Technique geladen. Jedes Modul weist unterschiedliche Funktionalitäten auf, die wir in Tabelle 2 darstellen.
Der für das Laden der Hauptmodule (ManagerMain und GuardClient) verantwortliche Loader ist Win32CmdDll.dll. Dieser befindet sich im Druckprozessor-Pfad. Die Module werden auf der Festplatte am gleichen Ort mit harmlos aussehenden Namen wie folgt verschlüsselt:
- banner.bmp
- certificate.cert
- License.hwp
- JSONDIU7c9djE
- D8JNCKS0DJE
- B0SDFUWEkNCj.logN
.hwp ist die Datei-Erweiterung von Hangul Word Processor von Hangul Office, das in Südkorea sehr beliebt ist.
Die Module sind RC4-verschlüsselt. Der Entschlüsselungsschlüssel Com!123Qasdz ist in jedem Modul fest einprogrammiert. Win32CmDll.dll entschlüsselt die Module ManagerMain und GuardClient und schleust diese in entsprechende Programme ein. Das ManagerMain-Modul ist für die Entschlüsselung und Injection des Kommunikationsmoduls verantwortlich, während das GuardClient-Modul dafür sorgt, dass das Kommunikationsmodul läuft, und es bei Bedarf neustartet. Eine Übersicht über die Funktionsweise von PipeMon ist in Abbildung 2 dargestellt.
Die Prozesskandidaten für die Injection von Kommunikationsmodulen müssen sich in der TCP-Verbindungstabelle entweder mit 0.0.0.0 (lokale Adresse) oder einer ESTABLISHED-Verbindung befinden und über ein LOCAL SERVICE-Token verfügen. Diese Bedingungen werden wahrscheinlich verwendet, um das Kommunikationsmodul in einem Prozess zu verstecken, der bereits über das Netzwerk kommuniziert, so dass der Traffic vom Kommunikationsmodul nicht auffällt und möglicherweise auch auf der Whitelist in der Firewall zu finden ist.
Wenn kein Prozess die vorherigen Anforderungen erfüllt, versucht das ManagerMain-Modul, das Kommunikationsmodul in explorer.exe einzuschleusen. Prozesse, die zu den Windows Store Apps gehören, und Prozesse mit den Namen egui.exe (ESET) und avpui.exe (Kaspersky) werden bei der Auswahl ignoriert.
Module Name | Description | PDB Path |
---|---|---|
Win32CmdDll | Decrypts and loads the ManagerMain and GuardClient modules. | S:\Monitor\Monitor_RAW\Launcher\x64\Release\Win32CmdDll.pdb S:\Monitor\Monitor_RAW\libs\x64\Release\Win32CmdDll.pdb |
GuardClient | Periodically checks whether the Communication module is running and loads it if not. | S:\Monitor\Monitor_RAW\Client\x64\Release\GuardClient.pdb |
ManagerMain | Loads Communication module when executed. Contains encrypted C&C domain which is passed to the Communication module via named pipe. Can execute several commands based on the data received from the Communication module (mostly system information collecting, injecting payloads). |
S:\Monitor\Monitor_RAW\Client\x64\Release\ManagerMain.pdb |
Communication | Responsible for managing communication between the C&C server and individual modules via named pipes. | S:\Monitor\Monitor_RAW\Client\x64\Release\Communication.pdb F:\PCC\trunk\CommunicationClient\x64\Release\Communication.pdb |
Tabelle 2: PipeMon-Modulbeschreibungen und ihre jeweiligen PDB-Pfade
Zusätzliche Module können bei Bedarf mit Hilfe von dedizierten Befehlen (untenstehend) geladen werden, leider bekamen wir keines davon zu Gesicht. Die Namen dieser Module sind eine wohlbegründete Vermutung auf der Grundlage der benannten Pipes, die zur Kommunikation mit ihnen verwendet wurden:
- Screen
- Route
- CMD
- InCmd
- File
Inter-module Kommunikation
Die Kommunikation zwischen den Modulen erfolgt über Named Pipes, wobei zwei Named Pipes pro Kommunikationskanal zwischen jedem einzelnen Modul verwendet werden, eine zum Senden und eine zum Empfangen. Tabelle 3 listet die Kommunikationskanäle und ihre entsprechenden Pipes auf.
Communication channel | Named pipe |
---|---|
Communication, Screen | \\.\pipe\ScreenPipeRead%CNC_DEFINED% \\.\pipe\ScreenPipeWrite%CNC_DEFINED% |
Communication, Route | \\.\pipe\RoutePipeWriite%B64_TIMESTAMP% |
Communication, ManagerMain | \\.\pipe\MainPipeWrite%B64_TIMESTAMP% \\.\pipe\MainPipeRead%B64_TIMESTAMP% |
GuardClient, ManagerMain | \\.\pipe\MainHeatPipeRead%B64_TIMESTAMP% |
Communication, InCmd | \\.\pipe\InCmdPipeWrite%B64_TIMESTAMP% \\.\pipe\InCmdPipeRead%B64_TIMESTAMP% |
Communication, File | \\.\pipe\FilePipeRead%B64_TIMESTAMP% \\.\pipe\FilePipeWrite%B64_TIMESTAMP% |
GuardClient, Communication | \\.\pipe\ComHeatPipeRead%B64_TIMESTAMP% |
Communication, CMD | \\.\pipe\CMDPipeRead \\.\pipe\CMDPipeWrite |
Tabelle 3: PipeMon-Kommunikationskanal und die jeweiligen Named Pipes
Die Zeichenfolge %CNC_DEFINED% wird vom C&C-Server empfangen, die Variablen %B64_TIMESTAMP% sind base64-kodierte Zeitstempel, wie sie in Tabelle 4 dargestellt sind.
%BASE64_TIMESTAMP% | Decoded timestamp |
---|---|
MjAxOTAyMjgxMDE1Mzc= | 20190228101537 |
MjAxOTA1MjEyMzU2MjQ= | 20190521235624 |
MjAxOTExMjExMjE2MjY= | 20191121121626 |
Tabelle 4: Beispiele für Zeitstempel bei Named Pipes
C&C Kommunikation
Das Kommunikationsmodul ist für die Verwaltung der Kommunikation zwischen dem C&C-Server und den anderen Modulen via Named Pipes zuständig, ähnlich wie bei der PortReuse Backdoor, die in unserem Whitepaper über das Winnti-Arsenal dokumentiert ist.
Die C&C-Server-Adresse ist fest im ManagerMain-Modul einprogrammiert und mit dem festcodierten Com!123Qasdz-Key RC4-verschlüsselt. Es wird über eine Named Pipe an das Kommunikationsmodul gesendet.
Für jedes installierte Modul wird ein separater Kommunikationskanal erstellt. Das verwendete Kommunikationsprotokoll ist TLS over TCP. Die Kommunikation wird mithilfe der HP-Socket-Bibliothek abgewickelt. Alle Nachrichten werden mit dem hartkodierten Schlüssel RC4 verschlüsselt. Wenn die Größe der zu übertragenden Nachricht größer oder gleich 4 KB ist, wird sie zunächst mit zlib-Deflate komprimiert.
struct CCMSG
{
BYTE is_compressed;
CMD cmd;
};
struct CMD
{
QWORD cmd_type;
DWORD cmd_size;
DWORD cmd_arg;
BYTE data[cmd_size - 16];
};
struct beacon_msg
{
BYTE isCompressed = 0;
CMD cmd_hdr;
WCHAR win_version[128];
WCHAR adapters_addrs[128];
WCHAR adapters_addrs[64];
WCHAR local_addr[64];
WCHAR malware_version[64];
WCHAR computer_name[64];
}
Abbildung 3: C&C-Nachricht und Beacon-Formate
Um die Kommunikation mit dem C&C-Server einzuleiten, wird zunächst ein Beacon gesendet, das die folgenden Informationen enthält:
- OS-Version
- Physische Adresse von angeschlossenen Netzwerkadaptern, mit %B64_TIMESTAMP%
- Lokale IP-Adresse des Opfers
- Backdoor-Version / Campaign ID; wir beobachteten die folgenden Werte
- "1.1.1.4beat"
- "1.1.1.4Bata"
- "1.1.1.5"
- PC-Name des Opfers
Die Informationen über den Computer des Opfers werden vom ManagerMain-Modul gesammelt und über die Named Pipe an das Kommunikationsmodul gesendet. Die Backdoor-Version ist im Kommunikationsmodul im Klartext fest einprogrammiert.
Das Format des Beacons ist in Abbildung 3 dargestellt, die unterstützten Befehle sind in Tabelle 5 aufgeführt.
Command type | Command argument | Description |
---|---|---|
0x02 | 0x03 | Install the File module |
0x03 | 0x03 | Install the CMD module |
0x03 | 0x0B | Install the InCmd module |
0x04 | 0x02 | Queue command for the Route module |
0x04 | 0x03 | Install the Route module |
0x05 | * | Send victim’s RDP information to the C&C server |
0x06 | 0x05 | Send OS, CPU, PC and time zone information to the C&C server |
0x06 | 0x06 | Send network information to the C&C server |
0x06 | 0x07 | Send disk drive information to the C&C server |
0x07 | * | Send running processes information to the C&C server |
0x09 | * | DLL injection |
0x0C | 0x15 | Send names of "InCmd" pipes and events to the C&C server |
0x0C | 0x16 | Send name of "Route" pipe to the C&C server |
0x0C | 0x17 | Send names of "File" pipes to the C&C server |
Tabelle 5: Liste der unterstützten Befehle
Aktualisierte Variante
Wie bereits erwähnt, verwendeten die Angreifer auch eine aktualisierte Version von PipeMon, für die wir die oben beschriebene erste Stufe abrufen konnten. Zwar weist diese Variante eine Architektur auf, die der originalen sehr ähnlich ist, allerdings wurde ihr Code wahrscheinlich von Grund auf neu geschrieben.
Der für die Entschlüsselung der Module und Strings verwendete RC4-Code wurde durch ein einfaches XOR mit 0x75E8EEAF -Key substituiert, alle fest einprogrammierten Strings entfernten die Malware-Entwickler.
Die Named Pipes, die für die Kommunikation zwischen den Modulen verwendet werden, sind nun mit Zufallswerten statt mit expliziten Namen benannt und entsprechen dem Format \\\.\pipe\%rand%, wobei %rand% eine pseudozufällig generierte Zeichenkette von 31 Zeichen ist (nur Buchstaben in gemischter Groß- und Kleinschreibung).
Es wird nur der Main-Loader (d.h. die als Druckprozessor installierte bösartige .DLL) als Datei auf der Festplatte gespeichert; die Module werden vom Installationsprogramm (ausgehend von CrLnc.dat) in der Registry gespeichert und sind in Tabelle 6 beschrieben:
Module name | Description |
---|---|
CoreLnc.dll | Loaded by the malicious Print Processor. Responsible only for loading the Core.dll module embedded in its .data section. |
Core.dll | Loads the Net.dll module embedded in its .data section. Handles commands from the C&C server and communications between individual modules and the C&C server through named pipes. |
Net.dll | New Communication module. Handles the networking. |
Tabelle 6: Aktualisierte Module
Das Einschleusen von Modulen wird nicht mehr mithilfe von der Reflective Loading Technique mit Exportfunktion durchgeführt. Stattdessen wird maßgeschneiderter Loader-Shellcode verwendet, den man zusammen mit dem zu ladenden Modul einschleust.
Das C&C-Nachrichtenformat wurde ebenfalls geändert, was Abbildung 4 darstellt:
struct CCMSG
{
BYTE is_compressed;
CMD cmd;
};
struct CMD
{
QWORD cmd_type;
DWORD cmd_size;
DWORD cmd_arg;
BYTE data[cmd_size - 16];
};
struct CCMSG
{
DWORD signature = 0xFA149DEB;
DWORD not_used;
WORD buff_size;
WORD msgcode;
BYTE buff[buff_size];
};
Abbildung 4: Vorheriges (links) und aktualisiertes (rechts) C&C-Nachrichtenformat
Interessanterweise ist die Backdoor-Konfiguration verschlüsselt und in die Loader-DLL eingebettet. Die Konfiguration enthält:
- Name des Registry-Werts
- Campaign ID
- C&C IP-Adressen oder Domain Names
- Zeitstempel (im FILETIME-Format), der dem Datum entspricht, ab dem eine zweite C&C-Domain, die in der Konfiguration mit '#' gekennzeichnet ist, benutzt werden soll.
Ein Beispiel für einen in die Loader-DLL eingebetteten Konfigurations-Dump ist in Abbildung 5 dargestellt – Konfigurationen, die aus mehreren Loader-DLLs extrahiert wurden in Tabelle 7.
Loader SHA-1 | Campaign ID | Payload registry name | C&C IP/domains | Alternative domain activation timestamp |
---|---|---|---|---|
6c97039605f93ccf1afccbab8174d26a43f91b20 | KOR2 | DC20FD7E-4B1B-4B88-8172-61F0BED7D9E8 | 154.223.215.116 ssl2.dyn-tracker.com #client.gnisoft.com |
0x01d637a797cf0000 (Monday, June 1, 2020 12:00:00am) |
97da4f938166007ce365c29e1d685a1b850c5bb0 | KOR | DC20FD7E-4B1B-4B88-8172-61F0BED7D9E8 | 203.86.239.113 ssl2.dyn-tracker.com #client.gnisoft.com | 0x01d637a797cf0000 (Monday, June 1, 2020 12:00:00am) |
7ca43f3612db0891b2c4c8ccab1543f581d0d10c | kor1 | DC20FD7E-4B1B-4B88-8172-61F0BED7D9E8 | 203.86.239.113 www2.dyn.tracker.com (note the typo here: dyn.tracker instead of dyn-tracker) #nmn.nhndesk.com |
0x01d61f4b7500c000 (Friday, May 1, 2020 12:00:00am) |
b02ad3e8b1cf0b78ad9239374d535a0ac57bf27e | tw1 | A66F35-4164-45FF-9CB4-69ACAA10E52D | ssl.lcrest.com | - |
Tabelle 7: Aus mehreren Loadern extrahierte Konfiguration
Gestohlenes Code-Signatur-Zertifikat
PipeMon-Module und Installer wurden alle mit dem gleichen validen Code-Signatur-Zertifikat signiert, das wahrscheinlich aus einem Raubzug früherer Winnti-Kampagnen stammte. Der Owner des Zertifikats widerrief es, als er über uns von dem Problem erfuhr.
Auf einer Sample Sharing Plattform fanden wir weitere Tools, die mit dem Zertifikat signiert wurden. Dazu gehörten beispielsweise HTRan (ein Connection Bouncer), der WinEggDrop Port Scanner, Netcat und Mimikatz, was die Angreifer möglicherweise auch nutzten.
Auf einigen mit PipeMon kompromittierten Rechnern entdeckten wir außerdem ein maßgeschneidertes AceHash Build, das mit einem von Wemade IO gestohlenen Zertifikat signiert wurde. Darüber berichteten wir bereits in einem zurückliegenden Artikel über Winnti.
Fazit
Wieder einmal steht die Videospiele-Industrie in Asien im Fokus der Winnti-Gruppe. Eine neue modular aufgebaute Backdoor, die mit einem gestohlenen Zertifikat signiert wurde, zeigt einige Ähnlichkeiten zur älteren PortReuse Backdoor. Die Neuentwicklung der Angreifer verdeutlicht, dass die Winnti-Gruppe immer noch aktiv an neuen Tools baut und dabei auf mehrere Open-Source-Projekte zurückgreift; sie verlassen sich also nicht nur auf ihre Flaggschiffe, die ShadowPad- und Winnti-Malware.
ESET-Forscher werden die Winnti Group weiterhin verfolgen und zusätzliche Details bereitstellen, sobald das Team sie findet. Wer glaubt, kompromittiert worden zu sein oder wer weitere Fragen hat, wendet sich bitte an unser Team via threatintel@eset.com. Die IoCs sind auf GitHub hochgeladen.
Indicators of Compromise
ESET detection names
Win64/PipeMon.A
Win64/PipeMon.B
Win64/PipeMon.C
Win64/PipeMon.D
Win64/PipeMon.E
Filenames
100.exe
103.exe
Slack.exe
setup.exe
%SYSTEM32%\spool\prtprocs\x64\DEment.dll
%SYSTEM32%\spool\prtprocs\x64\EntAppsvc.dll
%SYSTEM32%\spool\prtprocs\x64\Interactive.dll
%SYSTEM32%\spool\prtprocs\x64\banner.bmp
%SYSTEM32%\spool\prtprocs\x64\certificate.cert
%SYSTEM32%\spool\prtprocs\x64\banner.bmp
%SYSTEM32%\spool\prtprocs\x64\License.hwp
%SYSTEM32%\spool\prtprocs\x64\D8JNCKS0DJE
%SYSTEM32%\spool\prtprocs\x64\B0SDFUWEkNCj.log
%SYSTEM32%\spool\prtprocs\x64\K9ds0fhNCisdjf
%SYSTEM32%\spool\prtprocs\x64\JSONDIU7c9djE
%SYSTEM32%\spool\prtprocs\x64\NTFSSSE.log
AceHash64.exe
mz64x.exe
Named pipes
\\.\pipe\ScreenPipeRead%CNC_DEFINED%
\\.\pipe\ScreenPipeWrite%CNC_DEFINED%
\\.\pipe\RoutePipeWriite%B64_TIMESTAMP%
\\.\pipe\MainPipeWrite%B64_TIMESTAMP%
\\.\pipe\MainPipeRead%B64_TIMESTAMP%
\\.\pipe\MainHeatPipeRead%B64_TIMESTAMP%
\\.\pipe\InCmdPipeWrite%B64_TIMESTAMP%
\\.\pipe\InCmdPipeRead%B64_TIMESTAMP%
\\.\pipe\FilePipeRead%B64_TIMESTAMP%
\\.\pipe\FilePipeWrite%B64_TIMESTAMP%
\\.\pipe\ComHeatPipeRead%B64_TIMESTAMP%
\\.\pipe\CMDPipeRead
\\.\pipe\CMDPipeWrite
Registry
HKLM\SYSTEM\ControlSet001\Control\Print\Environments\Windows x64\Print Processors\PrintFiiterPipelineSvc\Driver = “DEment.dll”
HKLM\SYSTEM\CurrentControlSet\Control\Print\Environments\Windows x64\Print Processors\lltdsvc1\Driver = “EntAppsvc.dll”
HKLM\SOFTWARE\Microsoft\Print\Components\DC20FD7E-4B1B-4B88-8172-61F0BED7D9E8
HKLM\SOFTWARE\Microsoft\Print\Components\A66F35-4164-45FF-9CB4-69ACAA10E52D
Samples
First stage
4B90E2E2D1DEA7889DC15059E11E11353FA621A6
C7A9DCD4F9B2F26F50E8DD7F96352AEC7C4123FE
3508EB2857E279E0165DE5AD7BBF811422959158
729D526E75462AA8D33A1493B5A77CB28DD654BC
5663AF9295F171FDD41A6D819094A5196920AA4B
PipeMon
23789B2C9F831E385B22942DBC22F085D62B48C7
53C5AE2655808365F1030E1E06982A7A6141E47F
E422CC1D7B2958A59F44EE6D1B4E10B524893E9D
5BB96743FEB1C3375A6E2660B8397C68BEF4AAC2
78F4ACD69DC8F9477CAB9C732C91A92374ADCACD
B56D8F826FA8E073E6AD1B99B433EAF7501F129E
534CD47EB38FEE7093D24BAC66C2CF8DF24C7D03
PipeMon encrypted binaries
168101B9B3B512583B3CE6531CFCE6E5FB581409
C887B35EA883F8622F7C48EC9D0427AFE833BF46
44D0A2A43ECC8619DE8DB99C1465DB4E3C8FF995
E17972F1A3C667EEBB155A228278AA3B5F89F560
C03BE8BB8D03BE24A6C5CF2ED14EDFCEFA8E8429
2B0481C61F367A99987B7EC0ADE4B6995425151C
Additional tools
WinEggDrop
AF9C220D177B0B54A790C6CC135824E7C829B681
Mimikatz
4A240EDEF042AE3CE47E8E42C2395DB43190909D
FD4567BB77F40E62FD11BEBF32F4C9AC00A58D53
Netcat
751A9CBFFEC28B22105CDCAF073A371DE255F176
HTran
48230228B69D764F71A7BF8C08C85436B503109E
AceHash
D24BBB898A4A301870CAB85F836090B0FC968163
Code-signing certificate SHA-1 thumbprints
745EAC99E03232763F98FB6099F575DFC7BDFAA3
2830DE648BF0A521320036B96CE0D82BEF05994C
C&C domains
n8.ahnlabinc[.]com
owa.ahnlabinc[.]com
ssl2.ahnlabinc[.]com
www2.dyn.tracker[.]com
ssl2.dyn-tracker[.]com
client.gnisoft[.]com
nmn.nhndesk[.]com
C&C IP addresses
154.223.215[.]116
203.86.239[.]113
MITRE ATT&CK techniques
Tactic | ID | Name | Description |
---|---|---|---|
Persistence | T1013 | Port Monitor | PipeMon uses a persistence technique similar to Port Monitor based on Print Processors. |
Privilege Escalation | T1134 | Access Token Manipulation | The PipeMon installer tries to gain administrative privileges using token impersonation. |
T1088 | Bypass User Account Control | The PipeMon installer uses UAC bypass techniques to install the payload. | |
T1502 | Parent PID Spoofing | The PipeMon installer uses parent PID spoofing to elevate privileges. | |
Defense Evasion | T1116 | Code Signing | PipeMon, its installer and additional tools are signed with stolen code-signing certificates. |
T1027 | Obfuscate Files or Information | PipeMon modules are stored encrypted on disk. | |
T1112 | Modify Registry | The PipeMon installer modifies the registry to install PipeMon as a Print Processor. | |
T1055 | Process Injection | PipeMon injects its modules into various processes using reflective loading. | |
Discovery | T1057 | Process Discovery | PipeMon iterates over the running processes to find a suitable injection target. |
T1063 | Security Software discovery | PipeMon checks for the presence of ESET and Kaspersky software. | |
Collection | T1113 | Screen Capture | One of the PipeMon modules is likely a screenshotter. |
Command and Control | T1043 | Commonly Used Ports | PipeMon communicates through port 443. |
T1095 | Custom Command and Control Protocol | PipeMon communication module uses a custom protocol based on TLS over TCP. | |
T1032 | Standard Cryptographic Protocol | PipeMon communication is RC4 encrypted. | |
T1008 | Fallback Channels | The updated PipeMon version uses a fallback channel once a particular date is reached. |