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

Многие пользователи 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.
Работает следующим образом:
-
Создает Plist-файл для LaunchDaemon:
Label = com.finder.helper - идентификатор службы.
ProgramArguments - указывает на бинарь .agent, который будет запускаться через /bin/bash
RunAtLoad = true - агент запускается автоматически при старте системы
KeepAlive = true - агент автоматически перезапускается, если по какой-то причине завершился
-
Скачивает бинарь с сервера:
Забирает файл app с эндпоинта /zxc/app на сервере botUrl;
Сохраняет его в профиле пользователя как скрытый файл .helper;
Делает его исполняемым (chmod +x);
-
Создаёт скрипт .agent, который:
Работает в бесконечном цикле;
Определяет, какой пользователь сейчас залогинен (/dev/console);
Если это обычный пользователь (не root), запускает .helper под его учётной записью через sudo -u;
-
Устанавливает и запускает LaunchDaemon:
Временно сохраняет plist в /tmp/starter;
Копирует его в /Library/LaunchDaemons/com.finder.helper.plist с владельцем root:wheel;
Загружает службу com.finder.helper c помощью launchctl;

ReplaceApp - подмена приложения
Далее мы видим функцию replaceApp, которая отвечает за замену приложения Ledger Live
-
Проверка и подготовка окружения:
Определяет путь к целевому приложению: /Applications/Ledger Live.app;
Убеждается, что приложение присутствует (через list folder);
Формирует путь к скрытому файлу-маркеру (.private) в профиле пользователя и удаляет старую версию;
-
Создание маркера заражения:
В .private записывается строка "user16"
Вероятно, этот маркер используется для идентификации жертвы или состояния заражения;
-
Загрузка поддельного приложения:
С C2-сервера (appUrl) по эндпоинту /zxc/app.zip скачивается архив с поддельным приложением;
Сохраняет архив по пути /tmp/app.zip;
-
Удаляет оригинальное приложение Ledger Live:
Пробует завершить процесс Ledger Live (через pkill);
С помощью sudo и переданного пароля (pass) полностью удаляет оригинальную директорию приложения из /Applications от имени root;
-
Устанавливает фишинговый Ledger Live:
Распаковывает содержимое архива app.zip в /Applications, тем самым подменяя легитимный Ledger Live на вредоносный;
-
Зачищает следы:
Удаляет архив /tmp/app.zip;

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

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

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

GrabFolderLimit - Ограниченный сбор пользовательских файлов
Функция GrabFolderLimit рекурсивно копирует содержимое директорий (T1005, T1074.001):
Пропускает файлы и папки из заранее заданного списка исключений (exceptionsList)
Суммарный размер скопированных файлов ограничен 10 МБ
Сохраняет структуру каталогов при копировании

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

parseFF - сбор данных с FireFox
Функция parseFF используется для сбора данных с браузера Firefox (T1555.003, T1005, T1074.001)
Подробнее:
-
Определяет ключевые файлы для сбора
/cookies.sqlite
— куки;/formhistory.sqlite
— история форм;/key4.db
— ключ шифрования профиля;/logins.json
— сохранённые логины и пароли;
Проходит по каждому профилю в указанной директории браузера
Копирует все перечисленные файлы во временную рабочую директорию, сохраняя структуру профиля

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

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

Получение пароля пользователя
Функция getpwd пытается получить доступ к паролю Chrome из связки ключей macOS
Если это не удаётся, подсовывает пользователю фишинговое системное окно, чтобы украсть его пароль к учётке.
Сохраняет пароль в во временную рабочую директорию (writemind).
Подробнее:
-
Попытка получения пароля из macOS Keychain
Выполняется проверка корректности логина без пароля через функцию checkvalid;
Если проверка успешна, выполняется команда: security find-generic-password -ga "Chrome" | awk "{print $2}", эта команда пытается получить пароль от Chrome из связки ключей;
Полученный пароль записывается во временную рабочую директорию в файл masterpass-chrome;
-
Фишинговый сценарий при неудаче:
Если пароль не удалось получить «легальным способом» или проверка checkvalid не успешна, функция запускает диалоговое окно macOS (display dialog), маскируя его под системное уведомление;
Пользователь вводит пароль вручную;
Скрипт проверяет введённый пароль через checkvalid;
Если пароль корректен, он сохраняется в во временную рабочую директорию в файл pwd;
-
Возврат результата:
Функция возвращает строку с полученным паролем (из keychain или введённый пользователем);
Если пароль не был получен - возвращает пустую строку


