В статье рассматриваются реальные примеры фрагментов вредоносного кода исключительно в исследовательских и образовательных целях. Они приведены для демонстрации принципов работы угроз и повышения уровня осведомлённости в области кибербезопасности.

Автор не несёт ответственности за возможные последствия неправомерного использования приведённой информации.

Распространение вредоносных компьютерных программ, умышленное нарушение работы компьютерных систем, несанкционированный доступ к данным и иные подобные действия преследуются по закону.

Картинка
Картинка

Многие пользователи Apple верят, что их устройства «неуязвимы», и поэтому игнорируют базовые меры кибербезопасности: не устанавливают регулярные обновления ОС и приложений, не используют антивирусное ПО, а также скачивают и устанавливают ПО из непроверенных источников.

Немаловажную роль в этом заблуждении сыграла и маркетинговая кампания Apple в периоды с 2006 по 2009, где утверждалось, что устройства Apple не подвержены заражению вредоносным программным обеспечением, в отличии от «PC».

Такое ложное ощущение безопасности только играет на руку злоумышленникам, ведь беспечное поведение пользователей только упрощает проведение атак

Несмотря на то, что доля рынка MacOS значительно ниже Windows за последние два года можно заметить тенденцию роста атак на устройства платформы MacOS (см тут, тут и тут).

Собственно с такого вступления мне хотелось бы начать дебютную статью об анализе кода стиллера AMOS.

Сам же AMOS реализован на AppleScript, вся внутренняя логика сбора и передачи данных встроена прямо в скрипте, что делает его независимым от сторонних библиотек и удобным для распространения.

AMOS распространяется по бизнес-модели MaaS (Malware as a Service), а его стоимость колеблется в диапазоне от 1000$ до 3000$ в зависимости от уровня подписки, которая определяет набор функций стиллера. Такая стоимость обусловлена тем, что на "рынке" в принципе очень мало подобных предложений, в отличии от Windows-систем, где стиллеры на подобии RedLine или Lumma C2 стоят в диапазоне от 100$ до 500$.
Достаточно высокая стоимость делает его относительно недоступным для менее опытных или недостаточно обеспеченных злоумышленников. Но для более опытных и финансово-ориентированных преступников AMOS становится привлекательным инструментом, позволяющий быстро начать "лить трафик" с MacOS-устройств.

Объявление о продаже стиллера на одном из теневых рынков
Объявление о продаже стиллера на одном из теневых рынков
Различия уровня подписки
Различия уровня подписки

Честно говоря, я не считаю нужным рассматривать функции по определению размера файла, создания/определения директорий, определение пути к файлу, копирования и тд. Потому эти моменты будут намерено опущены

SandBox Evasion

В первую очередь хочется рассмотреть Evasion-технику, используемую стиллером для предотвращения запуска в песочницах.

Рассмотрим выполнение скрипта по частям.
Получает информацию о памяти системы: команда system_profiler SPMemoryDataType выводит детали о RAM:

set memData to do shell script "system_profiler SPMemoryDataType"

Далее получает информацию о железе: CPU, модель, серийники:

set hardwareData to do shell script "system_profiler SPHardwareDataType"

После уже проверяет признаки виртуально машины: ищет строки QEMU, VMware, KVM. Z31FHXYQ0J, C07T508TG1J2, C02TM2ZBHX87 - серийные номера известных VM. Chip: Unknown, Intel Core 2 - старые или неопределенные процессоры.

if memData contains "QEMU" or memData contains "VMware" or memData contains "KVM" or hardwareData contains "Z31FHXYQ0J" or hardwareData contains "C07T508TG1J2" or hardwareData contains "C02TM2ZBHX87" or hardwareData contains "Chip: Unknown" or hardwareData contains "Intel Core 2" then
    set exitCode to 100
else
    set exitCode to 0
end if

Если что-то из проверок совпало, то скрипт считает, что это VM и ставит значение exitcode равную 100, а после завершает выполнение с кодом возврата

do shell script "exit " & exitCode

InstallBot - закрепление в системе

Далее нас уже встречает интересная функция InstallBot, которая используется для закрепления в системе путем создания службы LaunchDaemon.
Работает следующим образом:

  1. Создает Plist-файл для LaunchDaemon:

    • Label = com.finder.helper - идентификатор службы.

    • ProgramArguments - указывает на бинарь .agent, который будет запускаться через /bin/bash

    • RunAtLoad = true - агент запускается автоматически при старте системы

    • KeepAlive = true - агент автоматически перезапускается, если по какой-то причине завершился

  2. Скачивает бинарь с сервера:

    • Забирает файл app с эндпоинта /zxc/app на сервере botUrl;

    • Сохраняет его в профиле пользователя как скрытый файл .helper;

    • Делает его исполняемым (chmod +x);

  3. Создаёт скрипт .agent, который:

    • Работает в бесконечном цикле;

    • Определяет, какой пользователь сейчас залогинен (/dev/console);

    • Если это обычный пользователь (не root), запускает .helper под его учётной записью через sudo -u;

  4. Устанавливает и запускает LaunchDaemon:

    • Временно сохраняет plist в /tmp/starter;

    • Копирует его в /Library/LaunchDaemons/com.finder.helper.plist с владельцем root:wheel;

    • Загружает службу com.finder.helper c помощью launchctl;

