OceanLotus: оновлення малварі для macOS

У березні 2019 року в VirusTotal, популярний онлайн-сервіс сканування, був завантажений новий зразок шкідливого програмного забезпечення для macOS кібергрупи OceanLotus. p align="justify"> Виконуваний файл бекдора володіє тими ж можливостями, що і попередня вивчена нами версія малварі для macOS, але його структура змінилася і його стало складніше виявити. На жаль, ми не змогли знайти дроппер, пов'язаний з цим зразком, тому поки що не знаємо вектор зараження.

Нещодавно ми опублікували пост про OceanLotus і про те, як оператори намагаються забезпечити персистентність, прискорити виконання коду та звести до мінімуму сліди присутності в системах Windows. Відомо також, що ця кібергрупа має і компонент для macOS. У цьому пості докладно описуються зміни у новітній версії малварі для macOS порівняно з попереднім варіантом (описаним Trend Micro), а також розповідається, як під час аналізу можна автоматизувати розшифровку рядків за допомогою IDA Hex-Rays API.

OceanLotus: оновлення малварі для macOS

Аналіз

У наступних трьох частинах описується аналіз зразка з хеш SHA-1 E615632C9998E4D3E5ACD8851864ED09B02C77D2. Файл називається flashlightdантивірусні продукти ESET детектують його як OSX/OceanLotus.D.

Антиналагодження та захист від пісочниць

Як усі macOS-бінарники OceanLotus, зразок упакований з UPX, але більшість засобів ідентифікації пакувальників не розпізнають його як таку. Ймовірно, тому, що вони в основному містять підпис, який залежить від наявності рядка "UPX", крім того, Mach-O сигнатури зустрічаються рідше і не так часто оновлюються. Ця особливість ускладнює статичне виявлення. Цікаво, що після розпакування точка входу знаходиться на початку розділу __cfstring у сегменті .TEXT. У цьому розділі є атрибути flag, як показано нижче.

OceanLotus: оновлення малварі для macOS
Малюнок 1. Атрибути розділу MACH-O __cfstring

Як показано на малюнку 2, розташування коду у розділі __cfstring дозволяє обдурити деякі інструменти дизасемблювання, відображаючи код у вигляді рядків.

OceanLotus: оновлення малварі для macOS
Малюнок 2. Код бекдору визначається IDA як дані

Після запуску бінарний файл створює потік як засіб захисту від налагодження, єдиною метою якого є постійна перевірка наявності дебагера. Для цього потік:

— Намагається відчепити будь-який дебаггер, викликаючи ptrace с PT_DENY_ATTACH як параметр запиту
— Перевіряє, чи відкриті деякі виняткові порти, викликаючи функцію task_get_exception_ports
— Перевіряє, чи підключений дебаггер, як показано на малюнку нижче, шляхом перевірки наявності прапора P_TRACED у поточному процесі

OceanLotus: оновлення малварі для macOS
Рисунок 3. Перевірка підключення дебаггера за допомогою функції sysctl

Якщо сторожова схема виявляє присутність дебаггера, викликається функція exit. Крім того, потім зразок перевіряє середовище, виконуючи дві команди:

ioreg -l | grep -e "Manufacturer" и sysctl hw.model

Після цього зразок перевіряє значення, що повертається по жорстко закодованому списку рядків відомих систем віртуалізації: acle, VMware, VirtualBox або паралелі. Нарешті, наступна команда перевіряє, чи є машина однією з наступних “MBP”, “MBA”, “MB”, “MM”, “IM”, “MP” та “XS”. Це коди моделі системи, наприклад, "MBP" означає MacBook Pro, "MBA" - MacBook Air і т.д.

system_profiler SPHardwareDataType 2>/dev/null | awk '/Boot ROM Version/ {split($0, line, ":");printf("%s", line[2]);}

Основні доповнення

Незважаючи на те, що команди бекдора не змінилися з часів дослідження Trend Micro, ми помітили кілька інших модифікацій. C&C-сервери, які використовуються в цьому зразку, є досить новими, дата їх створення – 22.10.2018.

- daff.faybilodeau[.]com
- sarc.onteagleroad[.]com
- au.charlineopkesston[.]com

Ресурс URL змінився на /dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35.
Перший пакет, що відправляється на C&C-сервер, містить більше інформації про хост-машину, включаючи всі дані, що збираються командами нижче.

OceanLotus: оновлення малварі для macOS

