През март 2019 г. нова извадка от зловреден софтуер за macOS от кибергрупата OceanLotus беше качена във VirusTotal, популярна онлайн услуга за сканиране. Изпълнимият файл на задната врата има същите възможности като предишната версия на зловреден софтуер macOS, който проучихме, но структурата му се е променила и е станало по-трудно за откриване. За съжаление, не успяхме да намерим капкомер, свързан с тази проба, така че все още не знаем вектора на инфекцията.
Наскоро публикувахме
Анализ
Следващите три части описват анализа на проба с хеш SHA-1 E615632C9998E4D3E5ACD8851864ED09B02C77D2
. Файлът се извиква фенерче, антивирусните продукти на ESET го откриват като OSX/OceanLotus.D.
Защита срещу отстраняване на грешки и пясъчник
Подобно на всички двоични файлове на macOS OceanLotus, пробата е пакетирана с UPX, но повечето инструменти за идентификация на опаковчиците не я разпознават като такава. Това вероятно е така, защото те най-вече съдържат подпис, зависим от наличието на низа „UPX“, освен това подписите Mach-O са по-рядко срещани и не се актуализират толкова често. Тази функция затруднява статичното откриване. Интересното е, че след разопаковането входната точка е в началото на участъка __cfstring
в сегмента .TEXT
. Този раздел има атрибути на флаг, както е показано на изображението по-долу.
Фигура 1. MACH-O __cfstring раздел атрибути
Както е показано на фигура 2, местоположенията на кода в раздела __cfstring
ви позволява да измамите някои инструменти за разглобяване, като показвате код като низове.
Фигура 2. Код на задната врата, открит от IDA като данни
След като бъде изпълнен, двоичният файл създава нишка като анти-дебъгер, чиято единствена цел е непрекъснато да проверява за наличието на дебъгер. За този поток:
— Опитва се да откачи всеки дебъгер, извикване ptrace
с PT_DENY_ATTACH
като параметър на заявка
- Проверява дали някои изключителни портове са отворени чрез извикване на функция task_get_exception_ports
- Проверява дали дебъгерът е свързан, както е показано на фигурата по-долу, като проверява наличието на флага P_TRACED
в текущия процес
Фигура 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 сървъра, съдържа повече информация за хост машината, включително всички данни, събрани от командите в таблицата по-долу.
В допълнение към тази промяна на конфигурацията, примерът не използва библиотека за мрежово филтриране gFjMXBgyXWULmVVVzyxy
, подплатени с нули. Всеки файл се дешифрира и записва като /tmp/store
и се прави опит за зареждане като библиотека с помощта на функцията dlopen
, задната врата извлича експортирани функции Boriry
и ChadylonV
, които очевидно отговарят за мрежовата комуникация със сървъра. Нямаме капкомер или други файлове от оригиналното местоположение на извадката, така че не можем да анализираме тази библиотека. Освен това, тъй като компонентът е криптиран, правило на YARA, базирано на тези низове, няма да съответства на файла, намерен на диска.
Както е описано в горната статия, той създава clientID. Този идентификатор е 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 привилегии. Това clientID съхранявани в /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex
, ако кодът се изпълнява като root или в ~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML във всички останали случаи. Файлът обикновено е скрит с помощта на функцията touch –t
със случайна стойност.
Декодиране на низове
Както при предишните опции, низовете са криптирани с помощта на AES-256-CBC (шестнадесетичен ключ: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92
подплатени с нули и IV, запълнени с нули) чрез функцията
Познаване на прототипа на функцията разшифровате, скриптът намира всички кръстосани препратки към тази функция, всички аргументи, след което дешифрира данните и поставя обикновен текст в коментар на адреса на кръстосаната препратка. За да работи скриптът правилно, той трябва да бъде настроен на персонализираната азбука, използвана от функцията за декодиране base64, и трябва да бъде дефинирана глобална променлива, съдържаща дължината на ключа (в този случай DWORD, вижте Фигура 4).
Фигура 4. Дефиниция на глобалната променлива key_len
В прозореца на функцията можете да щракнете с десния бутон върху функцията за дешифриране и да щракнете върху „Извличане и дешифриране на аргументи“. Скриптът трябва да постави декриптираните редове в коментари, както е показано на фигура 5.
Фигура 5. Дешифрираният текст се поставя в коментарите
По този начин декриптираните низове се поставят удобно заедно в прозореца на IDA xrefs за тази функция, както е показано на фигура 6.
Фигура 6. Функция Xrefs към f_decrypt
Окончателният сценарий може да бъде намерен на
Продукция
Както вече споменахме, OceanLotus непрекъснато подобрява и актуализира своя инструментариум. Този път кибергрупата е подобрила злонамерения софтуер, за да работи с потребители на Mac. Кодът не се е променил много, но тъй като много потребители на Mac пренебрегват продуктите за сигурност, защитата на зловреден софтуер от откриване е от второстепенно значение.
Продуктите на ESET вече откриваха този файл по време на изследването. Тъй като мрежовата библиотека, използвана за C&C комуникация, сега е криптирана на диска, точният мрежов протокол, използван от нападателите, все още не е известен.
Показатели за компромис
Индикатори за компромис, както и атрибути на MITER ATT&CK също са налични на
Източник: www.habr.com