Функция InstallBot
Функция InstallBot

ReplaceApp - подмена приложения

Далее мы видим функцию replaceApp, которая отвечает за замену приложения Ledger Live

  1. Проверка и подготовка окружения:

    • Определяет путь к целевому приложению: /Applications/Ledger Live.app;

    • Убеждается, что приложение присутствует (через list folder);

    • Формирует путь к скрытому файлу-маркеру (.private) в профиле пользователя и удаляет старую версию;

  2. Создание маркера заражения:

    • В .private записывается строка "user16"
      Вероятно, этот маркер используется для идентификации жертвы или состояния заражения;

  3. Загрузка поддельного приложения:

    • С C2-сервера (appUrl) по эндпоинту /zxc/app.zip скачивается архив с поддельным приложением;

    • Сохраняет архив по пути /tmp/app.zip;

  4. Удаляет оригинальное приложение Ledger Live:

    • Пробует завершить процесс Ledger Live (через pkill);

    • С помощью sudo и переданного пароля (pass) полностью удаляет оригинальную директорию приложения из /Applications от имени root;

  5. Устанавливает фишинговый Ledger Live:

    • Распаковывает содержимое архива app.zip в /Applications, тем самым подменяя легитимный Ledger Live на вредоносный;

  6. Зачищает следы:

    • Удаляет архив /tmp/app.zip;

функция replaceApp
функция replaceApp

Само же поддельное приложение выглядит следующим образом, уведомляя нас о том, что якобы была обнаружена подозрительная активность, поэтому нас выкинуло из аккаунта Ledger:

Поддельное приложение Ledger Live
Поддельное приложение Ledger Live

После нажатия «Restore» открывается страница для ввода seed‑фраз, очевидно, что он используется для кражи seed‑фраз кошелька Legder

Поддельное приложение Ledger Live
Поддельное приложение Ledger Live

Впрочем о данной «фиче» давно было известно из официального Telegram‑канала стиллера

Скрин из Telegram-канала
Скрин из Telegram-канала

GrabFolderLimit - Ограниченный сбор пользовательских файлов

Функция GrabFolderLimit рекурсивно копирует содержимое директорий (T1005, T1074.001):

  1. Пропускает файлы и папки из заранее заданного списка исключений (exceptionsList)

  2. Суммарный размер скопированных файлов ограничен 10 МБ

  3. Сохраняет структуру каталогов при копировании

Функция GrabFolderLimit
Функция GrabFolderLimit

GrabFolder - Сбор пользовательских файлов

Функция GrabFolder делает все то же самое, что и GrabFolderLimit, но не ограничена суммарным размеров файлов

Функция GrabFolder
Функция GrabFolder

parseFF - сбор данных с FireFox

Функция parseFF используется для сбора данных с браузера Firefox (T1555.003, T1005, T1074.001)

Подробнее:

  1. Определяет ключевые файлы для сбора

    • /cookies.sqlite — куки;

    • /formhistory.sqlite — история форм;

    • /key4.db — ключ шифрования профиля;

    • /logins.json — сохранённые логины и пароли;

  2. Проходит по каждому профилю в указанной директории браузера

  3. Копирует все перечисленные файлы во временную рабочую директорию, сохраняя структуру профиля

Функция parseFF
Функция parseFF

Так же можно заметить какие еще профили форков Firefox прописаны:

Профили Firefox-based
Профили Firefox-based

CheckValid - проверка корректности введённого/сохранённого пароля

Функция checkvalid проверяет правильно ли введены логин и пароль пользователя MacOS, а далее возвращает true, если аутентификации успешна и false - если нет

Функция checkvalid
Функция checkvalid

Получение пароля пользователя

Функция getpwd пытается получить доступ к паролю Chrome из связки ключей macOS
Если это не удаётся, подсовывает пользователю фишинговое системное окно, чтобы украсть его пароль к учётке.

Сохраняет пароль в во временную рабочую директорию (writemind).

Подробнее:

  1. Попытка получения пароля из macOS Keychain

    • Выполняется проверка корректности логина без пароля через функцию checkvalid;

    • Если проверка успешна, выполняется команда: security find-generic-password -ga "Chrome" | awk "{print $2}", эта команда пытается получить пароль от Chrome из связки ключей;

    • Полученный пароль записывается во временную рабочую директорию в файл masterpass-chrome;

  2. Фишинговый сценарий при неудаче:

    • Если пароль не удалось получить «легальным способом» или проверка checkvalid не успешна, функция запускает диалоговое окно macOS (display dialog), маскируя его под системное уведомление;

    • Пользователь вводит пароль вручную;

    • Скрипт проверяет введённый пароль через checkvalid;

    • Если пароль корректен, он сохраняется в во временную рабочую директорию в файл pwd;

  3. Возврат результата:

    • Функция возвращает строку с полученным паролем (из keychain или введённый пользователем);

    • Если пароль не был получен - возвращает пустую строку

