Es gibt Neuigkeiten von Sednit. Den Sommer haben sie damit verbracht, neue Komponenten für die Zebrocy Malware-Familie zu entwickeln.

Die Sednit-Gang – auch bekannt als APT28, Fancy Bear, Sofacy oder Strontium – ist seit ca. 2004 aktiv. In den vergangenen Jahren schafften sie es immer wieder in die Schlagzeilen.

Am 20. August 2019 startete die Gruppe eine neue Malware-Kampagne, die sich gegen Botschaften und Außenministerien in osteuropäischen und zentralasiatischen Ländern richtete.

Die neue Malware-Kampagne begann mit einer Phishing-E-Mail, die einen schädlichen Anhang enthielt. Das Öffnen des Anhangs führte zu einer Verkettung von Malware-Downloadern. Am Ende lud sich das Phishing-Opfer eine Backdoor auf den Computer. Ein Sample solch einer schädlichen E-Mail wurde am 22. August 2019 auf VirusTotal hochgeladen – zwei Tage nach dem Streuen der Schad-E-Mail. Telsy TRT veröffentlichte vor Kurzem einen Überblick über den Angriffsvektor.

Wir haben jedoch einige weitere Puzzleteile, die dazu beitragen, ein vollständigeres Bild der Malware-Kampagne zu zeichnen.

Wie von anderen Forscherkollegen prophezeit, benutzt die Sednit-Gang für ihre Malware-Tools – genauer gesagt für die Downloader – eine weitere Programmiersprache. Es handelt sich dabei um Nim. Mit gleichem Eifer verbesserten die Sednit-Entwickler aber auch einen ihrer Downloader, der nun in Golang geschrieben ist – genau wie die Backdoor.

Die verkomplizierte Kompromittierung

Abbildung 1 zeigt die verschiedenen Schritte, die letztendlich zur Kompromittierung des ausgewählten Opfers führen. Alles beginnt mit der schädlichen E-Mail und endet mit der Backdoor, über die die Cyberkriminellen unterschiedliche Manipulationsmöglichkeiten erhalten.

Abbildung 1: Übersicht über die Verkettung innerhalb der Kompromittierung

Abbildung 1: Übersicht über die Verkettung innerhalb der Kompromittierung

Die Kompromittierung mit Komponenten aus der Zebrocy Malware-Familie verläuft nicht gerade „lautlos“. Nach obigem Beispiel landen mindestens sechs schädliche Dokumente auf dem Rechner des Opfers, bevor die endgültige Payload zum Tragen kommt. Bei all den unterschiedlichen Aktivitäten könnten Antivirus-Programme an irgendeiner Stelle Alarm schlagen.

Das an die Phishing-E-Mail angehängte Dokument ist leer, verweist jedoch auf die Remote-Vorlage wordData.dotm, die bei Dropbox gehostet wird. Wer das Dokument in Word öffnet, lädt wordData.dotm herunter (siehe Abbildung 2). Es wird außerdem in die Arbeitsumgebung des zugehörigen Dokuments integriert, einschließlich aller aktiven Inhalte, die die Vorlage möglicherweise enthält.

Abbildung 2: Leeres Worddokument lädt eine vermeintliche Word-Vorlage herunter.

Abbildung 2: Leeres Worddokument lädt eine vermeintliche Word-Vorlage herunter.

Die wordData.dotm-Datei enthält schädliche Makros, die ausgeführt werden. Bei neueren Windows-Versionen sind Makros standardmäßig deaktiviert. Der User muss der Aktivierung aktiv zustimmen. In der wordData.dotm-Datei ist außerdem ein schädliches ZIP-Archiv, dass die Makros ausliefert und extrahiert.

Wie in Abbildung 1 dargestellt, öffnen die Makros in wordData.dotm ein anderes Dokument (lmss.doc, das aus dem aus wordData.dotm extrahierten Archiv entpackt wurde). Makros in lmss.doc führen zu lmss.exe (Zebrocys neuer Nim-Downloader, der ebenfalls aus dem in wordData.dotm eingebetteten Archiv extrahiert wurde), anstatt wordData.dotm, der den Downloader direkt ausführt.

