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.
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.
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.
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.
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.
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).
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.
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.
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