Функция getpwd
Функция getpwd
Фишинговое окно
Фишинговое окно

GrabPlugins

Функция grabPlugins ищет и копирует данные определённых плагинов/расширений браузера, включая IndexedDB и LevelDB, потенциально получая учётные данные и локальные хранилища

Подробнее:

  1. Сканирование папки плагинов

    • Функция получает список файлов и папок в paths;

    • Для каждого элемента проверяет, содержится ли он в pluginList;

  2. Сбор данных

    • Если элемент совпадает с целевым плагином, формируется путь к исходным данным (newpath) и путь для сохранения (newsavepath);

    • Если параметр index = true, к newsavepath добавляется /IndexedDB/;

    • Функция вызывает GrabFolder, чтобы рекурсивно скопировать файлы из исходного пути в целевую директорию;

  3. Сбор дополнительных локальных хранилищ

    • Независимо от конкретного плагина, копируются данные из папки Local Storage/leveldb/ в savePath;

Функция grabPlugins
Функция grabPlugins

Сбор данных с Chromium

После мы видим функцию chromium, которая на самом деле является полноценным модулем для сбора данных из chromium-based браузеров, включая логины, пароли, расширения IndexedDB, автозаполненных форм, плагинов и тд.
Можно увидеть большой список ID расширений chrome

Подробнее:

  1. Определение целевых расширений

    • Создаётся список pluginList, содержащий ID интересующих расширений;

  2. Определение ключевых файлов браузеров

    • Файлы, которые нужно скопировать: /Network/Cookies, /Cookies, /Web Data, /Login Data, /Local Extension Settings/, /IndexedDB/;

  3. Обход профилей браузеров

    • Проверяются папки профиля (Default или Profile*);

    • Для каждого ключевого файла выполняются различные действия;

    • /Network/Cookies -> переименовывается в /Cookies;

    • /Local Extension Settings/ -> вызывается функция grabPlugins для копирования расширений;

    • /IndexedDB/ -> также вызывается grabPlugins с параметром index=true;

    • Остальные файлы копируются напрямую с помощью readwrite;

  4. Сбор расширений и локальных хранилищ

    • Через grabPlugins собираются IndexedDB, LevelDB и другие локальные данные расширений браузера;

  5. Сохранение данных

    • Все собранные данные складываются в структуру папок внутри writemind, с учётом названия браузера и профиля;

Список плагинов на скрине был намеренно уменьшен, поскольку в нем хранится 197 строк ID плагинов

Функция chromium
Функция chromium

Функция chromium так же использует массив chromiumMap, где описан для определения путей профилей каждого из chromium-based браузера, как можем видеть, данные собираются из следующих браузеров: Chrome, Brave, Edge, Opera, OperaGX, Chrome Beta, Chrome Canary, Chromium, Chrome Dev, Arc и Coccoc

Однако мы не видим браузера Яндекс (который тоже основан на Chromium), как это было заявлено в их Telegram-канале. Либо это особенность конфигурации, заданой при генерации билда, либо разработчики по какой-то причине отказались собирать с Яндекса данные

Теперь важно разобраться, какие именно расширения являются целью злоумышленников.
Сделать это довольно просто, достаточно написать скрипт, который пробежится по каждому ID в URL https://chrome.google.com/webstore/detail/ и соберёт названия расширений

Скрипт для сбора названий расширений
Скрипт для сбора названий расширений
Результат работы скрипта
Результат работы скрипта

Полный список:

Скрытый текст

ppdadbejkmjnefldpcdjhnkpbjkikoip: ROSE Wallet

ppbibelpcjmhbdihakflkdcoccbgbkpo: UniSat Wallet

pocmplpaccanhmnllbbkpgfliimjljgo: Slope Wallet

pnndplcbkakcplkjnolgbkdgjikjednm: Tron Wallet & Explorer - Tronium

pnlccmojcmeohlpggmfnbbiapkmbliob: RoboForm Password Manager

phkbamefinggmakgklpkljjmgibohnba: Pontem Crypto Wallet - Eth, Sol, BTC +

pgiaagfkgcbnmiiolekcfmljdagdhlcm: Stargazer Wallet

pdadjkfkgcafgbceimcpbkalnfnepbnk: KardiaChain Wallet

pcndjhkinnkaohffealmlmhaepkpmgkb: Meteor Wallet

papngmkmknnmfhabbckobgfpihpdgplk: BearBy

panpgppehdchfphcigocleabcmcgfoca: Desig Wallet

opfgelmcmbiajamepnmloijbpoleiama: Rainbow

opcgpfmipidbgpenhmajoajpbobppdil: Slush — A Sui wallet

ookjlbkiijinhpmnjffcofjonbfbgaoc: Temple Wallet

onhogfjeacnfoofkfgppdlbmlmnplgbn: SubWallet - Polkadot Wallet

omaabbefbmiijedngplfjmnooppbclkk: Tonkeeper — wallet for TON

ojggmchlghnjlapmfbnjholfjkiidbch: Venom Wallet

ojbcfhjmpigfobfclfflafhblgemeidi: Glow - Solana Wallet BETA