Wichtig ist, dass lmss.doc (enthält VBA-Code – via Nim-Downloader ausgeführt) auch eine Base64-codierte .EXE enthält. Laut der Dokumenteigenschaften wurde lmss.doc im Januar 2019 erstellt und am 20. August einige Stunden vor Beginn der Kampagne geändert.

Abbildung 3: Erstellungs- und Änderungsdatum von lmss.doc

Abbildung 3: Erstellungs- und Änderungsdatum von lmss.doc

Die in lmss.doc eingebettete .EXE ist ein AutoIt downloader (SHA-1: 6b300486d17d07a02365d32b673cd6638bd384f3). Dieser wurde in der Vergangenheit für eine Kampagne verwendet, die zur Erstellungszeit von lmss.doc lief. In unserem Fall wurde der AutoIt-Downloader ignoriert. Allein die Dateigröße stieg dadurch an. Wahrscheinlich vergaßen die Sednit-Entwickler den Downloader zu entfernen. Solche kleinen Fehler unterlaufen der Cybergang immer wieder.

Die Sednit-Downloader

Die Sednit-Betreiber verwenden unterschiedliche Downloader, die in verschieden Programmiersprachen geschrieben sind. In dieser Kampagne kommt eine noch relativ junge Sprache zum Einsatz. Es handelt sich um Nim.

Der Downloader ist eine einfache Binary, und zum Herunterladen und Ausführen von Dateien gedacht. Zwei kleine Details stechen heraus. Beim ersten handelt es sich wahrscheinlich um einen Anti-Sandbox-Trick. Es wird überprüft, ob sich der erste Buchstabe (l bzw, 0x6c in Hex) verändert.

Abbildung 4: Filename Check

Abbildung 4: Filename Check

Das zweite Detail ist eine Art Verschleierung, bei der die Entwickler „Platzhalterbuchstaben“ in einer Zeichenfolge an definierten Offsets durch die richtigen ersetzten. Wie in Abbildung 5 dargestellt, rekonstruiert der Downloader mit dieser Methode die korrekte Download-URL-Zeichenfolge, um statischen Analysetools zu entgehen, welche die URL-Zeichenfolge im Code ansonsten aufspüren könnten.

Abbildung 5: Hex-Rays Output der Strings-Deobfuscation

Abbildung 5: Hex-Rays Output der Strings-Deobfuscation

Beispielsweise wird die Zeichenfolge o-ps-c..ll mit drei Offsets von s, v und d "gepatcht", um ospsvc.dll zu erhalten. Die URL wird von Tools, die nach http:// suchen, nicht abgefangen, da der Anfang der Zeichenfolge im Downloader h@@p:// lautet.

Der Nim-Downloader ruft seine DLL-Payload (ospsvc.dll) in C:\ProgramData\Java\Oracle\ ab und führt sie als Dienst über regsvr32 /s aus. ospsvc.dll ist ein in Golang geschriebener Downloader, der sich gegenüber anderen Sednit-Downloadern der Vergangenheit unterscheidet.

Die früheren Golang-Downloader von Sednit wurden bereits von anderen Forschenden ausführlich beschrieben[1] [2] [3]. Anscheinend schrieben die Sednit-Entwickler ihren früheren Delphi-Downloader in Golang um. Frühere Downloader sammelten viele Informationen über den Computer des Opfers, um sie an einen C&C-Server zu senden. Die neue Malware ist jedoch in Bezug auf solch eine Datenerfassungsfunktionen ein echtes Leichtgewicht, wie im Folgenden beschrieben wird.

Die Funktion main_init() enthält Bibliotheken, die initialisiert sind und aufgrund ihrer Namen keine weiteren Erläuterungen benötigen (weitere Informationen unter vkremez.com).

Abbildung 6: Hex-Rays Output von initialisierten Funktionen in main_init() mit dem IDAGolangHelper-Plugin

Abbildung 6: Hex-Rays Output von initialisierten Funktionen in main_init() mit dem IDAGolangHelper-Plugin

