DNSBirthday: Dubiose Werbeanzeigen durch Code-Injektion

DNSBirthday: Reminder-Tool kann dubiose Werbeanzeigen in Browser einbauen

Das seltsame Verhalten einer einfachen Windows-Anwendung hat unsere Aufmerksamkeit erregt und ESET dazu veranlasst, eine bisher undokumentierte Malware zu analysieren.

Das seltsame Verhalten einer einfachen Windows-Anwendung hat unsere Aufmerksamkeit erregt und ESET dazu veranlasst, eine bisher undokumentierte Malware zu analysieren.

Das seltsame Verhalten einer einfachen Windows-Anwendung hat unsere Aufmerksamkeit erregt und ESET dazu veranlasst, eine bisher undokumentierte Malware zu analysieren. Ein Kontaktmann der norwegischen HealthCERT kam auf uns zu, um unsere Meinung über DNS-Queries des Formats [0-9a-f]{60}.smoke zu hören.

Dahinter steckt eine Anwendung, die lediglich an Geburtstage erinnern soll. Sie funktioniert, hat aber auch interessante Features, die dem Benutzer nicht bekannt sind. Wir haben das Geburtstags-Erinnerungsprogramm heruntergeladen und die zusätzlichen Komponenten getestet, die DNS-Anfragen abfängt, um Werbung in Webseiten zu implementieren. Wir tauften diese neue Bedrohung DNSBirthday.

Klar sein dürfte, dass die Malware-Entwickler alle Komponenten selbst geschrieben haben und nicht bloß kompromittierte Computer weiterverkaufen. Der C&C-Server dient beispielsweise allen Malware-Samples und viele Artefakte der Malware verweisen auf ein Projekt namens RQZTech.

Abbildung 1: Birthday Reminder Interface

Verbreitung

Uns ist lediglich die folgende URL zum Herunterladen der DNSBirthday-Malware bekannt:

hxxp://updates.rqztech.com/download?app=BirthdayReminder&aff_id=15124

Der aff_id-Parameter suggeriert die Verteilung über ein Affiliate-Programm, was wir allerdings nicht bestätigen können. Wahrscheinlich handelt es sich hier um einen Köder.

ESETs Telemetrie zeigt, dass diese Bedrohung mit Ausnahme von einigen Spitzen in Ländern wie den USA, Spanien, Japan und Italien sich ansonsten gleichmäßig rund um den Globus verteilt.

Abbildung 2: Weltweite Verbreitung von DNSBirthday

Technische Analyse

DNSBirthday ist eine modulare Malware und besteht aus mehreren Komponenten. Es dauerte einige Zeit, um das ganze Schema hinter der Schadsoftware zu verstehen und alle Stücke des Puzzles zusammenzusetzen. Allerdings haben alle Komponenten ein paar Dinge gemeinsam:

  • Alle kommunizieren nur über einen C&C-Server (updates.rqztech.com) in JSON formatierten Nachrichten via HTTPS.
  • Die meisten Binärdateien sind statisch mit OpenSSL und libcurl sowie einer JSON-Bibliothek verknüpft.
  • Den meisten Komponentennamen ist rqz vorangestellt.
  • PDB-Pfade in den Komponenten haben die Form: C:\Users\default.default-PC\Documents\Visual Studio 2013\Projects\rqz-[module-name]\Release\rqz-[module-name].pdb

Abbildung 3: RQZTech-Homepage am 2. Juni 2017

Die Malware-Entwickler haben sich dazu entschieden, zwei Zertifikate anzuhängen, um sich gegen Man-in-the-middle-Angriffe zu schützen. Allerdings reagiert ihr Server auch auf HTTP-Anfragen. Deshalb war es uns möglich, Netzwerktraffic beim Debuggen zu erfassen, indem das URL-Schema dieser Anfragen auf HTTP geändert wurde.

Die in den ausführbaren Dateien eingebetteten Zertifikate sind signiert. Das Not-before-Feld zeigt, dass sie wahrscheinlich am 16. April 2016 entstanden.

Wir werden auf jede Komponente näher eingehen, aber zuerst folgt hier ein Überblick, wie sie miteinander verknüpft sind.

Abbildung 4: Übersicht über die Komponenten von DNSBirthday