ocjobpilfplciaddcbafabcegbilnbnb: XPLA Vault Wallet

oboonakemofpalcgghocfoadofidjkkk: KeePassXC-Browser

oafedfoadhdjjcipmcbecikgokpaphjk: CoinWallet: BTC Crypto Wallet

nphplpgoakhhjchkkhmiggakijnkhfnd: TON Wallet

nopnfnlbinpfoihclomelncopjiioain: Viction Wallet

nngceckbapebfimnlniiiahkandclblb: Bitwarden Password Manager

nlgnepoeokdfodgjkjiblkadkjbdfmgd: Multi Wallet

nlgbhdfgdhgbiamfdfmbikcdghidoadd: Byone

nknhiehlklippafakaeklbeglecifhad: Nabox Wallet

nkbihfbeogaeaoehlefnkodbefgpgknn: MetaMask

nhnkbkgjikgcigadomkphalanndcapjk: CLV Wallet

nhlnehondigmgckngjomcpcefcdplmgc: Fearless Wallet

nhbicdelgedinnbcidconlnfeionhbml: Begin: Bitcoin Cardano Wallet

nbdpmlhambbdkhkmbfpljckjcmgibalo: Halo

nbdhibgjnjpnkajaghbffjbkcgljfgdi: Ramper Wallet

naepdomgkenhinolocfifgehidddafch: Browserpass

mnfifefkajgofkcjkemidiaecocnkjeh: TezBox - Tezos Wallet

mmmjbcfofconkannjonfmjjajpllddbg: Fluvi Wallet

mmhlniccooihdimnnjhamobppdhaolme: Kee - Password Manager

mmclamjkknobggpiohfneimmnlggagok: LEDGIS Wallet Chrome Extension

mjgkpalnahacmhkikiommfiomhjipgjn: Reef Chain Wallet Extension

mgffkfbidihjpoaomajlbgchddlicgpn: Pali Wallet

mfhbebgoclkghebffdldpobeajmbecfk: StarMask

mfgccjchihfkkindfppnaooecgfneiii: TokenPocket - Web3 & Crypto Wallet

mdjmfdffdcmnoblignmgpommbefadffd: unknown

mcohilncbfahbmgdjkbpemcciiolgcge: OKX Wallet

mapbhaebnddapnmifbbkgeedkeplgjmf: Biport Wallet

lpilbniiabackdjcionkobglmddfbcjo: Keeper Wallet

lpfcbjknijpeeillifnkikgncikgfhdo: Nami

loinekcabhlmhjjbocijdoimmejangoa: Glass wallet | Sui wallet

lmkncnlpeipongihbffpljgehamdebgi: DPal:Wallet for DogeCoin

lgmpcpglpngdoalbgeoldeajfclnhafa: SafePal Extension Wallet

lgbjhdkjmpgjgcbcdlhkokkckpjmedgc: unknown

ldinpeekobnhjjdofggfgjlcehhmanlj: Leather

lcmncloheoekhbmljjlhdlaobkedjbgd: Echooo Wallet

lccbohhgfkdikahanoclbdmaolidjdfl: Wigwam — Web3 Wallet

kncchdigobghenbbaddojjnnaogfppfj: iWallet

kmhcihpebfmpgmihbkipmjlmmioameka: Eternl

kmcfomidfpdkfieipokbalgegidffkal: Enpass Password Manager

klnaejjgbibmhlephnhpmaofohgkpgkd: ZilPay

klghhnkeealcohjjanjjdaeeggmfmlpl: Zerion Wallet: Crypto & DeFi

kkpllkodjeloidieedojogacfhpaihoh: Enkrypt: ETH, BTC and Solana Wallet

kkpllbgjhchghjapjbinnoddmciocphm: Ninji Wallet

kkilomkmpmkbdnfelcpgckmpcaemjcdh: CeloExtensionWallet

kilnpioakcdndlodeeceffgjdpojajlo: Aurox Wallet

khpkpbbcccdmmclmpigdgddabeilkdpd: Suiet | Sui Wallet

kglcipoddmbniebnibibkghfijekllbl: Kerberus Sentinel3

kfdniefadaanbjodldohaedphafoffoh: Typhon Wallet

keenhcnmdmjjhincpilijphpiohdppno: 5ire Wallet

kbdcddcmgoplfockflacnnefaehaiocb: unknown

jojhfeoedkpkglbfimdfabpdfjaoolaf: Polymesh Wallet

jnmbobjmhlngoefaiojfljckilhhlhcj: OneKey

jnlgamecbpmbajjfhmmmlhejkemejdma: Braavos: Bitcoin & Starknet Wallet

jnldfbidonfeldmalbflbmlebbipcnle: Bitfinity Wallet

jnkelfanjkeadonecabehalmbgpfodjm: Goby

jkoeaghipilijlahjplgbfiocjhldnap: Mask Network

jkjgekcefbkpogohigkgooodolhdgcda: Pay with BitPay

jiidiaalihmmhddjgbnbgdfflelocpak: Bitget Wallet - Crypto, Web3 | Bitcoin & USDT

