Im März 2019 hat VirusTotal, ein beliebter Online-Scan-Dienst, ein neues Malware-Beispiel für macOS der OceanLotus-Cybergroup hochgeladen. Die ausführbare Backdoor-Datei verfügt über dieselben Funktionen wie die von uns untersuchte Vorgängerversion von malvari für macOS, hat sich jedoch geändert und ist schwieriger zu erkennen. Leider konnten wir die mit dieser Probe verknüpfte Pipette nicht finden, sodass wir den Infektionsvektor noch nicht kennen.
Kürzlich haben wir einen
Beitrag über OceanLotus veröffentlicht und darüber, wie Bediener versuchen, die Persistenz sicherzustellen, die Codeausführung zu beschleunigen und Spuren der Präsenz auf Windows-Systemen zu minimieren. Es ist auch bekannt, dass diese Cybergruppe eine Komponente für macOS enthält. In diesem Beitrag werden die Änderungen in der neuesten Version von Malware für macOS im Vergleich zur vorherigen Version (
beschrieben von Trend Micro ) sowie die Analyse der Zeichenfolgenentschlüsselung mithilfe der IDA Hex-Rays-API ausführlich beschrieben.
Analyse
Die folgenden drei Teile beschreiben die Probenanalyse mit dem SHA-1-
E615632C9998E4D3E5ACD8851864ED09B02C77D2
. Die Datei heißt
flashlightd , ESET-Antivirenprodukte erkennen sie als OSX / OceanLotus.D.
Anti-Debugging und Sandbox-Schutz
Wie alle OceanLotus macOS-Binärdateien ist das Beispiel mit UPX verpackt, aber die meisten Tools zur Identifizierung von Packern erkennen es nicht als solches. Wahrscheinlich, weil sie hauptsächlich eine Signatur enthalten, abhängig vom Vorhandensein der Zeichenfolge „UPX“. Außerdem sind Mach-O-Signaturen weniger häufig und werden nicht so oft aktualisiert. Diese Funktion erschwert die statische Erkennung. Interessanterweise befindet sich der Einstiegspunkt nach dem Auspacken am Anfang des Abschnitts
__cfstring
im
.TEXT
Segment. In diesem Abschnitt gibt es Flaggenattribute, wie in der Abbildung unten gezeigt.
Abbildung 1. Attribute des Abschnitts MACH-O __cfstringWie in Abbildung 2 dargestellt, können
__cfstring
der Position des Codes im Abschnitt
__cfstring
einige Demontagewerkzeuge
__cfstring
indem Sie den Code als Zeichenfolgen anzeigen.
Abbildung 2. Der Backdoor-Code wird von der IDA als Daten definiertNach dem Start der Binärdatei wird ein Stream zum Schutz vor dem Debuggen erstellt, dessen einziger Zweck darin besteht, ständig nach dem Vorhandensein eines Debuggers zu suchen. Für diesen Thread:
- Es wird versucht, einen Debugger
ptrace
indem ptrace
mit PT_DENY_ATTACH
als Anforderungsparameter PT_DENY_ATTACH
wird - Überprüft, ob einige Ausnahmeports geöffnet sind, indem
task_get_exception_ports
- Überprüft, ob der Debugger verbunden ist (siehe Abbildung unten), indem überprüft wird,
P_TRACED
im aktuellen Prozess das Flag P_TRACED
ist
Abbildung 3. Überprüfen der Debugger-Verbindung mit der Funktion sysctlWenn der Watchdog das Vorhandensein eines Debuggers erkennt, wird die
exit
Funktion aufgerufen. Darüber hinaus überprüft das Beispiel die Umgebung, indem zwei Befehle ausgeführt werden:
ioreg -l | grep -e "Manufacturer" sysctl hw.model
Danach vergleicht das Beispiel den Rückgabewert mit einer fest codierten Liste von Zeichenfolgen bekannter Virtualisierungssysteme:
acle ,
vmware ,
virtualbox oder
Parallelen . Schließlich prüft der folgende Befehl, ob der Computer einer der folgenden "MBP", "MBA", "MB", "MM", "IM", "MP" und "XS" ist. Hierbei handelt es sich um Systemmodellcodes. Beispiel: "MBP" bedeutet MacBook Pro, "MBA" bedeutet MacBook Air usw.
system_profiler SPHardwareDataType 2>/dev/null | awk '/Boot ROM Version/ {split($0, line, ":");printf("%s", line[2]);}
Wichtige Ergänzungen
Trotz der Tatsache, dass sich die Backdoor-Teams seit der Trend Micro-Studie nicht geändert haben, haben wir einige andere Änderungen festgestellt. Die in diesem Beispiel verwendeten C & C-Server sind recht neu. Das Erstellungsdatum ist der 22.10.2008.
- daff.faybilodeau [.] com
- sarc.onteagleroad [.] com
- au.charlineopkesston [.] com
Die Ressourcen-URL wurde in
/dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35
.
Das erste an den C & C-Server gesendete Paket enthält weitere Informationen zum Host-Computer, einschließlich aller Daten, die mit den Befehlen aus der folgenden Tabelle erfasst wurden.