Da die DLL über den Nim-Downloader als Service ausgeführt wird, müssen wir das Augenmerk auf main_DllRegisterServer() anstelle von main_main() legen. Die Zeichenfolgen und der Schlüssel sind gestackt und können mit einer simplen XOR-Schleife entschlüsselt werden. Diese einfache Verschlüsselung ist sehr effizient gegen Tools, die Zeichenfolgen aus Binärdateien extrahieren.

Abbildung 7: IDA Pro Output der gestackten, verschlüsselten Strings

Abbildung 7: IDA Pro Output der gestackten, verschlüsselten Strings

Die Hauptfunktionen der Malware sind das Herunterladen weiterer Malware, das Aufnehmen und Übersenden von Desktop-Screenshots des Opfer-PCs und die Ausführung der vom C&C-Server empfangenen Befehle.

In den ersten Minuten der Ausführung des Downloaders werden alle 35 Sekunden Screenshots erstellt und anschließend in Base64-codierter Form an der C&C-Server geschickt. Der Server erhält ebenfalls den Hostname und die %USERPROFILE%-Ordnernamen in codierter Form. Die Antwort vom C&C-Server gestaltet sich recht unkompliziert: Es handelt sich um eine Verkettung von Base64-codierten Zeichenfolgen, die durch "|" getrennt sind:

<spaces>|<cmd to execute>|<name of the binary to drop>|<binary to drop>

Laut ESET-Telemetriedaten wurden mit diesem Downloader drei verschiedene Malware-Komponenten ausgeführt. Die erste ist ein Dumper, der bereits in einem früheren Zebrocy-Artikel beschrieben wurde. Die zweite ist die übliche Delphi-Backdoor, die ebenfalls als Dienst über denselben Befehl ausgeführt wird, den der Nim-Downloader verwendet. Neu ist die Dritte – eine Backdoor, die heruntergeladen und auf dem Computer des Opfers ausgeführt wird, wie im nächsten Abschnitt beschrieben.

Die neue Zebrocy-Backdoor

Analyse

Die neue Zebrocy-Backdoor ist nicht wie gewohnt in Delphi, sondern in Golang geschrieben. Unseres Wissens tauchte die Hintertür in dieser Kampagne das aller erste Mal überhaupt in „freier Wildbahn“ auf. Sie besitzt viele Ähnlichkeiten zur alten, in Delphi geschriebenen Backdoor.

Durch nochmaliges Betrachten des Bibliotheksinitialisierungscodes der main_init()-Funktion (Abbildung 8) konnten neue Einträge gefunden werden. Neu hinzugefügt wurden ein AES-Algorithmus, eine Hex-Codierung und die Screenshot-Funktion.

Abbildung 8: Unterschiede zwischen der Backdoor- und der Downloader-Funktion, die in main_init() initialisiert wurden.

Abbildung 8: Unterschiede zwischen der Backdoor- und der Downloader-Funktion, die in main_init() initialisiert wurden.

Es fällt auf, dass image_png_init() die image_jpeg_init()-Funktion für Screenshot-Aufnahmen ersetzt. Bilder im JPG-Format sind normalerweise kleiner als das PNG-Format, dafür kann man auf PNGs die Schrift besser lesen.

Die Hintertür wird mit einem Argument (hexadezimal codierte Zeichenfolge). Alle bis auf den letzten Sechs-Byte-Block dieser Zeichenfolge sind XOR-verschlüsselt, wobei der Schlüssel in den letzten sechs Byte der Zeichenfolge gespeichert ist. Das folgende Python-Snippet stellt die Entschlüsselungslogik dar.

key = arg[-6:].decode('hex')
enc = arg[:-6].decode('hex')
''.join(chr(ord(i) ^ ord(j)) for i, j in zip(itertools.cycle(key), enc))

Es ist die Adresse des C&C-Servers, der später verschlüsselt auf der Festplatte gespeichert wird. Die Verschlüsselung erfolgt mithilfe des AES-128-ECB-Algorithmus mit einem aus dem Hostname generierten Schlüssel. Aus diesem Grund gibt es keine Möglichkeit, die C&C-Server-Adresse allein aus der Binary zu exzerpieren. Keiner der Downloader definiert eine Persistenz für die Backdoor, wie man es in der Vergangenheit von Sednit gesehen hat.

