Im März 2019 wurde ein neues Beispiel von macOS-Malware der Cyber-Gruppe OceanLotus auf VirusTotal hochgeladen, einen beliebten Online-Scan-Dienst. Die ausführbare Backdoor-Datei verfügt über dieselben Funktionen wie die vorherige Version der von uns untersuchten macOS-Malware, ihre Struktur hat sich jedoch geändert und sie ist schwieriger zu erkennen. Leider konnten wir zu dieser Probe keinen Tropfer finden, sodass wir den Infektionsvektor noch nicht kennen.
Wir haben kürzlich veröffentlicht
Analyse
Die nächsten drei Teile beschreiben die Analyse einer Probe mit einem SHA-1-Hash E615632C9998E4D3E5ACD8851864ED09B02C77D2
. Die Datei heißt Taschenlampe, ESET-Antivirenprodukte erkennen es als OSX/OceanLotus.D.
Anti-Debugging und Sandbox-Schutz
Wie alle macOS OceanLotus-Binärdateien ist das Beispiel mit UPX gepackt, aber die meisten Tools zur Identifizierung von Paketern erkennen es nicht als solches. Dies liegt wahrscheinlich daran, dass sie meist eine Signatur enthalten, die vom Vorhandensein der „UPX“-Zeichenfolge abhängt. Darüber hinaus sind Mach-O-Signaturen weniger verbreitet 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 Segment .TEXT
. Dieser Abschnitt verfügt über Flag-Attribute, wie im Bild unten gezeigt.
Abbildung 1. MACH-O __cfstring-Abschnittsattribute
Wie in Abbildung 2 dargestellt, sind die Codepositionen im Abschnitt __cfstring
ermöglicht es Ihnen, einige Demontagetools auszutricksen, indem Code als Zeichenfolgen angezeigt wird.
Abbildung 2. Von IDA als Daten erkannter Backdoor-Code
Nach der Ausführung erstellt die Binärdatei einen Thread als Anti-Debugger, dessen einziger Zweck darin besteht, kontinuierlich zu prüfen, ob ein Debugger vorhanden ist. Für diesen Fluss:
– Versucht, jeden Debugger aufzurufen ptrace
с PT_DENY_ATTACH
als Anforderungsparameter
– Überprüft, ob einige exklusive Ports geöffnet sind, indem eine Funktion aufgerufen wird task_get_exception_ports
– Überprüft, ob der Debugger verbunden ist, wie in der Abbildung unten gezeigt, indem das Vorhandensein des Flags überprüft wird P_TRACED
im aktuellen Prozess
Abbildung 3. Überprüfen der Debugger-Verbindung mithilfe der sysctl-Funktion
Wenn der Watchdog das Vorhandensein eines Debuggers erkennt, wird die Funktion aufgerufen exit
. Darüber hinaus überprüft das Beispiel dann die Umgebung, indem es zwei Befehle ausführt:
ioreg -l | grep -e "Manufacturer" и sysctl hw.model
Das Beispiel prüft dann den Rückgabewert anhand einer hartcodierten Liste von Zeichenfolgen aus bekannten Virtualisierungssystemen: acle, VMware, virtualbox oder Parallelen. Abschließend prüft der nächste Befehl, ob es sich bei der Maschine um eine der folgenden Maschinen handelt: „MBP“, „MBA“, „MB“, „MM“, „IM“, „MP“ und „XS“. Dabei handelt es sich um Systemmodellcodes, zum Beispiel bedeutet „MBP“ MacBook Pro, „MBA“ bedeutet MacBook Air usw.
system_profiler SPHardwareDataType 2>/dev/null | awk '/Boot ROM Version/ {split($0, line, ":");printf("%s", line[2]);}
Grundlegende Ergänzungen
Während sich die Backdoor-Befehle seit der Recherche von Trend Micro nicht geändert haben, sind uns einige andere Änderungen aufgefallen. Die in diesem Beispiel verwendeten C&C-Server sind relativ neu und wurden am 22.10.2018 erstellt.
- daff.faybilodeau[.]com
- sarc.onteagleroad[.]com
- au.charlineopkesston[.]com
Die Ressourcen-URL wurde in geändert /dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35
.
Das erste an den C&C-Server gesendete Paket enthält weitere Informationen über den Host-Computer, einschließlich aller von den Befehlen in der folgenden Tabelle erfassten Daten.
Zusätzlich zu dieser Konfigurationsänderung verwendet das Beispiel keine Bibliothek für die Netzwerkfilterung gFjMXBgyXWULmVVVzyxy
, mit Nullen aufgefüllt. Jede Datei wird entschlüsselt und gespeichert als /tmp/store
, und es wird versucht, es als Bibliothek mit der Funktion zu laden dlopen
, extrahiert die Hintertür exportierte Funktionen Boriry
и ChadylonV
, die offenbar für die Netzwerkkommunikation mit dem Server verantwortlich sind. Wir haben weder den Dropper noch andere Dateien vom ursprünglichen Speicherort des Beispiels, daher können wir diese Bibliothek nicht analysieren. Da die Komponente außerdem verschlüsselt ist, stimmt eine auf diesen Zeichenfolgen basierende YARA-Regel nicht mit der auf der Festplatte gefundenen Datei überein.
Wie im obigen Artikel beschrieben, wird es erstellt Kunden ID. Diese ID ist der 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)
- unbekanntes Team ("x1ex72x0a
"), das in früheren Beispielen verwendet wurde
Vor dem Hashing wird dem Rückgabewert eine „0“ oder „1“ hinzugefügt, um Root-Rechte anzugeben. Das Kunden ID gespeichert /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex
, wenn der Code als Root oder in allen anderen Fällen in ~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML ausgeführt wird. Normalerweise wird die Datei mit der Funktion ausgeblendet touch –t
mit einem zufälligen Wert.
Zeichenfolgen dekodieren
Wie bei den vorherigen Optionen werden die Zeichenfolgen mit AES-256-CBC verschlüsselt (Hexadezimalschlüssel: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92
mit Nullen aufgefüllt und IV mit Nullen gefüllt) durch die Funktion
Den Funktionsprototyp kennen entschlüsseln, findet das Skript alle Querverweise auf diese Funktion und alle Argumente, entschlüsselt dann die Daten und fügt Klartext in einen Kommentar an der Querverweisadresse ein. Damit das Skript ordnungsgemäß funktioniert, muss es auf das benutzerdefinierte Alphabet eingestellt werden, das von der Base64-Dekodierungsfunktion verwendet wird, und es muss eine globale Variable definiert werden, die die Länge des Schlüssels enthält (in diesem Fall ein DWORD, siehe Abbildung 4).
Abbildung 4. Definition der globalen Variablen key_len
Im 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 Kommentare einfügen, wie in Abbildung 5 dargestellt.
Abbildung 5. Der entschlüsselte Text wird in den Kommentaren platziert
Auf diese Weise werden die entschlüsselten Zeichenfolgen bequem im IDA-Fenster zusammengefügt XRefs für diese Funktion, wie in Abbildung 6 dargestellt.
Abbildung 6. Xrefs zur f_decrypt-Funktion
Das endgültige Skript finden Sie unter
Abschluss
Wie bereits erwähnt, verbessert und aktualisiert OceanLotus sein Toolkit ständig. Diesmal hat die Cyber-Gruppe die Malware verbessert, um sie auf Mac-Benutzer abzuzielen. Am Code hat sich nicht viel geändert, aber da viele Mac-Benutzer Sicherheitsprodukte ignorieren, ist der Schutz von Malware vor Erkennung zweitrangig.
ESET-Produkte erkannten diese Datei zum Zeitpunkt der Recherche bereits. Da die für die C&C-Kommunikation verwendete Netzwerkbibliothek mittlerweile auf der Festplatte verschlüsselt ist, ist das genaue Netzwerkprotokoll, das die Angreifer verwenden, noch nicht bekannt.
Indikatoren für Kompromisse
Kompromittierungsindikatoren sowie MITRE ATT&CK-Attribute sind ebenfalls verfügbar
Source: habr.com