Введение
Это же просто криптомайнер… Никто и подумать не мог, что это всего лишь маска, под которой скрывается модульный фреймворк с поддержкой и Linux, и Windows, встроенной поддержкой TOR для связи с командным сервером, и с возможностью обновления через доверенные сайты — GitLab, GitHub и Bitbucket. Усилия, затраченные на это «творение», впечатляют.
С чего все началось
В 2022 году сработали два детекта в системном процессе WININIT.EXE. Все бы ничего, но детекты были написаны на очень старый код вредоносного ПО Equation. Последующий анализ выявил более ранние версии обнаруженного кода, датированные 2017 годом. Тогда его ошибочно посчитали обычным майнером. И хотя он действительно им был, это оказалась не основная его задача.
Чтобы окончательно во всем разобраться, мы решили провести более детальный анализ. Неожиданно для нас криптомайнер оказался лишь одним из компонентов чего-то гораздо более крупного. Для проникновения в систему этот зловред использовал собственную версию эксплойта EternalBlue. И что особенно важно, в ходе исследования мы ориентировались на время создания обнаруженных файлов и обнаружили, что этот эксплойт был создан раньше апреля 2017 года, тогда как всем известный эксплойт EternalBlue был опубликован группой Shadow Brokers только 14 апреля 2017 года.
От остальных зловредов, использующих EternalBlue, этот отличается системой распространения: он незаметно и успешно обходит большинство защитных решений. Подробные результаты исследования мы опубликовали в закрытом отчете, а в данной статье мы приведем их краткий обзор.
Заражение
Первый обнаруженный в процессе WININIT.EXE шелл-код может загружать бинарные файлы с bitbucket[.]org и выполнять скрипты для PowerShell. Изначально мы не знали вектор заражения, но в ходе расследования обнаружили эксплойт для SMBv1, подозрительно похожий на эксплойт EternalBlue.
Эксплойт внедряет в ядро системы шелл-код, который в свою очередь, внедряет ещё один шелл-код уже в пользовательский процесс. После этого скачивается «полезная нагрузка», которая включает в себя фреймворк с возможностью расширения функциональности при помощи плагинов, а также очень легкий TOR-клиент. По завершении процесса заражения зловред сам отключает протокол SMBv1 в системе, и лазейка закрывается, что исключает повторное заражение.
За счет функциональности «червя» зловред впоследствии пытается распространиться по сети жертвы. При этом опираясь не только на эксплойт, но и на протокол SSH, используя найденные у жертвы SSH-ключи и пароли.
Репозиторий Bitbucket
Для уменьшения размера первоначального эксплойта, из него исключено все, что можно вынести в последующий этап заражения, в котором используется специальный зашифрованный и сжатый бинарный архив. Архив размещается на легальных сайтах под видом бинарных файлов прошивок для неких устройств названных m100.
Используемый для этих целей репозиторий на Bitbucket был создан 21 июня 2018 года учетной записью Julie Heilman, и это единственный репозиторий, связанный с этим профилем.
В репозитории находится только файл README.md внутри которого содержится строчка с названием проекта. А в папке Downloads, в которой обычно содержится скомпилированные файлы проекта, находится пять бинарных файлов: delta.dat, delta.img, ota.dat, ota.img и system.img.
В папке, к сожалению, нет какого-либо версионирования, а счетчик напротив файлов отображает только количество загрузок с момента последнего обновления. Файл system.img в действительности является архивом с полезной нагрузкой и используется для заражения систем Windows. Счетчик загрузок этого файла в точности отражает количество новых заражений именно этой версией файла. На момент исследования последнее обновление файла датировалось 24 февраля 2022 года, а количество новых заражений в июне 2022 года составляло 160 тысяч. Число заражений с момента обновления файла в апреле 2023 года и до сентября 2023 года составило около 60 тысяч.
Для доставки обновлений используются файлы ota.img и delta.img, при этом ota.img соответствует версии для Windows, а delta.img — для Linux. Интересно, что system.img и ota.img функционально идентичны, только в ota.img содержатся дополнительные метаданные для проверки целостности во время обновления. Файл delta.img также используется при заражении Linux-хостов, скомпрометированных через SSH.
Файлы ota.dat и delta.dat используются для проверки наличия новой версии. Стоит отметить, что счетчики загрузок файлов ota.img и delta.img не отражают текущее количество заражений. Это объясняется тем, что в основном обновления доставляются с командного сервера, а обращение к репозиторию происходит только если командный сервер не отвечает.
Во время исследования количество обновлений из репозитория было около миллиона. А на момент написания статьи было зафиксировано всего восемь обновлений для систем Windows и четыре — для Linux, это говорит об одном из двух возможных сценариев: либо количество активных заражений действительно минимально, либо командный сервер активен и нужды в обновлении с использованием репозитория нет.
Закрепление в системе
Зловред использует различные способы для того, чтобы закрепиться в системе, в зависимости от наличия интерпретатора PowerShell и имеющихся в распоряжении системных привилегий. Как правило, при установке через эксплойт зловред уже имеет права администратора, но если заражение произошло через SSH-сервер Cygwin, то он запускается с правами пользователя.
Если PowerShell в системе отсутствует, то в каталоге %APPDATA% создается скрытый MZ-PE загрузчик с произвольным именем, и с копией файла system.img внутри, который регистрируется под похожим на GUID ключом внутри ветки реестра Software\Microsoft\Windows\CurrentVersion\Run.
Если PowerShell присутствует, поведение зловреда будет зависеть от прав доступа. При наличии прав администратора выполняется скрипт PowerShell, который создает две записи планировщика задач с GUID-именами и с различными триггерами для запуска скрипта загрузчика PowerShell.
При отсутствии прав администратора, скрипт-загрузчик маскируется многотысячными пробелами в начале и в конце, и записывается в ключ реестра HKCU\Software\Microsoft\Windows\CurrentVersion\Applets, а его запуск прописывается в ключе HKCU\Software\Microsoft\Windows\CurrentVersion\Run в виде команды:
1 2 3 4 |
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -W Hidden - Command "Invoke-Expression((Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Applets'). '%RegValNameFromPrevStep%'). |
В обоих случаях при наличии PowerShell тело архива system.img прописывается в ключе реестра Software\Microsoft\Windows\CurrentVersion\Shell в виде строки Base64, также окруженной сотнями пробелов.
На Linux-системах, зловредный процесс работает под именем (sd-pam). Закрепление в системе осуществляется уже более обширным набором средств: это может быть системная или пользовательская служба systemd, файл с расширением .desktop в папке автозапуска, или дополнительная строка в одном из подходящих файлов — /etc/rc*, profile, bashrc или inittab. При этом исполняемый файл вредоносной программы находится в каталоге /tmp под случайным именем.
Своя реализация TOR
Командный сервер зловреда расположен в сети TOR по onion адресу: gpiekd65jgshwp2p53igifv43aug2adacdebmuuri34hduvijr5pfjad[.]onion:1111.
Для связи с командным сервером используется собственная, облегченная реализация TOR-клиента. Примечательно, что в её основе не лежит известная реализация TOR с открытым исходным кодом. Многие стандартные функции TOR, к примеру маршрутизация, листинг каталогов, режимы промежуточного и последнего узла, попросту отсутствуют. Также в клиенте нет поддержки управляющих протоколов.
Через регулярные промежутки времени зловред устанавливает TCP-соединение с командным сервером, передавая с уникальным идентификатором жертвы. После этого он ежеминутно отсылает пустые сигнальные сообщения.
Само наличие данной функциональности свидетельствует о большой проделанной работе и очень высоких требованиях к исполнению. Чтобы скрыть командный сервер, злоумышленники с нуля разработали собственный TOR-клиент, а не взяли готовую реализацию. Такой подход к задачам крайне редко встречается среди создателей вредоносного ПО и сильно выделяет данного зловреда на фоне других.
Модули
Сам зловред представляет собой монолитный исполняемый код, с поддержкой подключаемых модулей для расширения или обновления функциональности. Такая архитектура является отличительной чертой APT-угроз. Каждый модуль регистрирует callback-функцию, которая вызывается при установлении или разрыве соединения с командным сервером, или же при получении сообщения от него. Функционально эти модули делятся на два типа: служебные модули и модули расширения функциональности.
Служебные модули
Хранилище настроек
Модуль хранилища настроек хранит конфигурацию зловреда в зашифрованном с помощью алгоритма AES виде. А само хранилище расположено в ключе реестра с именем похожим на GUID, расположенном в ветке реестра HKCU\Software\Classes\TypeLib в версии для Windows. В версии для Linux эта информация скрывается в произвольных скрытых папках, расположенных в домашнем каталоге пользователя.
Обновление/удаление
При первом подключении к командному серверу служебный модуль генерирует и сохраняет 8-байтовый идентификатор жертвы, который затем используется совместно с хэшем файла system.img для передачи данных на сервер. Этот модуль предназначен для реализации всего двух команд:
- сервер присылает новую версию файла system.img, а процесс обновления выполняется либо сгенерированным PS-скриптом, либо сгенерированным исполняемым файлом;
- выполняется полное удаление вредоносных компонентов.
Если связи с командным сервером нет более 20 минут, модуль предпринимает попытку загрузки файла ota.dat (или delta.dat на Linux) с последующей проверкой целостности. Если версия файла изменилась, модуль запускает процедуру обновления, загружая соответствующий IMG-файл: ota.img для Windows и delta.img для Linux.
Функциональные модули
Обратный прокси
Модуль предоставляет доступ к локальной сети жертвы и позволяет выполнять сетевые действия от её имени.
Обработчик различных команд
Модуль включает в себя набор команд для взаимодействия с файловой системой жертвы, создания снимков экрана, получения данных о версии системы и списка активных экранов X11 в Linux. Имеется также команда для выполнения шелл-кода, полученного с командного сервера.
Сборщик учетных данных
Модуль работает в выделенном потоке и производит сканирование системы каждые два часа. При этом он собирает различную конфиденциальную информацию обо всех активных пользователях: логины и пароли на сайтах, а также персональные данные — имя, адрес, номер телефона, компания и должность. Кроме того, модуль собирает сохраненные имена сетей Wi-Fi и связанные с ними пароли, а также учетные данные SSH, FTP и WebDav от популярных программных клиентов, таких как FileZilla, Cyberduck и WinSCP.
Стоит отметить, что поддержка браузеров для сбора учетных данных не ограничивается такими известными браузерами, как Chrome, Firefox и Internet Explorer. Модуль также работает с менее известными браузерами, например Nichrome, Xpom, RockMelt, Vivaldi, SaMonkey, Epic Privacy и Brave.
В версии для Linux он также собирает ключи OpenSSH, хранящиеся в $HOME/.ssh, список известных хостов из $HOME/.ssh/known_hosts, а также способен извлекать секретные данные из хранилища libsecret. Однако данная функция не работает, поскольку в подключенной библиотеке musl libc отсутствует реализация API dlopen.
Планировщик задач
В модуль встроено несколько задач: однократных, повторяемых по расписанию или срабатывающих при условии отображения определенных окон.
Ниже приведены краткие описания этих задач:
- Создание снимков экрана и получение списка окон, видимых в данный момент.
- Выполнение процесса с определенной командной строкой, и перенаправление его вывода с фильтрацией с помощью регулярных выражений.
- Запись с микрофона.
- Составление списка файлов с определенными расширениями, например изображений, документов, аудио, видео, архивов, баз данных, сертификатов, файлов исходного кода и других файлов с критическими данными пользователя. При этом сканируются все локальные диски и сетевые ресурсы, за исключением системных папок. Это единственная задача, работающая в версии зловреда для Linux.
Модуль разведки
Этот модуль собирает обширную системную информацию и передает ее на командный сервер при подключении к нему. Собираются такие сведения, как версия операционной системы, имя компьютера, список аппаратных MAC-адресов, текущее имя пользователя — для Windows, файл /etc/passwd — для Linux; IP-адрес машины, IP-адрес подключенного в данный момент выходного узла сети TOR, время запуска системы, время работы вредоносного ПО, текущее время и часовой пояс, общий и доступный объем памяти, административные привилегии пользователя, а также специфическая информация, связанная с Windows: язык пользовательского интерфейса и раскладки клавиатуры, наличие антивирусного ПО, имя NetBIOS, DNS-домен, данные владельца лицензии Windows, наличие командного интерпретатора PowerShell.
Модули заражения SMBv1 и SSH
Возможности, связанные с распространением вредоносного ПО по сети, реализованы в двух модулях, составляющих основную функциональность червя. После того как модуль сбора учетных данных выполнит свои задачи, в работу вступает модуль заражения SSH. Он проверяет собранные данные на наличие ключей и учетных данных SSH и, если таковые найдены, создает выделенный поток, который работает с паузами в диапазоне от 10 минут до двух часов и инициирует процесс проникновения. Сначала он извлекает delta.dat и delta.img либо из кэша, либо непосредственно из репозитория bitbucket[.]org. После проверки целостности этих файлов динамически загружаются библиотеки libeay, zlib и libssh2 из файла delta.img. Далее идет попытка подключения к удаленному SSH-серверу. При успешном соединении вызывается и анализируется вывод команды /bin/sh -c ‘uname -nmo’. Если удаленная система поддерживается, вредоносное ПО загружает свой бинарный код в удаленную папку /tmp под случайным именем и выполняет его командой /bin/sh -c ‘cat > %s; chmod +x %s; nohup sh -c «%s; rm %s» &>/dev/null’. Данный подход обеспечивает совместимость с архитектурами x86, amd64, arm, aarch64 Linux, а также с удаленными хостами Cygwin x86 и amd64, где используется сгенерированный MZ-PE-загрузчик.
Модуль заражения SMBv1 служит основным средством проникновения в целевые системы Windows с помощью собственного эксплойта EternalBlue. При первом запуске он сразу же отключает протокол SMBv1, изменяя ключ реестра HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters в системе жертвы. Затем запускаются два выделенных потока для выполнения периодических задач червя.
Первый поток отвечает за проверку IP-адреса и маски подсети сетевого адаптера. Затем модуль пытается распространиться по всей подсети локальной сети. При этом второй поток периодически пытается атаковать внешние системы выбирая случайный IP-адрес интернета со следующими исключениями:
- Так называемые bogon-подсети: 0.0.0.0/8, 10.0.0.0/8, 100.64.0.0/10, 127.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 198.18.0.0/15, 224.0.0.0/4, 240.0.0.0/4;
- 169.255.0.0/16 — в основном Южная Африка (возможно, это ошибка и авторы имели в виду 169.254.0.0/16 — отсутствующую часть списка bogon-сетей);
- 3.0.0.0/8, 15.0.0.0/8, 16.0.0.0/8, 56.0.0.0/8 — Amazon, HP, почта США и др.;
- 6.0.0.0/8, 55.0.0.0/8 — штаб-квартира Командования информационных систем армии США (USAISC);
- 7.0.0.0/8, 11.0.0.0/8, 21.0.0.0/8, 22.0.0.0/8, 26.0.0.0/8, 28.0.0.0/8, 29.0.0.0/8, 30.0.0.0/8, 33.0.0.0/8, 214.0.0.0/8, 215.0.0.0/8 — Центр сетевой информации Министерства обороны США (DNIC).
Поддерживаются следующие версии Windows: Windows Vista, Windows 7, Windows Server 2008 R2, Windows 8, Windows Server 2012 и Windows 10 до сборки 14392.
Модуль-криптомайнер Monero
И вишенка на торте — это модуль майнинга Monero. Он работает в отдельном процессе, маскируется под chrome.exe и располагается в каталоге Google\Chrome\Application\Services, который можно найти как в общем, так и в локальном каталоге AppData. Маскировка предполагает в том числе обновление информации о версии и значка процесса замаскированного исполняемого файла. Периодически основной модуль зловреда проверяет подконтрольный ему процесс майнинга и при необходимости перезапускает его. Кроме того, он регулярно сообщает командному серверу хэшрейт, время работы, найденные nonce-числа и статистику ошибок.
DNS-запросы для определения IP-адреса pool-сервера осуществляются посредством «DNS over HTTPS» службы Cloudflare DoH (DNS over HTTPS), ещё более повышая скрытность вредоносного процесса.
Мы практически уверены, что именно этот модуль позволял вредоносному ПО оставаться незамеченным в течение длительного времени и это его главное назначение. Стоит отметить, что 9 января 2018 года криптовалюта Monero, которую майнит этот модуль, достигла максимальной стоимости в 542,33 доллара США (а в 2017 году колебалась около 10 долларов). В 2023 году её цена около 150 долларов США. Хотя этот модуль, возможно, приносит злоумышленникам прибыль, это не самый выгодный способ использования подобных зловредов. Например, охота за незащищенными кошельками с криптовалютой, или за учетными данными web-кошельков, могла бы принести на порядок больше прибыли. Кроме того, наличие незашифрованных строк, связанных с майнингом, еще раз указывает на его вторичность, или даже на то, что этот модуль предназначен только для отвлечения внимания от истинных целей атакующих. Например, на момент проведения исследования сконфигурированный в актуальной версии pool-сервер не отвечал, и, соответственно, модуль майнинга не работал.
ThunderCrypt
В ходе поиска ранних версий зловреда, мы нашли родственный ему по коду шифровальщик под названием ThunderCrypt. Оказалось, что оба зловреда не только имеют одну и ту же кодовую базу, но и, что более важно, взаимодействовали в период активности ThunderCrypt с одним и тем же командным сервером по адресу ghtyqipha6mcwxiz[.]onion:1111.
По функциональности и набору модулей ThunderCrypt очень похож на StripedFly. Они оба используют клиент TOR, имеют хранилище настроек, модуль обновления/удаления и модуль разведки. Заметным исключением стало отсутствие у ThunderCrypt модулей заражения SMBv1 и SSH. Интересно, что на одном из ключевых этапов работы шифровальщика применяется компонент сбора списка файлов из модуля планировщика задач.
Данные телеметрии показывают, что ThunderCrypt впервые был замечен 23 апреля 2017 года, а основной всплеск активности пришелся на май 2017г. Что занимательно, его упоминает онлайн-издание Taiwan News в довольно забавном инциденте. Один пользователь из Тайваня, не имея возможности заплатить выкуп в размере 0,345 биткойна за расшифровку файлов, решил связаться со злоумышленниками по указанному ими адресу электронной почты службы поддержки. В своем письме он откровенно рассказал о своем затруднительном положении, сославшись на скромный ежемесячный доход всего в 400 долларов. К удивлению, злоумышленники в ответ признали, что переоценили доходы населения Тайваня и что атака полностью провалилась.
Издание Taiwan News о ThunderCrypt
EternalBlue
По нашим оценкам, существуют параллели между известным эксплойтом EternalBlue и авторами, стоящими за StripedFly. Наши предположения основываются на точности временных меток PE файлов, и, хотя невозможно проверить подлинность этих меток для начальных версий зловреда с EternalBlue, в последующих обновлениях временные метки примерно совпадали с данными телеметрии, поэтому вполне допустимо что они правдивы.
Вот хронология событий, которую мы воссоздали:
- 9 апреля 2016 года: создана наиболее ранняя из известных версий StripedFly, включающая EternalBlue, о чем свидетельствуют временные метки PE.
- Август 2016 года: первоначальная утечка информации, организованная группировкой Shadow Brokers.
- 14 марта 2017 года: компания Microsoft выпустила бюллетень безопасности MS17-010 с исправлением уязвимости, которую эксплуатирует EternalBlue.
- 14 апреля 2017 года: группировка Shadow Brokers опубликовала утечку с эксплойтом EternalBlue.
- 15 апреля 2017 года: появился первый шифровальщик с EternalBlue — ExPetr.
- 20 апреля 2017 года: появляется самая ранняя версия шифровальщика ThunderCrypt (без EternalBlue).
- 23 апреля 2017 года: первое обнаружение ThunderCrypt в нашей телеметрии.
- 12 мая 2017 года: атака шифровальщика WannaCry с использованием EternalBlue.
- 27 июня 2017 года: атака ExPetr с использованием EternalBlue.
- 24 августа 2017 года: первое обнаружение StripedFly в нашей телеметрии, через год после даты, указанной в первых временных метках PE.
По нашему мнению, данная хронология связывает StripedFly с вредоносным ПО Equation, хотя прямых доказательств этой взаимосвязи нет. Обнаружению зловреда способствовало его сходство с сигнатурами семейства Equation, при этом стиль и приемы написания кода напоминают работу авторов вредоносного ПО SBZ.
Заключение
Эта статья — попытка рассказать историю, основанную на данных из закрытого технического отчета, опубликованного в прошлом году. Учитывая приличный возраст StripedFly, несомненно, он давно выполнил свое предназначение, успешно избегая обнаружения на протяжении нескольких лет. За это время было исследовано много нашумевших и сложных вредоносных угроз, но эта заметно выделяется на фоне остальных и действительно заслуживает внимания и признания.
Какова была истинная цель зловреда? Это останется загадкой. Хотя существование шифровальщика ThunderCrypt и предполагает наличие коммерческих мотивов у авторов, возникает вопрос, почему они выбрали потенциально не столь прибыльный способ использования своего нового детища. В большинстве подобных случаев всегда речь идет о злоумышленниках, вымогающих деньги у случайных пользователей, однако здесь совсем другой случай.
Вопрос остается открытым, но ответ на него знают только те, кто создал это загадочное вредоносное ПО. Трудно поверить в то, что столь сложное и профессионально разработанное вредоносное ПО может служить такой тривиальной цели, как майнинг, тем более — при наличии всех доказательств обратного.
Индикаторы компрометации
Командные серверы
gpiekd65jgshwp2p53igifv43aug2adacdebmuuri34hduvijr5pfjad[.]onion ghtyqipha6mcwxiz[.]onion
ajiumbl2p2mjzx3l[.]onion
ajiumbl2p2mjzx3l[.]onion
URL-адреса
bitbucket[.]org/JulieHeilman/m100-firmware-mirror/downloads/
bitbucket[.]org/upgrades/um/downloads/
bitbucket[.]org/legit-updates/flash-player/downloads
gitlab[.]com/JulieHeilman/m100-firmware-mirror/raw/master/
gitlab[.]com/saev3aeg/ugee8zee/raw/master/
github[.]com/amf9esiabnb/documents/releases/download/
tcp://pool.minexmr[.]com:4444
tcp://mine.aeon-pool[.]com:5555
tcp://5.255.86[.]125:8080
tcp://45.9.148[.]21:80
tcp://45.9.148[.]36:80
tcp://45.9.148[.]132:8080
system.img
b28c6d00855be3b60e220c32bfad2535
18f5ccdd9efb9c41aa63efbe0c65d3db
2cdc600185901cf045af027289c4429c
54dd5c70f67df5dc8d750f19ececd797
d32fa257cd6fb1b0c6df80f673865581
c04868dabd6b9ce132a790fdc02acc14
c7e3df6455738fb080d741dcbb620b89
d684de2c5cfb38917c5d99c04c21769a
a5d3abe7feb56f49fa33dc49fea11f85
35fadceca0bae2cdcfdaac0f188ba7e0
delta.dat
00c9fd9371791e9160a3adaade0b4aa2
41b326df0d21d0a8fad6ed01fec1389f
delta.img
506599fe3aecdfb1acc846ea52adc09f
6ace7d5115a1c63b674b736ae760423b
ota.dat
2e2ef6e074bd683b477a2a2e581386f0
04df1280798594965d6fdfeb4c257f6c
ota.img
abe845285510079229d83bb117ab8ed6
090059c1786075591dec7ddc6f9ee3eb
ThunderCrypt
120f62e78b97cd748170b2779d8c0c67
d64361802515cf32bd34f98312dfd40d
StripedFly: двуликий и незаметный