jiepnaheligkibgcjgjepjfppgbcghmp: Doge Labs Wallet

jhfjfclepacoldmjmkmdlmganfaalklb: Splikity

jgnfghanfbjmimbdmnjfofnbcgpkbegj: KeePassHelper Password Manager

jfmajkmgjpjognffefopllhaijknhnmm: Walless

jcacnejopjdphbnjgfaaobbfafkihpep: Hive Keychain

jbppfhkifinbpinekbahmdomhlaidhfm: iWallet Pro

jblndlipeogpafnldhgmapagcccfchpi: Kaia Wallet

jbkgjmpfammbgejcpedggoefddacbdia: Parallel wallet

iokeahhehimjnekafflcihljlcjccdbe: Alby - Bitcoin Wallet for Lightning & Nostr

inlkhilmjmjomfcpdifpfgllhhlpnbej: Unielon

ilhaljfiglknggcoegeknjghdgampffk: Beam Web Wallet

igkpcodhieompeloncfnbekccinhapdb: Zoho Vault - Password Manager

ifckdpamphokdglkkdomedpdegcjhjdp: ONTO Wallet

idnnbdplmphpflfnlkomgpfbpcgelopg: Xverse: Bitcoin Crypto Wallet

icpikagpkkbldbfjlbefnmmmcohbjije: Z3US

icblpoalghoakidcjiheabnkijnklhhe: PIP

ibnejdfjmmkpcnlpebklmnkoeoihofec: TronLink

hpclkefagolihohboafpheddmmgdffjm: Flow Wallet

hpbgcgmiemanfelegbndmhieiigkackl: Monsta Wallet

hnfanknocfeofbddgcijnmhnfnkdnaad: Coinbase Wallet extension

hmeobnfnfcmdkdcmlblgagmfpfboieaf: Ctrl Wallet

hifafgmccdpekplomjjkcfgodnhcellj: Crypto.com | Onchain Extension

hdokiejnpimakedhajhdlcegeplioahd: LastPass: Free Password Manager

hbbgbephgojikajhfbomhlmmollphcad: Rise - Aptos Wallet

gpnihlnnodeiiaakbikldcihojploeca: NuFi

gkeelndblnomfmjnophbhfhcjbcnemka: Bitverse Wallet

gjlmehlldlphhljhpnlddaodbjjcchai: Nautilus Wallet

gjkdbeaiifkpoencioahhcilildpjhgh: Parti Wallet

gjagmgiddbbciopjhllkdnddhcglnemk: Hashpack

ginchbkmljhldofnbjabmeophlhdldgp: PolkaGate: The gateway to the Polkadot eco.

ghlmndacnhlaekppcllcpcjjjomjkjpg: Wizz Wallet

gdokollfhmnbfckbobkdbakhilldkhcj: Alephium Extension Wallet

gbjepgaebckfidagpfeioimheabiohmg: ZEON Wallet

gafhhkghbfjjkeiendhlofajokpaflmk: Lace

gadbifgblmedliakbceidegloehmffic: Paragon

fpkhgmpbidmiogeglndfbkegfdlnajnf: Cosmostation Wallet

fpibioaihcagphbidhodidjbnclocgll: unknown

fopmedgnkfpebgllppeddmmochcookhc: Suku Wallet

fnjhmkhhmkbjkkabndcnnogagogbneec: Ronin Wallet

fmhmiaejopepamlcjkncpgpdjichnecm: KeePass Tusk - Password Access and Autofill

fmblappgoiilbgafhjklehhfifbdocee: Forbole X

flpiciilemghbmfalicajoolhkkenfel: ICONex

fijngjgcjhjmmpcmkeiomlglpeiijkld: Talisman Wallet

fiikommddbeccaoicoejoniammnalkfa: Nightly

fhilaheimglignddkjgofkcbgekhenbh: Oxygen - Atomic Crypto Wallet

fhbohimaelbohpjbbldcngcnapndodjp: BEW lite

fghhpjoffbgecjikiipbkpdakfmkbmig: IDRISS

ffnbelfdoeiohenkjibnmadjiehjhajb: Yoroi

fcfcfllfndlomdhbehjjcoimbgofdncg: Leap Wallet

fcckkdbjnoikooededlapcalpionmalo: MOBOX WALLET

epapihdplajcdnnkdeiahlgigofloibg: Sender Wallet

eomhlheglneofffmbfjflldlbcnhpkpb: TronBoss

eokbbaidfgdndnljmffldfgjklpjkdoi: Fluent

enabgbdfcbaehmbigakijjabdpdnimlg: unknown

emeeapjkbcbpbpgaagfchmcgglmebnen: Surf Wallet

elalghlhoepcjfaedkcmjolahamlnjcp: Bitgreen Wallet

ejjladinnckdgjemekebdpeokbikhfci: Petra Aptos Wallet

einnioafmpimabjcddiinlhmijaionap: Wander

egjidjbpglichdcondbcbdnbeeppgdph: Trust Wallet

efbglgofoippbgcjepnhiblaibcnclgk: Martian Aptos & Sui Wallet Extension

