Im März 2019 wurde bei VirusTotal, dem beliebten Online-Scandienst, ein neuer Schadsoftware-Behälter für macOS der Cybergruppe OceanLotus hochgeladen. Die ausführbare Datei des Backdoors verfügt über die gleichen Funktionen wie die vorherige, von uns untersuchte Version der Malware für macOS, jedoch hat sich ihre Struktur verändert, was die Erkennung erschwert. Leider konnten wir den Dropper, der mit diesem Muster verbunden ist, nicht finden, sodass wir derzeit den Infektionsvektor nicht kennen.
Kürzlich haben wir einen veröffentlicht, in dem wir untersuchen, wie die Betreiber versuchen, Persistenz zu gewährleisten, die Ausführung von Code zu beschleunigen und die Spuren ihres Vorhandenseins in Windows-Systemen zu minimieren. Es ist auch bekannt, dass diese Cybergruppe eine Komponente für macOS besitzt. In diesem Beitrag wird ausführlich beschrieben, welche Änderungen die neueste Version der Malware für macOS im Vergleich zur vorherigen Variante (), enthalten, sowie die Möglichkeit, bei der Analyse die Dekodierung von Strings mithilfe der IDA Hex-Rays API zu automatisieren.

Analyse
In den nächsten drei Teilen wird die Analyse eines Samples mit dem SHA-1-Hash E615632C9998E4D3E5ACD8851864ED09B02C77D2. Die Datei heißt flashlightd, und die Antivirenprodukte von ESET erkennen sie als OSX/OceanLotus.D.
Debugging und Sandbox-Schutz
Wie bei allen macOS-Binärdateien von OceanLotus wird auch dieses Muster mit UPX verpackt, aber die meisten Packager-Identifikationstools erkennen es nicht als solches. Wahrscheinlich liegt das daran, dass sie hauptsächlich eine Signatur enthalten, die von der Anwesenheit der Zeichenfolge „UPX“ abhängt, außerdem sind Mach-O-Signaturen seltener und werden nicht so häufig aktualisiert. Diese Besonderheit erschwert die statische Erkennung. Interessanterweise befindet sich der Einstiegspunkt nach der Dekompression am Anfang des Abschnitts __cfstring im Segment .TEXT. In diesem Abschnitt gibt es Attribut-Flags, wie in der Abbildung unten gezeigt.

Abbildung 1. Attribute des MACH-O-Abschnitts __cfstring
Wie in Abbildung 2 gezeigt, ermöglicht die Anordnung des Codes im Abschnitt __cfstring das Täuschen einiger Disassembler-Werkzeuge, indem der Code als Strings angezeigt wird.

Abbildung 2. Der Backdoor-Code wird von IDA als Daten identifiziert
Nach dem Start erstellt die Binärdatei einen Thread als Schutzmaßnahme gegen Debugging, dessen einziges Ziel es ist, ständig nach einem Debugger zu suchen. Der Thread:
— Versucht, jeden Debugger zu entkoppeln, indem er ptrace mit PT_DENY_ATTACH als Parameter übergibt
— Überprüft, ob bestimmte Ausnahmeports geöffnet sind, indem die Funktion aufgerufen wird task_get_exception_ports
— Überprüft, ob der Debugger angeschlossen ist, wie im Bild unten dargestellt, indem es das Vorhandensein des Flags prüft P_TRACED im aktuellen Prozess

Abbildung 3. Überprüfung der Debugger-Verbindung mittels der sysctl-Funktion
Wenn das Überwachungsschema die Anwesenheit eines Debuggers erkennt, wird die Funktion aufgerufen exit. Darüber hinaus prüft das Muster anschließend die Umgebung, indem es zwei Befehle ausführt:
ioreg -l | grep -e "Manufacturer" und sysctl hw.model
Danach überprüft das Muster den Rückgabewert anhand einer fest kodierten Liste von Strings bekannter Virtualisierungssysteme: acle, vmware, virtualbox oder parallels. Schließlich überprüft der folgende Befehl, ob die Maschine eines der folgenden Modelle ist: „MBP“, „MBA“, „MB“, „MM“, „IM“, „MP“ und „XS“. Dies sind die Systemmodellcodes, zum Beispiel bedeutet „MBP“ MacBook Pro, „MBA“ – MacBook Air usw.
system_profiler SPHardwareDataType 2>/dev/null | awk '/Boot ROM Version/ {split($0, line, ":");printf("%s", line[2]);}'
Wesentliche Ergänzungen
Obwohl sich die Backdoor-Befehle seit der Untersuchung von Trend Micro nicht geändert haben, haben wir einige andere Modifikationen festgestellt. Die in diesem Muster verwendeten C&C-Server sind relativ neu, ihr Erstellungsdatum ist der 22.10.2018.
— daff.faybilodeau[.]com
— sarc.onteagleroad[.]com
— au.charlineopkesston[.]com
Die URL-Ressource wurde geändert zu /dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35.
Das erste Paket, das an den C&C-Server gesendet wird, enthält weitere Informationen zur Hostmaschine, einschließlich aller Daten, die von den Teams in der untenstehenden Tabelle gesammelt werden.