Obwohl alle Komponenten PE-Dateien sind, werden nur wenige auf die Festplatte geschrieben.

Die anderen werden in den Arbeitsspeicher geladen und durch eine benutzerdefinierte PE-Loader-Implementierung ausgeführt.

BirthdayReminderSetup.exe

BirthdayReminderSetup.exe ist ein 18MB NSIS Paket. Dieser Installer bestimmt zunächst, ob es sich bei dem System um eine 32- oder 64-Bit-Version handelt und extrahiert mehrere Dateien in den angegebenen Installationsordner.

Danach beweist die Malware ihr Hartnäckigkeit, indem sie den Wert BirthdayReminder im Registrierungsschlüssel HKLM\Software\Microsoft\Windows\CurrentVersion\Run mit dem Pfad zur BRController.exe -Anwendung erstellt. Doch wie soll die Malware an Geburtstage erinnern, wenn sie nicht ständig läuft? Sogar ein Icon im Benachrichtigung Bereich wird eingeblendet.

BRController.exe — rqz-loader

Der einzige Zweck der Komponente BRController.exe ist es, die Datei br.dll.enc in den Speicher zu entschlüsseln, sie zu laden und rqz_stg1_init aufzurufen – eine der exportierten Funktionen.

Der verwendete Entschlüsselungsalgorithmus ist AES-256-CBC, welchen die Entwickler über eine statisch verknüpfte OpenSSL-Bibliothek implementieren.

Der Entschlüsselungsschlüssel wird in zwei Schritten erzeugt. Zuerst wird der SHA-256 Hash der logo.png Datei berechnet. Dann wird eine einfache XOR-Routine auf den Hash angewendet. Das erste Byte wird mit dem letzten und allen anderen Bytes mit dem ersten XOR-verknüpft.

Der Initialisierungsvektor (IV) besteht aus den ersten 16 Bytes des Schlüssels, der dann durch die gleiche Schlüssel-XOR-Routine, umgebildet wird.

br.dll — rqz-stg1

Wir nennen br.dll die unverschlüsselte Form von br.dll.enc. Diese Bibliothek fungiert als Kernkomponente der Malware.

Zuerst erstellt br.dll den Mutex Global\Global\RqzSingleInst und dann eine Liste von aufrufbaren Objekten mit expliziten Namen wie dlExecloader oder sogar exfil. Diese aufrufbaren Objekte können – insofern beteiligt – Aufgaben wie das Herunterladen von ausführbaren Dateien initiieren, sie wahlweise auf Festplatte speichern und starten oder Daten für den C&C-Server herausfiltern.

Die Komponente ruft eine festvergebene Bot-ID aus der BRController-Datei ab, indem sie nach der Sequenz 0xB00B1355 sucht und dann die 16 folgenden Bytes liest. Dann versucht die Malware, die grafische Benutzeroberfläche der Geburtstagsanzeige und einen Loop zu starten, um mit dem C&C-Server zu kommunizieren.