Zusätzlich zu dieser Konfigurationsänderung verwendet das Beispiel nicht die
libcurl- Bibliothek für die Netzwerkfilterung, sondern eine externe Bibliothek. Um dies zu finden, versucht die Hintertür, jede Datei im aktuellen Verzeichnis mithilfe von AES-256-CBC mit dem mit Nullen
gFjMXBgyXWULmVVVzyxy
Schlüssel
gFjMXBgyXWULmVVVzyxy
zu entschlüsseln. Jede Datei wird entschlüsselt und als
/tmp/store
gespeichert . Mit der Funktion
dlopen wurde versucht, sie als Bibliothek zu laden. Wenn ein Entschlüsselungsversuch zu einem erfolgreichen
dlopen
Aufruf führt, ruft die Hintertür die exportierten
Boriry
und
ChadylonV
, die anscheinend für die Netzwerkkommunikation mit dem Server verantwortlich sind. Wir haben keine Pipette oder andere Dateien vom Quellspeicherort der Probe, daher können wir diese Bibliothek nicht analysieren. Da die Komponente verschlüsselt ist, stimmt die auf diesen Zeilen basierende YARA-Regel nicht mit der auf der Festplatte gefundenen Datei überein.
Wie im obigen Artikel beschrieben, wird
cliendID erstellt. 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 '/IOPlatformSerialNumber/ { split($0, line, "\""); printf("%s", line[4]); }'
-
ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { 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}\'
ifconfig en0 | awk \'/ether /{print $2}\'
(MAC-Adresse abrufen)
- unbekannter Befehl ("
\x1e\x72\x0a
"), der in früheren Beispielen verwendet wurde
Vor dem Hashing wird das Zeichen "0" oder "1" zum zurückgegebenen Wert hinzugefügt, um das Vorhandensein von Root-Rechten anzuzeigen. Diese
Client-ID wird in
/Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex
wenn der Code als root oder in ~ / Library / SmartCardsServices / Technology / PlugIns / drivers / snippets.ecgML ausgeführt wird in allen anderen Fällen. Eine Datei wird normalerweise mit der Funktion
_chflags ausgeblendet , ihr Zeitstempel wird mit dem Befehl
touch –t
mit einem zufälligen Wert geändert.
Zeichenfolgen dekodieren
Wie in früheren Versionen werden die Zeichenfolgen mithilfe der
CCCrypt- Funktion mit AES-256-CBC (Hexadezimalschlüssel:
9D7274AD7BCEF0DED29BDBB428C251DF8B350B92
mit Nullen aufgefüllt und IV wird mit Nullen gefüllt)
verschlüsselt . Der Schlüssel wurde gegenüber früheren Versionen geändert. Da die Gruppe jedoch immer noch denselben String-Verschlüsselungsalgorithmus verwendet, kann die Entschlüsselung automatisiert werden. Zusätzlich zu diesem Beitrag veröffentlichen wir ein IDA-Skript, das die Hex-Rays-API verwendet, um in einer Binärdatei vorhandene Zeichenfolgen zu entschlüsseln. Dieses Skript kann bei der zukünftigen Analyse von OceanLotus und der Analyse vorhandener Proben hilfreich sein, die wir noch nicht erhalten konnten. Das Skript basiert auf einer universellen Methode zum Empfangen von Argumenten, die an eine Funktion übergeben werden. Er sucht auch nach Zieleinstellungen. Die Methode kann wiederverwendet werden, um eine Liste von Funktionsargumenten abzurufen und diese dann an einen Rückruf zu übergeben.
Wenn das Skript den Prototyp der
Entschlüsselungsfunktion kennt, findet es alle Querverweise auf diese Funktion, alle Argumente, entschlüsselt dann die Daten und platziert einfachen Text im Kommentar an der Adresse des Querverweises. Damit das Skript ordnungsgemäß funktioniert, muss das benutzerdefinierte Alphabet von der base64-Decodierungsfunktion verwendet und eine globale Variable mit der Schlüssellänge definiert werden (in diesem Fall DWORD, siehe Abbildung 4).
Abbildung 4. Definition der globalen Variablen key_lenIm Funktionsfenster können Sie mit der rechten Maustaste auf die Entschlüsselungsfunktion klicken und auf "Argumente extrahieren und entschlüsseln" klicken. Das Skript sollte die entschlüsselten Zeilen in die Kommentare einfügen, wie in Abbildung 5 dargestellt.
Abbildung 5. Der entschlüsselte Text wird in den Kommentar eingefügtDaher werden die entschlüsselten Zeilen für diese Funktion bequem zusammen im IDA
xrefs- Fenster platziert, wie in Abbildung 6 dargestellt.
Abbildung 6. Xrefs to f_decrypt-FunktionDas endgültige Skript befindet sich im
Github-Repository .
Fazit
Wie bereits erwähnt, verbessert und aktualisiert OceanLotus seine Tools ständig. Diesmal hat die Cybergroup die Malware für die Arbeit mit Mac-Benutzern verbessert. Der Code hat sich nicht wesentlich geändert, aber da viele Mac-Benutzer Sicherheitsprodukte ignorieren, ist der Schutz von Malware vor Erkennung von untergeordneter Bedeutung.
ESET-Produkte haben diese Datei zum Zeitpunkt der Studie bereits erkannt. Da die für die C & C-Kommunikation verwendete Netzwerkbibliothek jetzt auf der Festplatte verschlüsselt ist, ist das genaue Netzwerkprotokoll der Angreifer noch nicht bekannt.
Kompromissindikatoren
Kompromissindikatoren sowie MITRE ATT & CK-Attribute sind auch auf
GitHub verfügbar.