Крім цього, зміни конфігурації, зразок використовує для мережевої фільтрації не бібліотеку лібур, а зовнішню бібліотеку Щоб знайти її, бекдор намагається розшифрувати кожен файл у поточному каталозі, використовуючи AES-256-CBC із ключем gFjMXBgyXWULmVVVzyxy, доповненим нулями. Кожен файл розшифровується та зберігається як /tmp/store, а спробу його завантажити як бібліотеку зроблено з використанням функції dlopen. Коли спроба розшифровки призводить до успішного виклику dlopen, бекдор отримує експортовані функції Boriry и ChadylonV, які, мабуть, відповідають за мережну взаємодію з сервером. У нас немає дроппера або інших файлів з вихідного розташування зразка, тому ми не можемо проаналізувати цю бібліотеку. Більше того, оскільки компонент зашифрований, YARA-правило, засноване на цих рядках, не відповідатиме файлу, знайденому на диску.

Як описано у вищезгаданій статті, створюється cliendID. Цей ідентифікатор є хешем MD5 значення однієї з наступних команд:

- 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 адресу)
- Невідома команда («x1ex72x0a«), яка використовується у попередніх зразках

Перед хешуванням до значення, що повертається, додається символ «0» або «1», що вказує на наявність root привілеїв. Цей клієнтський ідентифікатор зберігається в /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex, якщо код запущено від root або ~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML у всіх інших випадках. Файл зазвичай прихований за допомогою функції _chflags, його тимчасова мітка змінюється за допомогою команди touch –t із випадковим значенням.

Розшифровка рядків

Як і в попередніх варіантах, рядки зашифровані з використанням AES-256-CBC (шістнадцятковий ключ: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92 доповнений нулями, а IV заповнений нулями) за допомогою функції CCCrypt. Ключ змінений у порівнянні з попередніми версіями, але оскільки група все ще використовує той же алгоритм шифрування рядків, розшифровка може бути автоматизована. Крім цього посту, ми випускаємо скрипт IDA, що використовує API Hex-Rays для розшифровки рядків, присутніх у бінарному файлі. Цей скрипт може допомогти у майбутньому аналізі OceanLotus та аналізі існуючих зразків, які ми поки що не змогли отримати. У основі сценарію – універсальний метод отримання аргументів, переданих функції. З іншого боку, він шукає призначення параметрів. Метод можна використовувати повторно, щоб отримати список аргументів функції і потім передати зворотний виклик (callback).

Знаючи прототип функції розшифровувати, скрипт знаходить всі перехресні посилання на цю функцію, всі аргументи, потім розшифровує дані та поміщає простий текст усередині коментаря за адресою перехресного посилання. Щоб скрипт працював правильно, в ньому повинен бути встановлений алфавіт, використовуваний функцією декодування base64, і повинна бути визначена глобальна змінна, що містить довжину ключа (в даному випадку DWORD, див. малюнок 4).

OceanLotus: оновлення малварі для macOS
Рисунок 4. Визначення глобальної змінної key_len

У вікні Function можна викликати правою кнопкою миші функцію розшифровки та клацнути «Вилучити та розшифрувати аргументи». Сценарій повинен розміщувати розшифровані рядки у коментарі, як показано на малюнку 5.

OceanLotus: оновлення малварі для macOS
Малюнок 5. Розшифрований текст розміщено у коментарі

Таким чином, розшифровані рядки зручно розміщуються разом у вікні IDA зовнішні посилання для цієї функції, як показано на малюнку 6.

OceanLotus: оновлення малварі для macOS
Рисунок 6. Xrefs to функції f_decrypt

Фінальний варіант сценарію можна знайти на Сховище Github.

Висновок

Як вже було сказано, OceanLotus постійно вдосконалюють та оновлюють свій набір інструментів. Цього разу кібергрупа вдосконалила шкідливе програмне забезпечення для роботи з Мас-користувачами. Код не сильно змінився, але оскільки багато Мас-користувачі ігнорують продукти для безпеки, захист малварі від виявлення має другорядне значення.

Продукти ESET вже детектували файл на момент дослідження. Оскільки мережна бібліотека, що використовується для C&C-комунікації, тепер зашифрована на диску, точний мережевий протокол, що використовується атакуючими, поки невідомий.

індикатори компрометації

Індикатори компрометації та атрибути MITRE ATT&CK також доступні на GitHub.

Джерело: habr.com

Додати коментар або відгук