Die erste HTTP-POST-Anfrage an den Server (hxxps://updates.rqztech.com/update_check/) enthält einige grundlegende Informationen im JSON-Format innerhalb der Datenparameter.

Hier ist eine übersichtliche Version der ersten POST-Anfrage an den C&C Server:

Diese JSON enthält die Version der Malware (1.1.0-x32), die Version von Windows (osver), die Bot-ID (uuid), die Anzahl der Versuche der Kontaktierung des C&C-Servers durch die Malware (checkinCount) und ein Array mit dem Status der zuletzt geladenen Komponente (compStatus).

Der Server antwortet mit einem JSON-Array, welches Parameter listet, die an die unterschiedlichen Komponenten übergeben werden sollen. Obwohl die Anfrage wie ein Software-Update-Mechanismus aussieht, wird es dazu verwendet, schädliche Komponenten an Opfer zu verteilen.

Das erste Mal, wenn die Malware den Server kontaktiert, antwortet dieser mit der folgenden JSON (Payload-String ist für bessere Lesbarkeit gekürzt).

Die Antwort vom Server zeigt drei Aktionen, die nacheinander ausgeführt werden sollen. Die erste bestimmt einige Umgebungsvariablen mit der callback-Komponente.

Dann wird die Loader-Komponente aufgerufen, um die Komponente rqz_info_gatherer im Speicher zu entschlüsseln und zu laden. Die Payload-Zeichenfolge ist eine base64-codierte und verschlüsselte DLL (rqz_info_gatherer). Die Entschlüsselungsroutine ist die gleiche wie die zur Entschlüsselung der Datei br.dll.enc.

Nach dem Laden wird die jetzt entschlüsselte Komponente aufgerufen.

Danach ruht die Malware für acht Stunden.

rqz-info-gatherer

Ziel dieses Moduls ist es, einige Informationen über den Computer zu sammeln und einen Bericht mit Hilfe der exfil-Komponente aus der br.dll zu senden.

Die exfil-Komponente sendet eine HTTPS-POST-Anfragt an hxxps://updates.rqztech.com/update_report/ mit bot uuid und payload. Der Payload-Parameter ist ein JSON-Objekt aus zwei Elementen: data und sha256.

Der sha256-String ist der Hash der Daten, bevor diese base64-codiert wurden.

Der Datenstring ist eine base64-codierte JSON, die Informationen über den Computer enthält. Der folgende Auszug ist ein Beispiel für einen dekodierten Bericht, der an den Server gesendet wird (procStat ist für bessere Lesbarkeit gekürzt).

Beispielbericht aus dem Modul rqz-info-gatherer:

Die meisten der Felder sind selbsterklärend. Das dirStat-Objekt enthält die Größe bestimmter Ordner in Bytes.

Einmal abgeschickt, antwortet der Server mit einem einfachen „danke“, was interessanterweise mit dem Ländernamen im öffentlichen Zertifikat übereinstimmt.

rqz-dnsduvel-ldr

Es wurde beobachtet, dass die br.dll-Komponente nach einer gewissen Zeitspanne (ein oder zwei Wochen) die rqz-dnsduvel-ldr-Komponente herunterlädt. Duvel ist (alt) niederländisch und friesisch und steht für „Teufel“. Damit bedeutet das wohl „TeufelDNS“.

Diese Komponente sucht nach Browser-Prozessen wie iexplore.exe, chrome.exe und firefox.exe, um schädlichen Code in ihnen zu implementieren.

Sobald einer der Prozesse gefunden wird, lässt das Modul ab und führt eine eingebettete Datei im %TEMP%-Ordner (GetTempPathA) aus. Der Name der Datei ist die Prozesskennung (PID) des Prozesses zum Injizieren von Code. Das bedeutet, dass für jeden zu kompromittierenden Browser-Prozess, eine Kopie der ausführbaren Datei in eine .TMP-Datei im temporären Ordner abgelegt wird.

Die abgelegte Binärdatei verwendet den internen Namen rqz-dnsduvel-ldr-exe und sowohl die PID des zu injizierenden Prozesses als auch eine Session-ID werden als Parameter übergeben.

rqz-dnsduvel-ldr-exe

Diese Komponente ist ein Injektor, der ReflectiveDLLInjection verwendet, um eine DLL in den Adressraum eines anderen Prozesses zu laden.

Diese ausführbare Datei enthält auch eine weitere ausführbare Datei; im Gegensatz zum rqz-dnsduvel-ldr-Modul ist die eingebettete Binärdatei aber verschlüsselt. Wieder einmal greift die Entschlüsselungsroutine AES-256-CBC, aber diesmal sind die Initialisierungsvektoren und der Schlüssel hartcodiert.

Der Injektor fragt den Server nach einer Konfigurationsdatei. Die Abfrage erfolgt über eine HTTPS-POST-Anforderung:

hxxps://updates.rqztech.com/update_report/?update=fdac34d

Die POST-Parameter sind wieder uuid und payload. Payload ist wieder ein JSON-Objekt mit einem data und einem sha256-Schlüssel. Der Datenstring ist die folgende base64-codierte JSON, wobei procName der zu kompromittierende Browser ist und sessionID das Cookie, das durch das zweite Kommandozeilenargument gesetzt wird.

Beispielbericht für rqz-dnsduvel-ldr-exe:

Der Server antwortet mit der folgenden JSON-Konfigurationsdatei (blockList-Array für bessere Lesbarkeit gekürzt).

Beispielkonfiguration für rqz-dnsduvel-ldr-exe:

Die vollständige Konfiguration mit einer kompletten „Blockliste“ ist auf ESET’s Github verfügbar.

Das BlockList-Array enthält etwa 500 Domain-Namen, die in der Regel Werbung hosten. Der Inhalt dieser Konfiguration namens rqzduvel-checkin-payload wird via File Mapping gespeichert und durch den Arbeitsspeicher abgesichert.

Das Token-Feld enthält einen Domain-Namen, der von der Malware verwendet wird, um zu überprüfen, ob der verwendete DNS-Server derjenige im Feld dnsServer ist. DNSBirthday fragt diese Domain an und prüft, ob die zurückgegebene Adresse 127.0.0.1 ist.

Das Modul holt den Export ReflectiveLoader in der entschlüsselten Binärdatei (rqz-dnsduvel) ab, ordnet die Bibliothek im Adressraum des Browsers mit WriteProcessMemory zu und ruft CreateRemoteThread mit dem Parameter lpStartAddress an der abgerufenen Exportadresse auf.

Einmal injiziert wird die Komponente den C&C-Server (hxxps://updates.rqztech.com/moduleapi/) informieren, ob die Injektion mit der POST-Anfrage erfolgreich war.

Das an den C&C-Server gesendete Resultat der Kompromittierung lautet wie folgt:

Der reason-String kann folgende Werte annehmen:

  • Die Binärdatei konnte den Opferprozess nicht öffnen
  • Die Injektion war erfolgreich (Prozess läuft noch nach einer Minute)
  • Der Prozess ist wahrscheinlich abgestürzt und die Injektion ist nicht gelungen

rqz-dnsduvel

rqz-dnsduvel ist die letzte Stufe und ihr Zweck ist es, sich in DNS-Resolver-Funktionen einzuklinken.

Die Malware-Entwickler liehen sich wahrscheinlich einen Code, um die ReflectiveDLLInjection zu erreichen. Sie verknüpften auch das NTHooklib-Projekt, das die udis86-Bibliothek enthält, statisch. NTHooklib ist eine Bibliothek, die eine Hook-Engine bietet.

Die Komponente klinkt sich in folgende DNS-Funktionen ein:

  • getaddrinfo
  • GetAddrInfoW
  • gethostbyname
  • GetAddrInfoEx

Das Ziel des Einklinkens besteht darin, einen alternativen DNS-Server abzufragen, wenn eine Anfrage für einen Domänennamen vorliegt, der in der „Blockliste“ der Konfigurationsdatei zu finden ist.

Jedes Mal, wenn der kompromittierte Browser einen dieser Domainnamen auflöst, wird der im dnsServer eingestellte Server verwendet (hier: 176.31.106.50). Unabhängig von dem abgefragten Domänennamen war die IP-Adresse, die von diesem bösen DNS-Server zurückgegeben wurde, immer entweder 188.214.30.97 oder 188.214.30.98.

Das folgende Code-Snippet ist eine Schleife, die alle Antworten aus der echten getaddrinfo-Funktion mit der IP ersetzt, die vom bösartigen Server aufgelöst wird.

Abbildung 5: getaddrinfo Hook-Funktion, die Ergebnisse ersetzt

Implementieren von Werbung

Wie bereits erwähnt, sind die Domainnamen in der „Blockliste“ mit Anzeigen verknüpft, was dazu führt, dass der Hauptzweck dieser Malware darin besteht, Anzeigen in Webseiten zu ersetzen oder erst zu implementieren.

Für alle angefragten .js-Dateien würde der Server bei 188.214.30.97 immer die gleiche Datei zurückgeben. Das Skript fügt ein div-Element mit id greenteainthesahara hinzu. Dann setzt es eine HTTP-POST-Anforderung an die URL hxxp://ads.greenteamedia.net/ads ab und bewertet (eval) die Antwort.

Das JavaScript, das wir von ads.greenteamedia.net beobachtet haben, enthält Code für verschiedene Browser und Plattformen und interessanterweise auch für Mobiltelefone. Der Hauptzweck dieses Skripts ist es, einen Event-Listener auf der Seite hinzuzufügen, der ein neues Browser-Fenster mit einer Anzeige öffnet, wenn ein Klick gemacht wird.


Abbildung 6: bösartigen div in einer Webseite hinzugefügt

Hier ist eine beispielhafte Weiterleitungskette, die wir beobachten konnten:

  1. hxxp://ads.greenteamedia.net/tracker?id=58b87f2a2a61cf000a11f651&type=Popunder
  2. hxxp://go.oclaserver.com/afu.php?zoneid=788473
  3. hxxp://onclkds.com/afu.php?zoneid=788473
  4. hxxp://onclkds.com/?r=/mb/han&zoneid=788473&pbk2=fd0ac8ee88f5760db27385dc91765d976393347937513284046&auction_id=b322d474-a5bc-4757-bb28-6613427bd3e8&uuid=fffa3dff-f018-412b-95a9-1a9e915fa972&ad_scheme=1&ab=148&rotation_type=2&adparams=bm9qcz0w&x=1698&y=822&sw=1716&sh=927&wx=0&wy=0&ww=1716&wh=887&wiw=1698&wih=822&wfc=0&pl=http://onclkds.com/afu.php?zoneid=788473&drf=&np=0&pt=undefined&nb=1&ng=1&dm

Der Rest der Kette ändert sich und hängt wahrscheinlich vom Ergebnis des Anzeigengebots ab. Manchmal leitet die Kette zu einem Drive-by-Download um, der wiederum dazu führen könnte, dass noch mehr Malware installiert wird.

Schlussfolgerung

Die Malware-Entwickler haben sich viel Aufwand gemacht, nur um ungebetene Werbung zu verbreiten.

Wie wir gezeigt haben, wurden jede Menge Anstrengungen unternommen, um unentdeckt zu bleiben. Einige Entscheidungen sind trotzdem schwer nachzuvollziehen:

  • Neuere Versionen einiger Komponenten enthalten den .pdb-Pfad, der in älteren Versionen nicht vorhanden war
  • Die meisten Komponenten sind nicht auf Festplatte geschrieben, aber die letzte Stufe rqz-dnsduvel-ldr-exe
  • Die Komponente rqz-dnsduvel-ldr-exe verwendet einen hartcodierten Schlüssel und IV anstatt sie aus dem Hash der logo.png Datei abzuleiten.

Die Modularität dieser Malware ermöglicht mehr Features, die wir vielleicht noch nicht gesehen haben. Es ist möglich, dass die Betreiber dieser Malware andere Arten von Malware wie Spyware an ausgewählte Opfer senden. Einige Komponenten könnten auch in der Entwicklung sein und erst noch gestreut werden.

Wir haben erreicht, dass der C&C- und der boshafte DNS-Server vom Netz genommen wurden.

 

Danke an Romain Dumont für seine Hilfe bei der Analyse und dem Verfassen des Textes.

Anhang

analysierte Samples

Dateinamen Internal name analysierte Version Debug Zeitstempel Hauptzweck
BRController.exe rqz-loader 1.1.0 x32 & x64 Sun 02 Oct 2016 16:11:40 Loader:

Decrypts and loads br.dll.enc in memory

BRController.exe (debug) unknown unknown x32 & x64 unknown Loader:

Decrypt and loads br.dll.enc in memory

br.dll(.enc) rqz-stg1 1.0.4 x32 & x64

1.1.0 x32 & x64

unknown

Sun 02 Oct 2016 16:12:07

Core component:

C&C communication

Data exfiltration

Update/Download other components

Download/Exec other modules in memory

rqz-info-gatherer 1.0.4 x32 & x64 Tue 13 Sep 2016 23:25:43 Module:

Gather information about the computer

rqz-dnsduvel-ldr 1.0.4 x32 & x64 Sat 17 Sep 2016 19:55:10 Module:

Drop and execute rqz-dnsduvel-ldr-exe for each browser process

%d.tmp rqz-dnsduvel-ldr-exe 1.0.3 x32 & x64

1.0.4 x32 & x64

Sat, 03 Sep 2016 19:02:11

Sat 17 Sep 2016 19:54:36

Injector:

Inject a given process with its embedded dll (rqz-dnsduvel)

rqz-dnsduvel 1.0.2-30fa39 x32 & x64

1.0.3-68c0c5 x32 & x64

Sat 03 Sep 2016 19:01:51

Sat 17 Sep 2016 19:53:50

DNS hooker:

Hook DNS functions inside a process

Replace IP addresses for some domain names

IoCs

Registry

  • „HKLM\Software\Microsoft\Windows\CurrentVersion\Run\BirthdayReminder“

Mutex

  • Global\Global\RqzSingleInst
  • Global\downloadExec

Hashes

Component SHA-1 ESET Detection name
BirthdayReminderSetup.exe 6a07de60da0962ee952e63ac89ce86d2581f3926 Win32/Adware.DNSBirthday.A
rqz-loader 1.1.0 x32 19041323a4ecd92eb888664e1d2c0b2893419f78 Win32/Adware.DNSBirthday.A
rqz-loader 1.1.0 x64 94c6f2bbad0ce47957d18b53ef1938d846d7576f Win64/Adware.DNSBirthday.B
rqz-stg1 1.1.0 x32 59eb5b5d3171069761a13389a1a7cce12a95e0bd Win32/Adware.DNSBirthday.A
rqz-stg1 1.1.0 x64 f02e0012aedf02f898f1558c827491d7099c1d62 Win64/Adware.DNSBirthday.A
rqz-info-gatherer 1.0.4 x32 8cfbd1f7e4d8c4357766f0f4b84bb08cf2e78c17 Win32/Adware.DNSBirthday.B
rqz-info-gatherer 1.0.4 x64 0f4aeee1a0878eb510229b871e02eb1e1939107e Win64/Adware.DNSBirthday.B
rqz-dnsduvel-ldr 1.0.4 x32 892785875fcdfe4cc672ba1c3fc59bfbf37c7efe Win32/Adware.DNSBirthday.A
rqz-dnsduvel-ldr 1.0.4 x64 5a5174739bbb7881c46112704cbf039f39d98fec Win64/Adware.DNSBirthday.B
rqz-dnsduvel-ldr-exe 1.0.4 x32 cc291be6cbc7b0dc3aa09973d0ed98e363f9083f Win32/Adware.DNSBirthday.A
rqz-dnsduvel-ldr-exe 1.0.4 x64 ce84d96a974e95499fadd3320f851c0b728cd438 Win64/Adware.DNSBirthday.B
rqz-dnsduvel 1.0.3-68c0c5 x32 e6b6fe919cf6c3af0d40594e86da4cf776dbcf9a Win32/Adware.DNSBirthday.B
rqz-dnsduvel 1.0.3-68c0c5 x64 d1085fb7f2c4d1add9244cb8af6d0e25b50d7b14 Win64/Adware.DNSBirthday.B

Because BirthdayReminderSetup.exe and BRController.exe contain a unique bot id, here are ssdeep fuzzy hashes:

Component ssdeep
BirthdayReminderSetup.exe 393216:ZD4b8Ev/xl3OB4fcUx6uj55/Q7COLc1cm+DkC1GWF2jazuIYRCxEfFCqgY9iHtKZ:ZD5EhFOmcUs85/OCOLecm+14OzzY9Fdl
BRController.exe (x86) 24576:0+KpP0PYnsKdFCH6BMKHiBMikwMbSyM52it6YTekcys4e6faNe0M4RzRPxM4TuZR:cfs4F6KHiy7kM4CjlpRPx1TuZ+tgP8K
BRController.exe (x64) 49152:l4+VwASOwGtlqKPb8KHh+3ulMrqkvTiV3ML3OsQXIU6inTe2mEPEB:jCTiVGV+q2mHB

Network

  • Rogue DNS server: 176.31.106.50
  • C&C server: updates.rqztech.com (188.165.205.99)
  • Ad server IP addresses: 188.214.30.97 and 188.214.30.98
  • DNS query to domain matching [0-9a-f]{60}.smoke

SSL certificates

358bb04f6a0bf8ce88d23b2e620ac01b28d307ab80286f6ee2dcc484a6b1a5d0

45cbc80fe0cac8004f862b9eb90b53b57b06299f98e20923185eb08c363d1ec4

 

Hier können Sie mitdiskutieren