ebfidpplhabeedpnhjnobghokpiioolj: Fewcha Move Wallet

eamiofncoknfkefhlkdblngblpffehek: Verto - Multichain Crypto Wallet for DEFI

eajafomhmkipbjmfmhebemolkcicgfmd: Taho

dphoaaiomekdhacmfoblfblmncpnbahm: ChromeKeePass

dngmlblcodfobpdpecaadgfbcggfjfnm: MultiversX Wallet

dmkamcknogkgcdfhhbddcghachkejeap: Keplr

dldjpboieedgcmpkchcjcbijingjcgok: Fuel Wallet

dlcobpjiigpikoobohmabehhmhfoodbb: Ready Wallet (Formerly Argent)

dkdedlpgdmmkkfjabffeganieamfklkm: Cyano Wallet

dbgnhckhnppddckangcjbkjnlddbjkna: Fin Wallet For Sei

cpmkedoipcpimgecpmgpldfpohjplkpp: Gate Wallet

cphhlgmgameodnhkjdmkpanlelnlohao: NeoLine

copjnifcecdedocejpaapepagaodgpbh: Freak's Axie Extension

cnncmdhjacpkmjmkcafchppbnpnhdmon: HAVAH Wallet

cnmamaachppnkjgnildpdmkaakejnhae: Auro Wallet

cmndjbecilbocjfkibfbifhngkdmjgog: Swash

ckklhkaabbmdjkahiaaplikpdddkenic: Internet Money | Crypto Wallet

cjmkndjhnagcfbpiemnkdpomccnjblmj: Finnie

cihmoadaighcejopammfbmddcmdekcje: LeafWallet - Easy to use EOS wallet

chgfefjpcobfbnpmiokfjjaglahmnded: CommonKey

cgeeodpfagjceefieflmdfphplkenlfk: EVER Wallet

cflgahhmjlmnjbikhakapcfkpbcmllam: OORT Wallet

cfbfdhimifdmdehjmkdobpcjfefblkjm: Plug

caljgklbbfbcjjanaijlacgncafpegll: Avira Password Manager

bopcbmipnjdcdfflfgjdgdjejmgpoaab: BlockWallet

bofddndhbegljegmpmnlbhcejofmjgbn: eckoWALLET

bocpokimicclpaiekenaeelehdjllofo: XDCPay

bmikpgodpkclnkgmnpphehdgcimmided: MYKI Password Manager & Authenticator

bmabahhenimmnfijaiccmonalfhpcndh: Relation ONE

bkklifkecemccedpkhcebagjpehhabfb: MetaWallet

bkgplkpdgidlgmnlhdfakhcjfpfgjjkb: Ancient8 Wallet by Coin98

bifidjkcdpgfnlbcjpdkdcnbiooooblg: Fuelet Wallet | Fuel

bhhhlbepdkbapadjdnnojkbgioiodbic: Solflare Wallet

bhghoamapcdpbohphigoooaddinpkbai: Authenticator

bgpipimickeadkjlklgciifhnalhdjhe: Gero Dashboard

bgjogpoidejdemgoochpnkmdjpocgkha: Ecto Wallet

bfnaelmomeimhlpmgjnjophhpkkoljpa: Phantom

bcopgchhojmggmffilplmbdicgaihlkp: Hycon Lite Client

apnehcjmnengpnmccpaibjmhhoadaico: CWallet

anokgmphncpekkhclmingpimjmcooifb: Compass Wallet for Sei

amkmjjmmflddogmhpjloimipbofnfjih: Wombat - Gaming Wallet for Ethereum & EOS

algblmhagnobbnmakepomicmfljlbehg: ADS Wallet

ajopcimklncnhjednieoejhkffdolemp: Quantum Wallet

ajkifnllfhikkjbjopkhmjoieikeihjb: Moso Extension

aijcbedoijmgnlmjeegjaglmepbmpkpi: Leap Terra Wallet

aiifbnbfobpmeekipheeijimdpnlpgpp: Station Wallet

aiaghdjafpiofpainifbgfgjfpclngoh: Safeheron

aholpfdialjgjfhomihkjbmgjidlcdno: Exodus Web3 Wallet

ahidmapichficbkfglbhgmhjcojjmlnm: AlphaOS

agoakfejjabomempkjlepdflaleeobhb: Core | Crypto Wallet & NFT Extension

aflkmfhebedbjioipglgcbcmnbpgliof: Backpack

afbcbjpbpfadlkmhmclhkeeodmamcflc: MathWallet

aeachknmefphepccionboohckonoeemg: Coin98 Wallet Extension: Crypto & Defi

admmjipmmciaobhojoghlmleefbicajg: Norton Password Manager

acmacodkjbdgmoleebolmdjonilkdbch: Rabby Wallet

abogmiocnneedmmepnohnhlijcjpcifd: unknown

abjfbanhppgiflmobebfffbijcfoeiao: Kontos

abamjefkidngfegdjbmffdmbgjgpaobf: Doter

Криптокошельки