GrabPlugins
Функция grabPlugins ищет и копирует данные определённых плагинов/расширений браузера, включая IndexedDB и LevelDB, потенциально получая учётные данные и локальные хранилища
Подробнее:
-
Сканирование папки плагинов
Функция получает список файлов и папок в paths;
Для каждого элемента проверяет, содержится ли он в pluginList;
-
Сбор данных
Если элемент совпадает с целевым плагином, формируется путь к исходным данным (newpath) и путь для сохранения (newsavepath);
Если параметр index = true, к newsavepath добавляется /IndexedDB/;
Функция вызывает GrabFolder, чтобы рекурсивно скопировать файлы из исходного пути в целевую директорию;
-
Сбор дополнительных локальных хранилищ
Независимо от конкретного плагина, копируются данные из папки Local Storage/leveldb/ в savePath;

Сбор данных с Chromium
После мы видим функцию chromium, которая на самом деле является полноценным модулем для сбора данных из chromium-based браузеров, включая логины, пароли, расширения IndexedDB, автозаполненных форм, плагинов и тд.
Можно увидеть большой список ID расширений chrome
Подробнее:
-
Определение целевых расширений
Создаётся список pluginList, содержащий ID интересующих расширений;
-
Определение ключевых файлов браузеров
Файлы, которые нужно скопировать: /Network/Cookies, /Cookies, /Web Data, /Login Data, /Local Extension Settings/, /IndexedDB/;
-
Обход профилей браузеров
Проверяются папки профиля (Default или Profile*);
Для каждого ключевого файла выполняются различные действия;
/Network/Cookies -> переименовывается в /Cookies;
/Local Extension Settings/ -> вызывается функция grabPlugins для копирования расширений;
/IndexedDB/ -> также вызывается grabPlugins с параметром index=true;
Остальные файлы копируются напрямую с помощью readwrite;
-
Сбор расширений и локальных хранилищ
Через grabPlugins собираются IndexedDB, LevelDB и другие локальные данные расширений браузера;
-
Сохранение данных
Все собранные данные складываются в структуру папок внутри writemind, с учётом названия браузера и профиля;
Список плагинов на скрине был намеренно уменьшен, поскольку в нем хранится 197 строк ID плагинов

Функция 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
Подробнее:
Определяется путь к папке Telegram Desktop;
Вызывается функция GrabFolder, которая рекурсивно копирует всю содержимое tdata в папку назначения внутри временной рабочей директории

Сбор данных с кошельков
Функция deskwallets предназначена для сбора локальных файлов криптовалютных кошельков.
Подробнее:
-
Для каждого кошелька из списка deskwals:
Определяется исходный путь к кошельку;
Вызывается функция GrabFolder, которая рекурсивно копирует все файлы кошелька во временную рабочую директорию, сохраняя структуру директорий

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

Функция filegrabber является модулем для сбора данных, основной заложенный функционал:
Создаёт директории для сохранения данных;
Определяет список интересующих расширений (txt, pdf, docx, wallet, key, keys, doc, json, db);
Копирует куки Safari;
Копирует файлы Apple Notes, т.е заметки;
Сканирует пользовательские директории (Desktop, Downloads, Documents);
Копирует файлы с нужными расширениями и ограничениями по размеру до 30мб;
Скрытый текст
С целью безопасности код предоставлен не будет, основной его функционал описан

Подготовка данных к экспорту
-
Подготовка временной рабочей директории
Определяет текущего пользователя;
Формирует путь к домашней директории пользователя (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;

6. Сбор данных браузеров и плагинов
Использует функцию chromium для сбора данных с chrome-based браузеров;
Использует функцию deskwallets для сбора данных с локальных кошельков;
Использует функцию telegram для сбора tdata;
GrabFolder копирует профили OpenVPN;

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

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

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

Подводя итоги, можно сказать, что AMOS демонстрирует неплохо продуманную архитектуру стиллера, нацеленного на MacOS: полностью реализован на AppleScript, с минимальными внешними зависимостями, обладает расширенным функционалом по сбору данных из браузеров, криптокошельков, менеджеров паролей и мессенджеров.
Стиллер использует техники закрепления в системе и подмены приложений
Сбор данных реализован комплексно: браузеры на Chromium, Firefox, локальные криптокошельки, менеджеры паролей, расширения браузеров и мессенджеры (Telegram)
AMOS умеет обходить стандартные меры безопасности, проверяя окружение на виртуальные машины и эмулируемые среды
Собранные данные сохраняются во временную рабочую директорию и далее эксфильтруются на C2-сервер.
На подтверждение компрометации могут указывать следующие артефакты:
-
Необычные LaunchDaemon / LaunchAgent:
Файл /Library/LaunchDaemons/com.finder.helper.plist
Запуск неизвестного бинаря .helper или скрипта .agent
-
Скрытые временные файлы и директории:
Папки вида /tmp/<random>/ с большим количеством файлов из пользовательских директорий
ZIP-архив /tmp/out.zip
-
Поддельные приложения:
Ledger Live или другие криптокошельки, заменённые на вредоносные версии;
Файлы-маркеры типа .private в профиле пользователя
-
Необычные процессы и сетевое поведение
-
Попытки извлечения паролей:
Запросы к macOS Keychain (через security find-generic-password)
Появление фишинговых окон для ввода паролей