Diese neue Backdoor bietet verschiedene Funktionen, die man bereits von der in Delphi geschriebenen Hintertür von Zebrocy kennt:

  • Datei-Manipulation (Erstellen, Ändern und Löschen von Dateien)
  • Aufnehmen von Screenshots
  • Auflisten von Laufwerken
  • Befehlsausführung (via exe)
  • Aufgabenplanung unter Windows\Software\OSDebug (Malware-Operatoren können die Persistenz manuell einstellen)

Wie schon bei der Delphi-Backdoor gibt es nur einen sehr begrenzten Befehlssatz. Die Möglichkeit, beliebige Befehle über cmd.exe auszuführen, lässt Spielraum für weitere Funktionen (nachträgliche Persistenz, ausgiebiges Datensammeln). Eine weitere Ähnlichkeit ist die dreistellige Versionsnummer (im Format x.y.z); Die aktuelle Hauptversion lautet 4.y.z.

Das Netzwerkprotokoll

Das Netzwerkprotokoll weist einige Ähnlichkeiten zur Delphi-Version auf. Bei der ersten Interaktion mit dem C&C-Server wird ein AES-32-Bit-Schlüssel abgerufen, um die zukünftige Kommunikation zu verschlüsseln. Eine Paketerfassung lieferte folgende Ergebnisse:

POST [REDACTED URI] HTTP/1.1
Host: [REDACTED IP]
User-Agent: Go-http-client/1.1
Content-Length: 297
Content-Type: multipart/form-data; boundary=b116f1e0a94eff1bb406531e74bb0feba65687cf90ec8a64fc409f230fbd
Accept-Encoding: gzip

--b116f1e0a94eff1bb406531e74bb0feba65687cf90ec8a64fc409f230fbd
Content-Disposition: form-data; name="filename";
filename="[REDACTED]"
Content-Type: application/octet-stream

1
--b116f1e0a94eff1bb406531e74bb0feba65687cf90ec8a64fc409f230fbd--

Diejenigen mit Sednit-Erfahrung glauben möglicherweise, dass Content-Disposition und boundary ähnlich erscheinen. Diese wurden bereits vorher vom Delphi-Backdoor im Netzwerkprotokoll verwendet. Zum Einsatz kommt der AES-Algorithmus, um den Pseudo-Body zu verschlüsseln (Inhalt nach Content-Type). Man beachte, dass selbst wenn Content-Disposition und die zweite Instanz von Content-Type echte HTTP-Header sind, hier im HTTP-Message-Body verwendet werden. Das boundary-Feld wird für jeden Austausch zufällig ausgewählt und das filename-Feld im Pseudo Content-Disposition-Header kann mit dem folgenden Python-Snippet entschlüsselt werden:

len_filename = len(filename)
len_key = 14
xor_key = filename[-len_key:].decode('hex')
filename = filename[:len_filename-len_key].decode('hex')
val_filename = ''.join(chr(ord(i)^ord(j)) for i,j in zip(itertools.cycle(xor_key),filename))
random_int = val_filename[-4:]

was zur folgenden Zeichenfolge führt:

757365722D504318162020190821151055207C.inc

Diese Zeichenfolge kann wie folgt verstanden werden:

Username: 757365722D5043
SID*: 181620
Date: 20190821151055
Random: 207C.inc

* 6 bytes comes from the current user’s Security Identifiers (SID) S-1-5-21‑xxxxxxxxx‑yyyyyyyyyy‑zzzzzzzzzz‑1000

Weitere Interaktionen mit dem C&C-Server folgen diesem Muster, mit der Ausnahme, dass der Pseudo-Body, der gleich eins im obigen Beispiel ist, durch die Ausgabe des vom C&C-Server angeforderten Befehls ersetzt wird. Der gesamte Message-Body wird ebenfalls unter Verwendung des zuvor verwendeten AES-Algorithmus, mit dem beim ersten Austausch bereitgestellten Schlüssel verschlüsselt.

Fazit