ROSE Wallet, UniSat Wallet, Slope Wallet, Tron Wallet & Explorer - Tronium, Pontem Crypto Wallet - Eth, Sol, BTC +, Stargazer Wallet, KardiaChain Wallet, Meteor Wallet, BearBy, Desig Wallet, Rainbow, Slush — A Sui wallet, Temple Wallet, SubWallet - Polkadot Wallet, Tonkeeper — wallet for TON, Venom Wallet, Glow - Solana Wallet BETA, XPLA Vault Wallet, CoinWallet: BTC Crypto Wallet, TON Wallet, Viction Wallet, Multi Wallet, Byone, Nabox Wallet, MetaMask, CLV Wallet, Fearless Wallet, Begin: Bitcoin Cardano Wallet, Halo, Ramper Wallet, TezBox - Tezos Wallet, Fluvi Wallet, LEDGIS Wallet Chrome Extension, Reef Chain Wallet Extension, Pali Wallet, StarMask, TokenPocket - Web3 & Crypto Wallet, OKX Wallet, Biport Wallet, Keeper Wallet, Nami, Glass wallet | Sui wallet, DPal:Wallet for DogeCoin, SafePal Extension Wallet, Echooo Wallet, Wigwam — Web3 Wallet, iWallet, Eternl, ZilPay, Zerion Wallet: Crypto & DeFi, Enkrypt: ETH, BTC and Solana Wallet, Ninji Wallet, CeloExtensionWallet, Aurox Wallet, Suiet | Sui Wallet, Typhon Wallet, 5ire Wallet, Polymesh Wallet, OneKey, Braavos: Bitcoin & Starknet Wallet, Bitfinity Wallet, Goby, Mask Network, Pay with BitPay, Bitget Wallet - Crypto, Web3 | Bitcoin & USDT, Doge Labs Wallet, Splikity, Hive Keychain, iWallet Pro, Kaia Wallet, Parallel wallet, Alby - Bitcoin Wallet for Lightning & Nostr, Unielon, Beam Web Wallet, ONTO Wallet, Xverse: Bitcoin Crypto Wallet, Z3US, PIP, TronLink, Flow Wallet, Monsta Wallet, Coinbase Wallet extension, Ctrl Wallet, Crypto.com | Onchain Extension, Rise - Aptos Wallet, NuFi, Bitverse Wallet, Nautilus Wallet, Parti Wallet, Hashpack, PolkaGate: The gateway to the Polkadot eco., Wizz Wallet, Alephium Extension Wallet, ZEON Wallet, Lace, Paragon, Cosmostation Wallet, Suku Wallet, Ronin Wallet, Forbole X, ICONex, Talisman Wallet, Oxygen - Atomic Crypto Wallet, BEW lite, Yoroi, Leap Wallet, MOBOX WALLET, Sender Wallet, TronBoss, Fluent, Surf Wallet, Bitgreen Wallet, Petra Aptos Wallet, Wander, Trust Wallet, Martian Aptos & Sui Wallet Extension, Fewcha Move Wallet, Verto - Multichain Crypto Wallet for DEFI, CWallet, Compass Wallet for Sei, Wombat - Gaming Wallet for Ethereum & EOS, ADS Wallet, Quantum Wallet, Moso Extension, Leap Terra Wallet, Station Wallet, Safeheron, Exodus Web3 Wallet, AlphaOS, Core | Crypto Wallet & NFT Extension, Backpack, MathWallet, Coin98 Wallet Extension: Crypto & Defi, Rabby Wallet, Kontos, Doter.

Менеджеры паролей

RoboForm Password Manager
Bitwarden Password Manager
KeePassXC-Browser
Kee – Password Manager
Enpass Password Manager
Zoho Vault - Password Manager
Browserpass
LastPass: Free Password Manager
ChromeKeePass
MYKI Password Manager & Authenticator
Norton Password Manager
Avira Password Manager
KeePassHelper Password Manager

Аутентификаторы

Authenticator
Kerberus Sentinel3
CommonKey
Relation ONE

Процентное соотношение: криптокошельки - 87,6%, менеджеры паролей - 7,2%, аутентификаторы (2FA) - 2,1%, неизвестно - 3,1%
Количественное соотношение: криптокошельки - 170, менеджеры паролей - 14, аутентификаторы (2FA) - 4, неизвестно - 6

Процентное и количественное соотношение расширений по категориям
Процентное и количественное соотношение расширений по категориям

Сбор данных с Telegram

Функция telegram копирует директорию tdata предоставляя злоумышленнику доступ от аккаунта Telegram

Подробнее:

  1. Определяется путь к папке Telegram Desktop;

  2. Вызывается функция GrabFolder, которая рекурсивно копирует всю содержимое tdata в папку назначения внутри временной рабочей директории

Функция telegram
Функция telegram

Сбор данных с кошельков

Функция deskwallets предназначена для сбора локальных файлов криптовалютных кошельков.

Подробнее:

  1. Для каждого кошелька из списка deskwals:

    • Определяется исходный путь к кошельку;

    • Вызывается функция GrabFolder, которая рекурсивно копирует все файлы кошелька во временную рабочую директорию, сохраняя структуру директорий

Функция deskwallets
Функция deskwallets

