Die von ESET-Forscher entdeckte Kampagne mit einer zuvor undokumentierten Korplug-Variante dauert noch an. Sie wird, aufgrund ihrer Ähnlichkeit mit der von Unit 42 im Jahr 2020 dokumentierten THOR-Variante, Hodur genannt. Hodur ist in der nordischen Mythologie Thors blinder Halbbruder, der von Loki dazu verleitet wird, ihren Halbbruder Baldr zu töten.
Die wichtigsten Erkenntnisse in diesem Blogpost:
- Die mindestens auf den August 2021 zurückgehende Kampagne dauert im März 2022 noch an.
- Zu bekannten Opfern zählen Forschungseinrichtungen, Internetdienstanbieter und europäische diplomatische Vertretungen.
- Die Kompromittierungskette nutzt Lock-Dokumente, die häufig aktualisiert werden und sich auf Ereignisse in Europa beziehen.
- Die Kampagne verwendet einen eigenen Loader, um eine neue Korplug-Variante auszuführen.
- In jeder Phase des Bereitstellungsprozesses der Malware werden Anti-Analyse-Techniken und Kontrollfluss-Verschleierung eingesetzt, wodurch sie sich von anderen Kampagnen unterscheidet.
- ESET-Forscher nehmen hier eine eingehende Analyse der Fähigkeiten und Befehle dieser neuen Variante vor.
Wahrscheinlich werden die Opfer dieser Kampagne mit Phishing-Dokumenten angelockt, die die jüngsten Ereignisse in Europa und zynischer Weise die russische Invasion in der Ukraine als Lockmittel missbrauchen. Der Krieg in der Ukraine hat mittlerweile schon dazu geführt, dass mehr als drei Millionen Ukrainer vor dem Krieg in Nachbarländer fliehen mussten, was zu einer beispiellosen Krise an den Grenzen der Ukraine geführt hat. Einer der Dateinamen die im Zusammenhang mit dieser Malware-Kampagne verwendet wird. Lautet Situation an den EU-Grenzen mit der Ukraine.exe.
Andere Phishing-Köder erwähnen aktualisierte COVID-19-Reisebeschränkungen, eine genehmigte Regionalhilfekarte für Griechenland und eine Verordnung des Europäischen Parlaments und des Rates. Letzteres ist ein echtes Dokument, das auf der Website des Europäischen Rates verfügbar ist. Dies zeigt, dass die APT-Gruppe hinter dieser Kampagne aktuelle Ereignisse verfolgt und in der Lage ist, erfolgreich und schnell darauf zu reagieren.
Betroffene Länder:
- Mongolei
- Vietnam
- Myanmar
- Griechenland
- Russland
- Zypern
- Südsudan
- Südafrika
Betroffene Branchen:
- Diplomatische Missionen
- Forschungseinrichtungen
- Internetdienstanbieter (ISP)
Analyse
Basierend auf den Code-Ähnlichkeiten und den vielen Gemeinsamkeiten der Taktiken, Techniken und Prozeduren (TTPs) schreiben ESET-Forscher diese Kampagne mit hoher Zuversicht Mustang Panda (auch bekannt als TA416, RedDelta oder PKPLUG) zu. Es handelt sich dabei um eine Cyberspionage-Gruppe, die sich hauptsächlich gegen Regierungsbehörden und NGOs richtet. Die Opfer befinden sich meist, aber nicht ausschließlich, in Ost- und Südostasien mit Schwerpunkt auf der Mongolei. Die Gruppe ist auch für ihre Kampagne gegen den Vatikan im Jahr 2020 bekannt.
Obwohl wir nicht in der Lage waren, die Branchen aller Opfer zu identifizieren, scheint diese Kampagne dieselben Targeting-Ziele zu haben, wie andere Mustang-Panda-Kampagnen. Entsprechend der typischen Viktimologie der Gruppe befinden sich die meisten Opfer in Ost- und Südostasien, dazu kommen einige in europäischen und afrikanischen Ländern. Laut ESET-Telemetrie befindet sich die überwiegende Mehrheit der Ziele in der Mongolei und Vietnam, gefolgt von Myanmar, nur wenige befinden sich außerhalb davon.
Die Kampagnen von Mustang Panda verwenden häufig eigene Loader für verbreitete Malware, wie Cobalt Strike, Poison Ivy und Korplug (auch bekannt als PlugX). Die Gruppe ist auch dafür bekannt, eigene Korplug-Varianten zu erstellen. Im Vergleich zu anderen Kampagnen, die Korplug verwenden, werden in jeder Phase des Bereitstellungsprozesses Anti-Analyse-Techniken und Maßnahmen zur Kontrollfluss-Verschleierung eingesetzt.
Dieser Blogpost enthält eine detaillierte Analyse, der in der Kampagne verwendeten, bisher ungesehenen Korplug-Variante. Die beschriebene Aktivität ist Teil derselben Kampagne, die kürzlich von Proofpoint beschrieben wurde, aber wir stellen zusätzliche Informationen zu Verlauf und Zielen bereit.
Angriffswerkzeuge
Mustang Panda ist für seine aufwändigen eigens erstellten Loader und Korplug-Varianten bekannt und diese Kampagne ist keine Ausnahme.
Die in dieser Kampagne beobachteten Kompromittierungsketten folgen dem typischen Korplug-Muster: Eine legitime, gültig signierte, ausführbare Datei, die anfällig für das Hijacking von DLL-Suchaufträgen ist, eine bösartige DLL sowie eine verschlüsselte Korplug-Datei werden auf dem Zielcomputer bereitgestellt. Die ausführbare Datei wird dazu missbraucht, um das Modul zu laden, das dann die Korplug RAT entschlüsselt und ausführt. In einigen Fällen wird zuerst ein Downloader verwendet, um diese Dateien zusammen mit einem Köderdokument bereitzustellen. Dieser Vorgang ist in Abbildung 2 dargestellt.
Was diese Kampagne auszeichnet, ist der verstärkte Einsatz von Control-Flow-Verschleierung und Anti-Analyse-Techniken in jeder Phase des Bereitstellungsprozesses. Die folgenden Abschnitte beschreiben das Verhalten der einzelnen Stufen und werfen einen tieferen Blick auf die Abwehrtechniken, die in jeder von ihnen verwendet werden.
Erster Zugriff
Wir konnten den anfänglichen Bereitstellungsvektor nicht nachverfolgen, aber unsere Analyse weist auf Phishing- und Watering-Hole-Angriffe als wahrscheinliche Angriffsvektoren hin. In Fällen wo wir haben einen Downloader gesehen haben, deuten die verwendeten Dateinamen auf ein Dokument mit einem für das Angriffsziel interessanten Thema hin. Einige Beispiele sind:
- COVID-19 travel restrictions EU reviews list of third countries.exe
- State_aid__Commission_approves_2022-2027_regional_aid_map_for_Greece.exe
- REGULATION OF THE EUROPEAN PARLIAMENT AND OF THE COUNCIL.exe
- Situation at the EU borders with Ukraine.exe
Um die Illusion zu verstärken, laden diese Binärdateien ein Dokument herunter und öffnen es, das den gleichen Namen hat, aber die Erweiterung .doc oder .pdf hat. Der Inhalt dieser Köder gibt den Dateinamen genau wieder. Wie in Abbildung 3 dargestellt, handelt es sich bei mindestens einem davon um ein öffentlich zugängliches legitimes Dokument des Europäischen Parlaments.
Downloader
Obwohl die Komplexität im Laufe der Kampagne zugenommen hat, ist der Downloader ziemlich einfach. Die gesteigerte Komplexität entsteht durch zusätzliche Anti-Analyse-Techniken, die wir später in diesem Abschnitt behandeln.
Der Downloader lädt zunächst vier Dateien über HTTPS herunter: ein Köderdokument, eine legitime ausführbare Datei, ein bösartiges Modul und eine verschlüsselte Korplug-Datei. Die Kombination dieser letzten drei Komponenten zum Ausführen einer Nutzlast über DLL-Side-Loading wird manchmal als Trident (Dreizack) bezeichnet und ist eine Technik, die häufig von Mustang Panda und allgemein bei Korplug-Loadern verwendet wird. Sowohl die Serveradressen als auch die Dateipfade sind in der ausführbaren Datei des Downloaders fest codiert. Sobald alles heruntergeladen ist und das Köderdokument geöffnet wurde, um das Opfer abzulenken, verwendet der Downloader die folgende Befehlszeile, um die legitime ausführbare Datei zu starten:
cmd /c ping 8.8.8.8 -n 70&&"%temp%\<legitimate executable>"
Dieser Ping-Befehl überprüft sowohl die Internetverbindung und sorgt für eine Verzögerung (über die Option -n 70), bevor die heruntergeladene, legitime ausführbare Datei ausgeführt wird.
Der Downloader verwendet mehrere Anti-Analyse-Techniken, von denen viele auch im Loader und in der endgültigen Nutzlast verwendet werden. Im Laufe der Kampagne wurde zusätzliche Verschleierung für neuere Versionen hinzugefügt, ohne dass ansonsten ihr Ziel geändert wurde.
In frühen Versionen des Downloaders wurden Junk-Code und undurchsichtige Prädikate verwendet, um die Analyse zu verhindern, wie in Abbildung 4 dargestellt. Der Server und die Dateinamen sind aber im Klartext deutlich sichtbar.
In späteren Versionen werden die Dateien auf dem Server RC4-verschlüsselt, wobei die Base-10-String-Darstellung der Dateigröße als Schlüssel verwendet und dann hexadezimal codiert wird. Dieser Vorgang wird im folgenden Python-Snippet veranschaulicht. Die umgekehrten Operationen werden vom Downloader clientseitig ausgeführt, um die Klartextdateien wiederherzustellen. Dies geschieht wahrscheinlich, um Schutzmaßnahmen auf Netzwerkebene zu umgehen.
from Crypto.cipher import ARC4
key = "%d" % len(plaintext)
rc4 = ARC4.new(key)
cipher_content = rc4.encrypt(plaintext).hex().upper()
Diese Versionen ersetzen die Verwendung von Klartext-Strings durch verschlüsselte Stack-Strings. Sie sind immer noch fest in der Datei codiert, aber die Verschleierung, die sie umgibt, und die Verwendung unterschiedlicher Schlüssel machen es schwierig, sie statisch und automatisiert zu entschlüsseln. Dieselbe Technik wird auch in den nachfolgenden Phasen verstärkt verwendet. Verschlüsselte Stapelzeichenfolgen werden auch verwendet, um Aufrufe von Windows-API-Funktionen zu verschleiern.
Zunächst wird der Name der Zielfunktion entschlüsselt und an eine Funktion übergeben. Diese Funktion erhält einen Zeiger auf das InMemoryOrderModuleList -Feld des PEB (Process Environment Block). Anschließend durchläuft es die geladenen Module und übergibt jedes Handle zusammen mit dem Funktionsnamen an GetProcAddress, bis die Zielfunktion erfolgreich aufgelöst ist. Ein Teil dieses Prozesses ist in Abbildung 5 zu sehen.
Loader
Wie bei Korplug üblich, ist der Loader eine DLL, die eine Side-Loading-Schwachstelle in einer legitimen, signierten ausführbaren Datei ausnutzt. Wir haben beobachtet, dass viele verschiedene Anwendungen in dieser Kampagne missbraucht werden, zum Beispiel eine anfällige ausführbare SmadAV-Datei, die zuvor von Qurium in einer Mustang Panda zugeschriebenen, auf Myanmar abzielenden Kampagne gesehen wurde.
Der Loader exportiert mehrere Funktionen. Die genaue Liste variiert, je nach missbrauchter Anwendung, aber in allen Fällen tut nur eine von ihnen etwas von Bedeutung. Bei allen von uns beobachteten Loadern ist dies die exportierte Funktion mit der höchsten Ladeadresse. Alle anderen Exporte und der Einstiegspunkt der Bibliothek kehren entweder sofort zurück oder führen einen Do-Nothing-Junk-Code aus. Viele dieser Exporte haben Namen, die aus zufälligen Kleinbuchstaben bestehen und auf dieselbe Adresse verweisen, wie in Tabelle 1 gezeigt.
Tabelle 1. Von einem Hodur-Loader exportierte Funktionen. Der createSystemFontsUsingEDL-Export ist derjenige, der die letzte Malware-Stufe in dieser Version lädt.
Die Loader-Funktion ermittelt das Verzeichnis, in dem die DLL ausgeführt wird, mit GetModuleFileNameA und versucht, die darin enthaltene verschlüsselte Korplug-Datei zu öffnen. Dieser Dateiname ist im Loader fest codiert. Er liest den Inhalt der Datei in einen lokal zugewiesenen Puffer und entschlüsselt ihn. Der Loader macht diesen Puffer mithilfe von VirtualProtect ausführbar, bevor er ihn bei Offset 0x00 aufruft.
Windows-API-Funktionsaufrufe werden mit einer anderen Technik verschleiert als der, die im Downloader verwendet wird. Im Gegensatz zum Loader, der die Namen seiner Funktionen enthält (wie in Tabelle 1 oben gezeigt), sind nur die 64-Bit-Hashes der Windows-API-Funktionsaufrufe in der Binärdatei vorhanden. Um diese Funktionen aufzulösen, durchläuft der Loader die Exportlisten aller geladenen Bibliotheken über die InMemoryOrderModuleList des PEB. Der Name jedes Exports wird gehasht und dann mit dem erwarteten Wert verglichen. Der FNV-1a-Hash-Algorithmus, der kürzlich durch die Sunburst-Backdoor wieder Mainstream wurde, wurde auch zuvor von Mustang Panda in Korplug-Loadern verwendet. Wie von XORHEX dokumentiert, wird er dort verwendet, um GetProcAddress und LoadLibraryA aufzulösen, obwohl er in dieser Analyse nicht namentlich identifiziert wurde. In dieser Version wird er jedoch für alle API-Funktionen verwendet.
Korplug-Backdoor
Korplug (auch als PlugX bekannt) ist ein RAT (remote access trojan), der von mehreren APT-Gruppen verwendet wird. Obwohl er so weit verbreitet ist, oder vielleicht gerade deshalb, beschreiben nur wenige Berichte ausführlich seine Befehle und die Daten, die er exfiltriert. Seine Funktionalität ist in den verschiedenen Varianten nicht gleich, aber es scheint eine erhebliche Überschneidung in der Liste der Befehle zwischen der von uns analysierten Version und anderen Quellen, wie der Avira-Analyse vom Januar 2020 und dem plugxdecoder-Projekt auf GitHub zu geben.
Wie bereits erwähnt, weist die in dieser Kampagne verwendete Variante viele Ähnlichkeiten mit der THOR-Variante auf, weshalb wir sie Hodur genannt haben. Zu den Ähnlichkeiten gehören die Verwendung des Registrierungsschlüssels Software\CLASSES\ms-pu, das gleiche Format für die C&C-Server in der Konfiguration und die Verwendung der Static Fensterklasse.
Wie man es bei Korplug-Payloads erwartet, wird diese Stufe immer nur im Speicher des Loaders entschlüsselt. Nur die verschlüsselte Version wird in einer Datei mit der Erweiterung .dat auf die Festplatte geschrieben.
Sofern nicht anders angegeben, werden alle in diesem Abschnitt behandelten hartcodierten Zeichenfolgen als verschlüsselte Stack-Zeichenfolgen gespeichert.
In diesem Modul werden Windows-API-Funktionen durch eine Kombination der in vorherigen Phasen verwendeten Methoden verschleiert. LoadLibraryA und GetProcAddress werden über die FNV-1a-Hashing-Technik aufgelöst und Stack-Strings werden entschlüsselt und an sie übergeben, um die Zielfunktion zu erhalten.
Loading
Nach der Entschlüsselung ist die Nutzlast eine gültige DLL, die eine einzelne Funktion exportiert. In fast allen beobachteten Samples dieser Kampagne heißt diese Funktion StartProtect. Wenn Sie es jedoch direkt über diesen Export oder seinen Einstiegspunkt starten, wird die Hauptnutzlast nicht ausgeführt, und der Ladevorgang ist ziemlich kompliziert.
Wie im vorherigen Abschnitt erläutert, wird die Datei vom Ladeprogramm als fortlaufender Blob im Speicher entschlüsselt und die Ausführung beginnt bei Offset 0x00. Der PE-Header enthält Shellcode (siehe Abbildung 6), der einen bestimmten Offset aufruft, der dem einzelnen Export des Moduls entspricht.
Diese Funktion analysiert das PE-Blob im Arbeitsspeicher und ordnet es manuell als Bibliothek einem neu zugewiesenen Puffer zu. Dazu gehören das Mapping der verschiedenen Abschnitte, das Auflösen von Importen und schließlich die Verwendung von DLL_PROCESS_ATTACH zum Aufrufen des DLL-Einstiegspunkts. Auch hier werden undurchsichtige Prädikate und Junk-Code verwendet, um den Zweck dieser Funktion zu verschleiern.
Der Einstiegspunkt der ordnungsgemäß geladenen Bibliothek wird dann mit dem nicht standardmäßigen Wert von 0x04 für den fdwReason -Parameter aufgerufen (derzeit sind nur Werte von 0x00 bis 0x03 definiert). Dieser spezielle Wert ist erforderlich, damit er seine Hauptnutzlast ausführt. Diese einfache Überprüfung verhindert, dass die RAT trivialerweise direkt mit einem generischen Tool wie rundll32.exe ausgeführt wird.
Die Hintertür entschlüsselt zunächst ihre Konfiguration mit der Zeichenfolge 123456789 als sich wiederholendem XOR-Schlüssel. Nach der Entschlüsselung beginnt der Konfigurationsblock mit ########. Das Layout der Konfiguration variiert leicht zwischen den Beispielen, aber alle enthalten mindestens die folgenden Felder:
- Name des Installationsverzeichnisses. Wird auch als Name des Registrierungsschlüssels verwendet, der für die Persistenz erstellt wurde. Dieser Wert entspricht ungefähr dem Namen der missbrauchten Anwendung mit drei zufällig angehängten Buchstaben (z. B. FontEDLZeP oder AdobePhotosGQp)
- Mutex-Name
- Ein Wert, der entweder eine Versions- oder eine ID-Zeichenfolge ist
- Liste der C&C-Server. Jeder Eintrag enthält IP-Adresse, Portnummer und eine Nummer, die das mit diesem C&C zu verwendende Protokoll angibt
Die Hintertür überprüft dann den Pfad, von dem sie ausgeführt wird, mit GetModuleFileNameW. Wenn %userprofile%\<Installationsverzeichnis> oder %allusersprofile%\<Installationsverzeichnis> passt, wird die RAT-Funktionalität ausgeführt. Andernfalls wird der Installationsprozess durchlaufen.
Installation
Um sich selbst zu installieren, erstellt die Malware das oben genannte Verzeichnis unter %allusersprofile%. Mit SetFileAttributesW wird es dann als hidden und system markiert. Die gefährdete ausführbare Datei, das Lademodul und die verschlüsselten Korplug-Dateien werden in das neue Verzeichnis kopiert.
Als nächstes wird die Persistenz hergestellt. Frühere Beispiele erreichten dies, indem sie eine geplante Aufgabe erstellten, die beim Booten über schtasks.exe ausgeführt werden sollte. Neuere Beispiele fügen einen Registrierungseintrag zu Software\Microsoft\Windows\CurrentVersion\Run hinzu und versuchen zuerst die HKLM-Struktur und dann HKCU. Dieser Eintrag hat denselben Namen wie das Installationsverzeichnis, dessen Wert auf den Pfad der neu kopierten ausführbaren Datei gesetzt ist.
Sobald die Persistenz eingerichtet wurde, startet die Malware die ausführbare Datei von ihrem neuen Speicherort und wird beendet.
RAT
Die RAT-Funktionalität der Hodur-Variante dieser Kampagne stimmt größtenteils mit anderen Korplug-Varianten überein, mit einigen zusätzlichen Befehlen und Eigenschaften. Wie wir jedoch bereits gesagt haben, gibt es nur wenige detaillierte Analysen von Korplug-Befehlen, daher möchten wir eine solche Analyse in der Hoffnung bereitstellen, zukünftigen Analysten zu helfen.
In diesem Modus durchläuft die Hintertür die Liste der C&C-Server in ihrer Konfiguration, bis sie das Ende erreicht oder einen Deinstallationsbefehl erhält. Für jeden dieser Server verarbeitet sie Befehle, bis sie einen Stop-Befehl erhält oder einen Fehler feststellt.
Der anfängliche Handshake von Hodur kann über HTTPS oder TCP erfolgen. Dies wird durch einen Wert in der Konfiguration für diesen bestimmten C&C-Server bestimmt. Die nachfolgende Kommunikation erfolgt immer über TCP unter Verwendung eines benutzerdefinierten Protokolls, das wir in diesem Abschnitt zusammen mit den Befehlen, die ausgegeben werden können, beschreiben. Hodur verwendet Sockets der Windows Sockets API (Winsock), die überlappendes I/O unterstützen.
Nach dem anfänglichen Handshake umfasst die Kommunikation von Hodur TCP-Nachrichten, die aus einem Header mit der in Tabelle 2 beschriebenen Struktur bestehen, gefolgt von einem Nachrichtentext, der normalerweise mit LZNT1 komprimiert und immer mit RC4 verschlüsselt wird. Nachrichten, deren Header-Feld für die Befehlsnummer das Bit 0x10000000 gesetzt hat (solche, die Dateiinhalte, für die in Tabelle 3 beschriebenen Befehle ReadFile und WriteFile enthalten), haben verschlüsselte, aber nicht komprimierte Nachrichtenkörper. Alle verschlüsselten Nachrichtentexte verwenden den fest codierten Schlüssel sV!e@T#L$PH% mit einem vier Byte langen zufälligen Nonce (der Wert bei Offset 0x00 im Header), der daran angehängt ist.
Tabelle 2. Header-Format, das für die Kommunikation zwischen C&C und der Hintertür verwendet wird
Offset | Field | Description |
---|---|---|
0x00 | Nonce | Random nonce appended to the RC4 key. |
0x04 | Command number | This field indicates the command to run or the command that caused this response to be sent. |
0x08 | Length of body | Length of the message body. It seems that this field isn’t checked by the client for messages from the C&C server. |
0x0C | Command exit status | The return or error value of the command that was run. This field is not checked by the client in messages received from the C&C server. |
Die C&C-Nachrichtenheader von Hodur werden unverschlüsselt übertragen, gefolgt von Nachrichtenkörpern unterschiedlicher Größe (der Wert bei Offset 0x08 des Headers). Das Format des Nachrichtentexts variiert je nach Befehl, aber nach der Entschlüsselung und Dekomprimierung befinden sich Werte variabler Länge (wie Zeichenfolgen) immer am Ende eines Nachrichtentexts, und ihr Offset im Text wird als Ganzzahl im entsprechenden Nachrichtenfeld gespeichert.
Hodur hat, wie die von Avira beschriebene Version zwei Befehlsgruppen – 0x1001 und 0x1002 – mit jeweils eigenem Handler. Der C&C-Server kann festlegen, auf welche Gruppe er lauschen soll, indem er die entsprechende ID als Befehlsnummer sendet, wenn sich ein Client nicht bereits in einem der beiden Modi befindet. Er hört weiter auf dieselbe Gruppe, bis es den Stop-Befehl erhält oder ein Fehler auftritt (einschließlich des Empfangs einer Nachricht mit einer ungültigen Befehlsnummer im Header).
Die erste Gruppe, 0x1001, enthält Befehle zur Verwaltung der Ausführung der Hintertür und zur ersten Erkundung eines neu kompromittierten Hosts. Da diese Befehle keine Argumente annehmen, bestehen die vom C&C-Server gesendeten Nachrichten nur aus den Headern. Tabelle 3 enthält eine Liste dieser Befehle. Der GetSystemInfo-Befehl wird unten ausführlicher beschrieben. Beachten Sie, dass in der RAT keine Befehlsnamen vorhanden sind; sie wurden entweder früheren Analysen entnommen oder von uns zur Verfügung gestellt.
Tabelle 3. Befehle in Gruppe 0x1001
ID | Name | Description | Data in client response |
---|---|---|---|
0x1000 | Ping | Sent by the client when it starts listening for commands from this group. | Between 0 and 64 random bytes |
0x1001 | GetSystemInfo | Get information about the system. | See Table 4 |
0x1002 | ListenThread | Start a new thread that listens for group 0x1002 commands. | None |
0x1004 | ResetConnection | Terminate with WSAECONNRESET. | N/A |
0x1005 | Uninstall | Delete persistence registry keys, remove itself and created folders. | None |
0x1007 | Stop | Set registry key System\CurrentControlSet\Control\Network\allow to 1 and exit. | N/A |
Der Befehl „GetSystemInfo“ sammelt umfangreiche Informationen über das System, wie in Tabelle 4 aufgeführt. Falls noch nicht vorhanden, wird der Registrierungsschlüssel „Software\CLASSES\ms-pu\CLSID“ auf den aktuellen Zeitstempel gesetzt, wobei zuerst HKLM und dann HKCUversucht wird. Der Wert dieses Schlüssels wird dann in der Antwort gesendet.
Tabelle 4. Format des Antworttexts für die GetSystemInfo-Antwort
Offset | Value | Offset | Value |
---|---|---|---|
0x00 | Magic bytes 0x20190301 | 0x38 | Suite mask |
0x04 | Client IP address of the C&C socket | 0x3A | Product type |
0x08 | Server IP address of the C&C socket | 0x3C | 0x01 if the process is running as WOW64 |
0x0C | RAM in KB | 0x40 | System time – year |
0x10 | CPU clock rate in MHz | 0x42 | System time – month |
0x14 | Display width in pixels | 0x44 | Timestamp of first run (offset) |
0x18 | Display height in pixels | 0x46 | Service pack version string (offset) |
0x1C | Default locale | 0x48 | Unknown |
0x20 | Current tick count | 0x4A | Username (offset) |
0x24 | OS major version | 0x4C | Computer name (offset) |
0x28 | OS minor version | 0x4E | Mutex name (offset) |
0x2C | OS build number | 0x50 | Unknown |
0x30 | OS platform ID | 0x52 | List of machine IP addresses (offset) |
0x34 | Service pack major version | 0x54 | Always two 0x00 bytes |
0x36 | Service pack minor version |
Die 0x1002-Gruppe enthält Befehle, die RAT-Funktionalität bereitstellen, wie in Tabelle 5 beschrieben. Einige davon nehmen Parameter entgegen, die im Nachrichtentext des Befehls bereitgestellt werden. Die fett gedruckten werden weiter unten ausführlicher beschrieben. Beachten Sie erneut, dass im RAT keine Befehlsnamen vorhanden sind. Sie wurden entweder früheren Analysen entnommen oder von uns zur Verfügung gestellt.
ID | Name | Description | Data in C&C request | Data in client response |
---|---|---|---|---|
0x1002 | Ping | Sent by the client when it starts listening for commands from this group. | N/A | None |
0x3000 | ListDrives | List all mapped drives (A: to Z:) and their properties.
All 26 entries are sent back in one message body. Drives that aren’t present have all fields set to 0x00. |
None |
|
0x3001 | ListDirectory | List the contents of the specified directory. The client sends one response message per entry. | Directory path |
|
0x3002 | #rowspan# | Sent by the client when it has finished executing the ListDirectory command. | N/A | None |
0x3004 | ReadFile | Read a file in chunks of 0x4000 bytes. |
|
|
0x10003005 | #rowspan# | Chunk of read file data. | N/A | Read data |
0x10003006 | #rowspan# | Sent by the client when it has finished executing the ReadFile command. | N/A | None |
0x3007 | WriteFile | Write to a file and restore previous timestamp.
Creates parent directories if they don’t exist. |
|
None |
0x10003008 | #rowspan# | Sent by the server with data to write to the file. | Data to write | N/A |
0x10003009 | #rowspan# | Sent by the server when the WriteFile operation is complete. | None | N/A |
0x300A | CreateDirectory | Create a directory. | Directory path | None |
0x300B | CanReadFile | Try to open a file with read permissions. | File path | None |
0x300C | DesktopExecute | Execute a command on a hidden desktop. | Command line to execute | PROCESS_INFORMATION structure for the created process. |
0x300D | FileOperation | Perform a file operation using SHFileOperation. |
|
None |
0x300E | GetEnvValue | Get the value of an environment variable. | Environment variable | Environment variable value. |
0x300F | CreateProgramDataDir | Creates the directory %SYSTEM%\ProgramData, optionally with a subdirectory. | Subdirectory relative path (optional) | None |
0x3102 | FindFiles | Recursively search a directory for files matching a given pattern. |
|
See response body format in Table 6. |
0x7002 | RemoteShell | Start an interactive remote cmd.exe session. | None | None |
0x7003 | #rowspan# | Result of the last command run. | N/A | Command output |
FindFiles-Befehl
Ausgehend vom angegebenen Verzeichnis sucht dieser Befehl nach Dateien, deren Namen dem vorgegebenen Muster entsprechen. Dieses Muster unterstützt dieselben Platzhalterzeichen wie die Windows FindFirstFile-API. Für jede übereinstimmende Datei sendet der Client eine Antwortnachricht mit ihrem Hauptteil in dem in Tabelle 6 beschriebenen Format.
Tabelle 6. Format des Antworthauptteils für den FindFiles-Befehl
Offset | Value | Offset | Value |
---|---|---|---|
0x00 | File attributes | 0x24 | Folder path (offset) |
0x04 | File size in bytes | 0x26 | Filename (offset) |
0x0C | Creation time | 0x28 | 8.3 filename (offset) |
0x1C | Last write time |
Sobald die Suche abgeschlossen ist, wird eine Antwortnachricht mit leerem Text gesendet.
Fazit
Die in dieser Kampagne verwendeten Lockvogel-Dateien zeigen einmal mehr, wie schnell Mustang Panda auf das Weltgeschehen reagieren kann. Beispielsweise wurde eine EU-Verordnung zu COVID-19 nur zwei Wochen nach ihrem Erscheinen als Lockvogel-Datei verwendet, und Dokumente über den Krieg in der Ukraine wurden in den Tagen nach Beginn der Invasion verwendet. Außerdem demonstriert die Gruppe auch die Fähigkeit, ihre Tools iterativ zu verbessern, wie bei der charakteristischen Verwendung von Trident-Downloadern zur Bereitstellung von Korplug.
IoCs
SHA-1 | Filename | ESET detection name | Description |
---|---|---|---|
69AB6B9906F8DCE03B43BEBB7A07189A69DC507B | coreclr.dll | Win32/Agent.ADMW | Korplug loader. |
10AE4784D0FFBC9CD5FD85B150830AEA3334A1DE | N/A | Win32/Korplug.TC | Decrypted Korplug (dumped from memory). |
69AB6B9906F8DCE03B43BEBB7A07189A69DC507B | coreclr.dll | Win32/Agent.ADMW | Korplug loader. |
4EBFC035179CD72D323F0AB357537C094A276E6D | PowerDVD18.exe | Win32/Delf.UTN | Korplug loader. |
FDBB16B8BA7724659BAB5B2E1385CFD476F10607 | N/A | Win32/Korplug.TB | Decrypted Korplug (dumped from memory). |
7E059258CF963B95BDE479D1C374A4C300624986 | N/A | Win32/Korplug.TC | Decrypted Korplug (dumped from memory). |
7992729769760ECAB37F2AA32DE4E61E77828547 | SHELLSEL.ocx | Win32/Agent.ADMW | Korplug loader. |
F05E89D031D051159778A79D81685B62AFF4E3F9 | SymHp.exe | Win32/Delf.UTN | Korplug loader. |
AB01E099872A094DC779890171A11764DE8B4360 | BoomerangLib.dll | Win32/Korplug.TH | Korplug loader. |
CDB15B1ED97985D944F883AF05483990E02A49F7 | PotPlayer.dll | Win32/Agent.ADYO | Korplug loader. |
908F55D21CCC2E14D4FF65A7A38E26593A0D9A70 | SmadHook32.dll | Win32/Agent.ADMW | Korplug loader. |
477A1CE31353E8C26A8F4E02C1D378295B302C9E | N/A | Win32/Agent.ADMW | Korplug loader. |
52288C2CDB5926ECC970B2166943C9D4453F5E92 | SmadHook32c.dll | Win32/Agent.ADMW | Korplug loader. |
CBD875EE456C84F9E87EC392750D69A75FB6B23A | SHELLSEL.ocx | Win32/Agent.ADMW | Korplug loader. |
2CF4BAFE062D38FAF4772A7D1067B80339C2CE82 | Adobe_Caps.dll | Win32/Agent.ADMW | Korplug loader. |
97C92ADD7145CF9386ABD5527A8BCD6FABF9A148 | DocConvDll.dll | Win32/Agent.ADYO | Korplug loader. |
39863CECA1B0F54F5C063B3015B776CDB05971F3 | N/A | Win32/Korplug.TD | Decrypted Korplug (dumped from memory). |
0D5348B5C9A66C743615E819AEF152FB5B0DAB97 | FontEDL.exe | clean | Vulnerable legitimate Font File Generator executable. |
C8F5825499315EAF4B5046FF79AC9553E71AD1C0 | Silverlight.Configuration.exe | clean | Vulnerable legitimate Microsoft Silverlight Configuration Utility executable. |
D4FFE4A4F2BD2C19FF26139800C18339087E39CD | PowerDVDLP.exe | clean | Vulnerable legitimate PowerDVD executable. |
65898ACA030DCEFDA7C970D3A311E8EA7FFC844A | Symantec.exe | clean | Vulnerable legitimate Symantec AntiVirus executable. |
7DDB61872830F4A0E6BF96FAF665337D01F164FC | Adobe Stock Photos CS3.exe | clean | Vulnerable legitimate Adobe Stock Photos executable. |
C13D0D669365DFAFF9C472E615A611E058EBF596 | COVID-19 travel restrictions EU reviews list of third countries.exe | Win32/Agent_AGen.NJ | Downloader. |
062473912692F7A3FAB8485101D4FCF6D704ED23 | REGULATION OF THE EUROPEAN PARLIAMENT AND OF THE COUNCIL.exe | Win32/TrojanDownloader.Agent.GDL | Downloader. |
2B5D6BB5188895DA4928DD310C7C897F51AAA050 | log.dll | Win32/Agent.ACYW | Korplug loader. |
511DA645A7282FB84FF18C33398E67D7661FD663 | 2.exe | Win32/Agent.ADPL | Korplug loader. |
59002E1A58065D7248CD9D7DD62C3F865813EEE6 | log.dll | Win32/Agent.ADXE | Korplug loader. |
F67C553678B7857D1BBC488040EA90E6C52946B3 | KINGSTON.exe | Win32/Agent.ADXZ | Korplug Loader. |
58B6B5FD3F2BFD182622F547A93222A4AFDF4E76 | PotPlayer.exe | clean | Vulnerable legitimate executable. |
Network
Domain | IP | First seen | Notes |
---|---|---|---|
103.56.53[.]120 | 2021‑06‑15 | Korplug C&C | |
154.204.27[.]181 | 2020‑10‑05 | Korplug C&C. | |
43.254.218[.]42 | 2021‑02‑09 | Download server. | |
45.131.179[.]179 | 2020‑10‑05 | Korplug C&C. | |
176.113.69[.]91 | 2021-04-19 | Korplug C&C. | |
upespr[.]com | 45.154.14[.]235 | 2022-01-17 | Download server. |
urmsec[.]com | 156.226.173[.]23 | 2022‑02‑23 | Download server. |
101.36.125[.]203 | 2021-06-01 | Korplug C&C. | |
185.207.153[.]208 | 2022‑02‑03 | Download server. | |
154.204.27[.]130 | 2021-12-14 | Korplug C&C. | |
92.118.188[.]78 | 2022-01-27 | Korplug C&C. | |
zyber-i[.]com | 107.178.71[.]211 | 2022-03-01 | Download server. |
locvnpt[.]com | 103.79.120[.]66 | 2021-05-21 | Download server. This domain was previously used in a 2020 campaign documented by Recorded Future. |
MITRE ATT&CK techniques
This table was built using version 10 of the MITRE ATT&CK framework.
Tactic | ID | Name | Description |
---|---|---|---|
Resource Development | T1583.001 | Acquire Infrastructure: Domains | Mustang Panda has registered domains for use as download servers. |
T1583.003 | Acquire Infrastructure: Virtual Private Server | Some download servers used by Mustang Panda appear to be on shared hosting. | |
T1583.004 | Acquire Infrastructure: Server | Mustang Panda uses servers that appear to be exclusive to the group. | |
T1587.001 | Develop Capabilities: Malware | Mustang Panda has developed custom loader and Korplug versions. | |
T1588.006 | Obtain Capabilities: Vulnerabilities | Multiple DLL hijacking vulnerabilities are used in the deployment process. | |
T1608.001 | Stage Capabilities: Upload Malware | Malicious payloads are hosted on the download servers. | |
Execution | T1059.003 | Command and Scripting Interpreter: Windows Command Shell | Windows command shell is used to execute commands sent by the C&C server. |
T1106 | Native API | Mustang Panda uses CreateProcess and ShellExecute for execution. | |
T1129 | Shared Modules | Mustang Panda uses LoadLibrary to load additional DLLs at runtime. The loader and RAT are DLLs. | |
T1204.002 | User Execution: Malicious File | Mustang Panda relies on the user executing the initial downloader. | |
T1574.002 | Hijack Execution Flow: DLL Side-Loading | The downloader obtains and launches a vulnerable application so it loads and executes the malicious DLL that contains the second stage. | |
Persistence | T1547.001 | Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder | Korplug can persist via registry Run keys. |
T1053.005 | Scheduled Task/Job: Scheduled Task | Korplug can persist by creating a scheduled task that runs on startup. | |
Defense Evasion | T1140 | Deobfuscate/Decode Files or Information | The Korplug file is encrypted and only decrypted at runtime, and its configuration data is encrypted with XOR. |
T1564.001 | Hide Artifacts: Hidden Files and Directories | Directories created during the installation process are set as hidden system directories. | |
T1564.003 | Hide Artifacts: Hidden Window | Korplug can run commands on a hidden desktop. Multiple hidden windows are used during the deployment process. | |
T1070 | Indicator Removal on Host | Korplug’s uninstall command deletes registry keys that store data and provide persistence. | |
T1070.004 | Indicator Removal on Host: File Deletion | Korplug can remove itself and all created directories. | |
T1070.006 | Indicator Removal on Host: Timestomp | When writing to a file, Korplug sets the file’s timestamps to their previous values. | |
T1036.004 | Masquerading: Masquerade Task or Service | Scheduled tasks created for persistence use legitimate-looking names. | |
T1036.005 | Masquerading: Match Legitimate Name or Location | File and directory names match expected values for the legitimate app that is abused by the loader. | |
T1112 | Modify Registry | Korplug can create, modify, and remove registry keys. | |
T1027 | Obfuscated Files or Information | Some downloaded files are encrypted and stored as hexadecimal strings. | |
T1027.005 | Obfuscated Files or Information: Indicator Removal from Tools | Imports are hidden by dynamic resolution of API function names. | |
T1055.001 | Process Injection: Dynamic-link Library Injection | Some versions of the Korplug loader inject the Korplug DLL into a newly launched process. | |
T1620 | Reflective Code Loading | Korplug parses and loads itself into memory. | |
Discovery | T1083 | File and Directory Discovery | Korplug can list files and directories along with their attributes and content. |
T1082 | System Information Discovery | Korplug collects extensive information about the system including uptime, Windows version, CPU clock rate, amount of RAM and display resolution. | |
T1614 | System Location Discovery | Korplug retrieves the system locale using GetSystemDefaultLCID. | |
T1016 | System Network Configuration Discovery | Korplug collects the system hostname and IP addresses. | |
T1016.001 | System Network Configuration Discovery: Internet Connection Discovery | The downloader pings Google’s DNS server to check internet connectivity. | |
T1033 | System Owner/User Discovery | Korplug obtains the current user’s username. | |
T1124 | System Time Discovery | Korplug uses GetSystemTime to retrieve the current system time. | |
Collection | T1005 | Data from Local System | Korplug collects extensive data about the system it’s running on. |
T1025 | Data from Removable Media | Korplug can collect metadata and content from all mapped drives. | |
T1039 | Data from Network Shared Drive | Korplug can collect metadata and content from all mapped drives. | |
Command and Control | T1071.001 | Application Layer Protocol: Web Protocols | Korplug can make the initial handshake over HTTPS. |
T1095 | Non-Application Layer Protocol | C&C communication is done over a custom TCP-based protocol. | |
T1573.001 | Encrypted Channel: Symmetric Cryptography | C&C communication is encrypted using RC4. | |
T1008 | Fallback Channels | The Korplug configuration contains fallback C&C servers. | |
T1105 | Ingress Tool Transfer | Korplug can download additional files from the C&C server. | |
T1571 | Non-Standard Port | When Hodur performs its initial handshake over HTTPS, it uses the same port (specified in the configuration) as for the rest of the communication. | |
T1132.001 | Data Encoding: Standard Encoding | Korplug compresses transferred data using LZNT1. | |
Exfiltration | T1041 | Exfiltration Over C2 Channel | Data exfiltration is done via the same custom protocol used to send and receive commands. |