Neuer Downloader und neue Backdoor – die Sednit-Gang bleibt aktiv und aktualisiert fortlaufend ihr Cyberwaffen-Arsenal. Eine echte Neuerung gibt es insgesamt aber nicht, da sie lediglich ihren originären Code in andere Programmiersprachen übersetzen. Wahrscheinlich versuchen sie dadurch verschiedenen Erkennungsroutinen zu entkommen. Möglicherweise ist das auch einfacher als die gesamten TTPs verändern zu müssen. Der initiale Kompromittierungsvektor bleibt unverändert. Allerdings greifen die Cyberkriminellen nun auf einen Cloud-Anbieter wie Dropbox zurück, um eine Remote-Vorlage herunterzuladen. Das ist recht ungewöhnlich für Sednit.

ESET rät zu Vorsicht bei Anhängen in E-Mails von unbekannten Absender-E-Mail-Adressen.

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

Indicators of Compromise (IoCs)

Hashes (SHA-1) Filenames ESET detection names
c613fcccb380f7e3ce157c4f620efca503c1bad3 - (eml file) DOC/TrojanDownloader.Agent.AMY
6f281b30d8d6a9bc1dbe2fe73995aac382c4a543 612243236.docx DOC/TrojanDownloader.Agent.AMY
f3f945fb22916f82cb7407cde2a80a68cd83b074 wordData.dotm VBA/TrojanDropper.Agent.AIP
a56af5b44624e8ada60057fd7f39af5b3de10724 lmss.zip Win32/TrojanDownloader.Sednit.BK
b8ac400e1deb6e90fa4e2adb150c511c98bafc6e lmss.doc VBA/TrojanDropper.Agent.AIQ
f0793e02180f3ccf48e41bd67ec1161d93f07e01 lmss.exe Win32/TrojanDownloader.Sednit.BK
04303024ff453f918925d7160abbd199f137a442 ospsvc.dll Win32/Sednit.DI
c96db85ece2b57a9e82ba36b5f31ca9d2051a6f0 osppsvc.exe Win32/Sednit.DJ

Network

https://www.dropbox[.]com/s/foughx315flj51u/wordData.dotm?dl=1

185.221.202[.]35

MITRE ATT&CK techniques

Tactic ID Name Description
Initial Access T1193 Spearphishing Attachment Zebrocy is using spearphishing emails with an attachment as method of compromise.
Execution T1059 Command-Line Interface The Golang backdoor uses cmd.exe to execute commands.
T1117 Regsvr32 The Nim downloader uses regsvr32.exe to launch the Golang downloader.
T1053 Scheduled Task The Golang backdoor can create a pre-defined scheduled task.
T1064 Scripting The remote template contains VBA used to execute the next stage of the malware.
T1204 User Execution Zebrocy attempts to get users to click on Microsoft Office attachments containing malicious macro scripts.
Persistence T1053 Scheduled Task The Golang backdoor can create a pre-defined scheduled task.
Privilege Escalation T1053 Scheduled Task The Golang backdoor can create a pre-defined scheduled task.
Defense Evasion T1107 File Deletion The Golang backdoor can delete files.
T1117 Regsvr32 The Nim downloader uses regsvr32.exe to launch the Golang downloader.
T1064 Scripting The remote template contains VBA used to execute the next stage of the malware.
Discovery T1083 File and Directory Discovery The Golang backdoor can list drives.
Collection T1113 Screen Capture HTTP is used for C&C communications.
Command and Control T1043 Commonly Used Port All components are using port 80 to communicate with the C&C server.
T1024 Custom Cryptographic Protocol The Golang backdoor is using an XOR loop for its communications.
T1132 Data Encoding The Golang backdoor base64- encodes the data before encrypting it.
T1071 Standard Application Layer Protocol HTTP is used for C&C communications.
T1032 Standard Cryptographic Protocol The Golang backdoor encrypts communications with the C&C server with AES ECB.
Exfiltration T1022 Data Encrypted The Golang backdoor encrypts the data with AES ECB before sending it over the C&C server.
T1041 Exfiltration Over Command and Control Channel The Golang backdoor exfiltrates data to its C&C server.

References:

[1] https://unit42.paloaltonetworks.com/sofacy-creates-new-go-variant-of-zebrocy-tool/

[2] https://securelist.com/a-zebrocy-go-downloader/89419/

[3] https://www.vkremez.com/2018/12/lets-learn-dissecting-apt28sofacy.html