Сам же список deskwallets выглядит следующим образом:

Список путей до кошельков
Список путей до кошельков

Функция filegrabber является модулем для сбора данных, основной заложенный функционал:

  1. Создаёт директории для сохранения данных;

  2. Определяет список интересующих расширений (txt, pdf, docx, wallet, key, keys, doc, json, db);

  3. Копирует куки Safari;

  4. Копирует файлы Apple Notes, т.е заметки;

  5. Сканирует пользовательские директории (Desktop, Downloads, Documents);

  6. Копирует файлы с нужными расширениями и ограничениями по размеру до 30мб;

Скрытый текст

С целью безопасности код предоставлен не будет, основной его функционал описан

Подготовка данных к экспорту

  1. Подготовка временной рабочей директории

    • Определяет текущего пользователя;

    • Формирует путь к домашней директории пользователя (profile);

    • Создаёт уникальную временную папку /tmp/<random>/, куда будут собираться данные;

Подготовка временной рабочей директории
Подготовка временной рабочей директории

2. Сбор системной информации

  • Собирает информацию о системе macOS: аппаратное обеспечение, ПО;

  • Сохраняет результат в файл info во временной папке;

Сбор системной информации
Сбор системной информации

3. Получение пароля пользователя

  • Пытается получить существующий пароль из временного файла /tmp/.pass;

  • Если пароль недействителен, вызывается функция getpwd, которая либо берёт пароль из связки ключей macOS, либо подсовывает фишинговое окно для запроса пароля у пользователя;

  • Пароль сохраняется во временной папке для последующей работы;

Получение пароля пользователя
Получение пароля пользователя

4. Копирование конфигураций кошельков и приложений

  • Сохраняет локальные конфигурации кошельков и ключей Binance и TonKeeper;

  • Общий файл связки ключей macOS (login.keychain-db);

Копирование конфигураций кошельков и приложений
Копирование конфигураций кошельков и приложений

5. Сбор заметок и куки Safari

  • Копирует базы данных Apple Notes;

  • Копирует куки Safari из разных директорий;

  • Копирование происходит с использованием функций readwrite и readwrite2;

Сбор заметок и куки Safari
Сбор заметок и куки Safari

6. Сбор данных браузеров и плагинов

  • Использует функцию chromium для сбора данных с chrome-based браузеров;

  • Использует функцию deskwallets для сбора данных с локальных кошельков;

  • Использует функцию telegram для сбора tdata;

  • GrabFolder копирует профили OpenVPN;

Сбор данных браузеров и плагинов
Сбор данных браузеров и плагинов

7. Упаковка данных в архив

  • Собранные файлы из временной папки /tmp/<random> упаковываются в ZIP-архив /tmp/out.zip;

Упаковка данных в архив
Упаковка данных в архив

Эксфильтрация

Наконец дошли и до эксфильтрации данных, она реализуется функцией send_data
Абсолютно ничего сложного в этой функции нет, обыкновенная отправка архива /tmp/out.zip через curl

Функция send_data
Функция send_data

Данные для авторизации на API-эндпоинте /contact выглядят следующим образом
Здесь так же важно отметить, что значения login и build зашифрованы

Подводя итоги, можно сказать, что AMOS демонстрирует неплохо продуманную архитектуру стиллера, нацеленного на MacOS: полностью реализован на AppleScript, с минимальными внешними зависимостями, обладает расширенным функционалом по сбору данных из браузеров, криптокошельков, менеджеров паролей и мессенджеров.

  1. Стиллер использует техники закрепления в системе и подмены приложений

  2. Сбор данных реализован комплексно: браузеры на Chromium, Firefox, локальные криптокошельки, менеджеры паролей, расширения браузеров и мессенджеры (Telegram)

  3. AMOS умеет обходить стандартные меры безопасности, проверяя окружение на виртуальные машины и эмулируемые среды

  4. Собранные данные сохраняются во временную рабочую директорию и далее эксфильтруются на C2-сервер.

На подтверждение компрометации могут указывать следующие артефакты:

  1. Необычные LaunchDaemon / LaunchAgent:

    • Файл /Library/LaunchDaemons/com.finder.helper.plist

    • Запуск неизвестного бинаря .helper или скрипта .agent

  2. Скрытые временные файлы и директории:

    • Папки вида /tmp/<random>/ с большим количеством файлов из пользовательских директорий

    • ZIP-архив /tmp/out.zip

  3. Поддельные приложения:

    • Ledger Live или другие криптокошельки, заменённые на вредоносные версии;

    • Файлы-маркеры типа .private в профиле пользователя

  4. Необычные процессы и сетевое поведение

    • Запуск неизвестных бинарей с постоянной активностью (.helper, .agent)

    • Исходящие соединения на подозрительные C2-сервера (/zxc/app, /contact)

    • Исходящие подключения к адресам из подсети 45.94.47.0/24 (см. тут, тут, тут, тут)

  5. Попытки извлечения паролей:

    • Запросы к macOS Keychain (через security find-generic-password)

    • Появление фишинговых окон для ввода паролей

Комментарии (0)