Darüber hinaus verwendet das Beispiel zur Netzwerkfilterung nicht die Bibliothek , sondern eine externe Bibliothek. Um diese zu finden, versucht der Backdoor, jede Datei im aktuellen Verzeichnis zu entschlüsseln, wobei AES-256-CBC mit dem Schlüssel gFjMXBgyXWULmVVVzyxy, ergänzt um Nullen, verwendet wird. Jede Datei wird entschlüsselt und als /tmp/storegespeichert, und der Versuch, sie als Bibliothek zu laden, erfolgt über die Funktion . Wenn der Entschlüsselungsversuch zu einem erfolgreichen Aufruf führt dlopen, extrahiert der Backdoor die exportierten Funktionen Boriry und ChadylonV, die offenbar für die Netzwerkkommunikation mit dem Server verantwortlich sind. Wir haben keinen Dropper oder andere Dateien aus dem ursprünglichen Quellort des Beispiels, daher können wir diese Bibliothek nicht analysieren. Außerdem wird das YARA-Regel, das auf diesen Zeichenfolgen basiert, nicht mit der Datei übereinstimmen, die auf der Festplatte gefunden wurde, da die Komponente verschlüsselt ist.
Wie in dem oben genannten Artikel beschrieben, wird erstellt clientID. Diese Kennung ist ein MD5-Hash des Rückgabewerts eines der folgenden Befehle:
— ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformSerialNumber/ { split($0, line, ""); printf("%s", line[4]); }'
— ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { split($0, line, ""); printf("%s", line[4]); }'
— ifconfig en0 | awk '/ether/{print $2}' (MAC-Adresse abrufen)
— unbekannter Befehl („x1ex72x0a„), der in den vorherigen Beispielen verwendet wird
Vor dem Hashing wird dem Rückgabewert ein Symbol „0“ oder „1“ hinzugefügt, das anzeigt, ob Root-Rechte vorhanden sind. Dieser clientID wird gespeichert in /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex, wenn der Code mit Root-Rechten ausgeführt wird oder in ~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML in allen anderen Fällen. Die Datei wird normalerweise durch die Funktion versteckt, ihr Zeitstempel wird mit dem Befehl touch –t auf einen zufälligen Wert geändert.
Entschlüsselung der Zeichenfolgen
Wie in den vorherigen Versionen sind die Zeichenfolgen mit AES-256-CBC verschlüsselt (hexadeimaler Schlüssel: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92 mit Nullen aufgefüllt und der IV mit Nullen gefüllt) durch die Funktion . Der Schlüssel wurde im Vergleich zu früheren Versionen geändert, da die Gruppe jedoch weiterhin denselben Algorithmus zur Verschlüsselung von Strings verwendet, kann die Dekodierung automatisiert werden. Neben diesem Beitrag veröffentlichen wir ein IDA-Skript, das die Hex-Rays-API zur Dekodierung von Strings im Binärdateiformat verwendet. Dieses Skript kann bei zukünftigen Analysen von OceanLotus und der Analyse bestehender Proben helfen, die wir bisher nicht erhalten konnten. Das Skript basiert auf einer universellen Methode, um Argumente, die an eine Funktion übergeben werden, zu erfassen. Darüber hinaus sucht es nach der Zuweisung von Parametern. Diese Methode kann wiederverwendet werden, um eine Liste von Funktionsargumenten zu erhalten und dann an den Callback zu übergeben.
Mit dem Prototyp der Funktion decrypt, findet das Skript alle Querverweise auf diese Funktion, alle Argumente, decodiert dann die Daten und platziert den Klartext innerhalb eines Kommentars an der Stelle des Querverweises. Damit das Skript korrekt funktioniert, muss ein benutzerdefiniertes Alphabet, das von der Base64-Dekodierungsfunktion verwendet wird, eingestellt werden und eine globale Variable, die die Schlüssellänge enthält (in diesem Fall DWORD, siehe Abbildung 4), definiert werden.

Abbildung 4. Definition der globalen Variable key_len
Im Fenster Funktion können Sie mit der rechten Maustaste die Entschlüsselungsfunktion aufrufen und auf „Argumente extrahieren und entschlüsseln“ klicken. Das Skript sollte die entschlüsselten Strings in den Kommentaren ablegen, wie in Abbildung 5 gezeigt.

Abbildung 5. Der entschlüsselte Text ist in den Kommentaren abgelegt
So werden die entschlüsselten Strings bequem im IDA-Fenster platziert. xrefs für diese Funktion, wie in Abbildung 6 gezeigt.

Abbildung 6. Xrefs zur Funktion f_decrypt
Die endgültige Version des Skripts ist verfügbar unter .
Fazit
Wie bereits erwähnt, verbessert und aktualisiert OceanLotus ständig sein Toolkit. Diesmal hat die Cybergruppe die Malware für Mac-Nutzer optimiert. Der Code hat sich nicht stark verändert, aber da viele Mac-Nutzer Sicherheitsprodukte ignorieren, hat der Schutz der Malware vor Entdeckung nachrangige Bedeutung.
ESET-Produkte haben diese Datei bereits zum Zeitpunkt der Untersuchung erkannt. Da die für die C&C-Kommunikation verwendete Netzwerkbibliothek jetzt auf der Festplatte verschlüsselt ist, ist das genaue Netzwerkprotokoll, das die Angreifer verwenden, derzeit unbekannt.
Indicators of Compromise
Kompromittierungsindikatoren sowie MITRE ATT&CK-Attribute sind ebenfalls verfügbar unter .
Quelle: habr.com
