MoustachedBouncer — это группа кибершпионажа, обнаруженная ESET Research и впервые публично раскрытая в этой статье. Группа действует как минимум с 2014 года и нацелена исключительно на иностранные посольства в Беларуси. С 2020 года MoustachedBouncer, скорее всего, получила возможность проводить атаки «злоумышленник посередине» (AitM) на уровне интернет-провайдера (ISP) в Беларуси, чтобы компрометировать свои цели. Группа использует два отдельных набора инструментов, которые мы назвали NightClub и Disco.

Ключевые моменты этого отчета:

  • MoustachedBouncer действует как минимум с 2014 года.
  • Мы с умеренной уверенностью предполагаем, что они связаны с интересами Беларуси.
  • MoustachedBouncer специализируется на шпионаже за иностранными посольствами в Беларуси.
  • MoustachedBouncer использует технику «злоумышленник посередине» с 2020 года для перенаправления проверок captive portal на сервер C&C и доставки вредоносных плагинов через общие ресурсы SMB.
  • Мы полагаем, что MoustachedBouncer использует систему законного перехвата (например, SORM) для проведения своих операций AitM.
  • Мы с низкой уверенностью предполагаем, что MoustachedBouncer тесно сотрудничает с Winter Vivern, другой группой, нацеленной на европейских дипломатов, но использующей другие TTP.
  • С 2014 года группа эксплуатирует фреймворк вредоносного ПО, который мы назвали NightClub. Он использует протоколы SMTP и IMAP (электронная почта) для связи C&C.
  • Начиная с 2020 года, группа параллельно использует второй фреймворк вредоносного ПО, который мы назвали Disco.
  • Как NightClub, так и Disco поддерживают дополнительные шпионские плагины, включая средство для создания снимков экрана, средство записи звука и похититель файлов.

Сложные тактики, техники и процедуры группы также обсуждались в подкасте ESET Research. Просто нажмите play, чтобы узнать больше от директора отдела исследований угроз ESET Жана-Яна Бутена и ведущего исследователя ESET Арье Горецкого.

Жертвы

Согласно телеметрии ESET, группа нацелена на иностранные посольства в Беларуси, и мы выявили четыре страны, сотрудники посольств которых стали мишенями: две из Европы, одна из Южной Азии и одна из Африки. Ключевые даты показаны на Рисунке 1.

MoustachedBouncer_Timeline_edited

Рисунок 1. Временная шкала действий MoustachedBouncer

Атрибуция

Хотя мы отслеживаем MoustachedBouncer как отдельную группу, мы обнаружили элементы, которые позволяют нам с низкой уверенностью предполагать, что они тесно сотрудничают с другой группой, известной как Winter Vivern. Последняя была обнаружена в 2021 году и остается активной по состоянию на 2023 год. В марте 2023 года Winter Vivern использовала известную уязвимость XSS (CVE-2022-27926) в почтовом портале Zimbra для кражи учетных данных веб-почты дипломатов нескольких европейских стран. Эта кампания была публично раскрыта исследователями Proofpoint.

Деятельность MoustachedBouncer охватывает период с 2014 по 2022 год, и TTP группы со временем развивались. Например, мы впервые увидели использование ими атак AitM только в 2020 году. Однако целевая вертикаль оставалась прежней.

Таблица 1 показывает характеристики каждой кампании. Учитывая эти элементы, мы с высокой уверенностью предполагаем, что все они связаны с MoustachedBouncer.

Таблица 1. Связи между кампаниями MoustachedBouncer


VirusTotal
(2014)

Жертва A (2017)

Жертва B

(2020-2022)

Жертва C
(2020-2022)

Жертва D
(2021-2022)

имплант NightClub

X

X


X


плагины NightClub


X

X

X


имплант Disco



X


X

дроппер SharpDisco



X



Компрометация через AitM

?

?

?

?

X

Доставка вредоносного ПО через AitM по SMB-шарам



X


X

Жертвы: иностранные посольства в Беларуси

?

X

X

X

X

Вектор компрометации: AitM

В этом разделе мы подробно описываем первоначальный доступ для Disco. Мы еще не знаем метод первоначального доступа, который MoustachedBouncer использует для установки NightClub.

Фейковое обновление Windows

Для компрометации своих целей операторы MoustachedBouncer вмешиваются в интернет-соединение своих жертв, вероятно, на уровне интернет-провайдера, чтобы заставить Windows поверить, что она находится за captive portal. Windows 10 проверяет, имеет ли она доступ в Интернет, отправляя HTTP-запрос на http://www.msftconnecttest.com/connecttest.txt. Если ответ не «Microsoft Connect Test», открывается окно браузера по адресу http://www.msftconnecttest.com/redirect. Для IP-диапазонов, на которые нацелена MoustachedBouncer, сетевой трафик перехватывается на уровне интернет-провайдера, и последний URL перенаправляет на якобы легитимный, но поддельный URL обновления Windows, http://updates.microsoft[.]com/. Таким образом, поддельная страница обновления Windows будет показана потенциальной жертве при подключении к сети. Поддельная страница обновления показана на Рисунке 2. Текст, который мы наблюдали, на русском языке, скорее всего, потому, что это основной язык, используемый в Беларуси, но возможно существование версий на других языках. На странице указано, что имеются критические обновления безопасности системы, которые необходимо установить.

Рисунок 2. Поддельная страница обновления Windows

Рисунок 2. Поддельная страница обновления Windows

Обратите внимание, что используется незашифрованный HTTP, а не HTTPS, и что поддомен updates.microsoft[.]com не существует в DNS-серверах Microsoft, поэтому он не разрешается в открытом Интернете. Во время атаки этот домен разрешался в 5.45.121[.]106 на машине цели. Этот IP-адрес используется для парковки доменов и не имеет отношения к Microsoft. Хотя это IP-адрес, маршрутизируемый в Интернете, трафик на этот IP-адрес никогда не достигает Интернета во время активной атаки AitM. Как разрешение DNS, так и ответы HTTP были внедрены в транзит, вероятно, на уровне интернет-провайдера.

Важно отметить, что техника «злоумышленник посередине» (AitM) применяется только против нескольких выбранных организаций (возможно, только посольств), а не по всей стране. Невозможно воспроизвести перенаправление, просто выйдя из случайного IP-адреса в Беларуси.

Доставка вредоносного ПО

HTML-страница, показанная на Рисунке 2, загружает JavaScript-код с http://updates.microsoft[.]com/jdrop.js. Этот скрипт сначала вызывает setTimeout для выполнения функции jdrop через одну секунду после загрузки страницы. Эта функция (см. Рисунок 3) отображает модальное окно с кнопкой Получить обновления.

Рисунок 3. Функция jdrop

Рисунок 3. Функция jdrop

Щелчок по кнопке выполняет функцию update, показанную на Рисунке 4.

Рисунок 4. Функция update

Рисунок 4. Функция update

Эта функция запускает загрузку фейкового установщика обновлений Windows с легитимно выглядящего URL http://updates.microsoft[.]com/MicrosoftUpdate845255.zip. Она также отображает инструкции по установке обновления: Для установки обновлений, скачайте и запустите «MicrosoftUpdate845255.msi».

Нам не удалось получить загруженный файл MicrosoftUpdate845255.zip, но наша телеметрия показывает, что он содержит вредоносный исполняемый файл под названием MicrosoftUpdate845255.exe.

Написанный на Go, он создает запланированную задачу, которая каждую минуту выполняет \35.214.56[.]2OfficeBrokerOfficeBroker.exe. Как следует из пути, он извлекает исполняемый файл через SMB с 35.214.56[.]2. Этот IP-адрес принадлежит клиенту Google Cloud, но, как и HTTP-сервер, мы считаем, что ответы SMB внедряются на лету через AitM, и что злоумышленники не контролируют фактический IP-адрес, маршрутизируемый в Интернете.

Мы также наблюдали следующие SMB-серверы, перехваченные через AitM:

  • \209.19.37[.]184
  • \38.9.8[.]78
  • \59.6.8[.]25

Мы наблюдали это поведение в двух отдельных сетях интернет-провайдеров: Unitary Enterprise A1 и Beltelecom. Это позволяет предположить, что эти интернет-провайдеры могут не обеспечивать полную конфиденциальность и целостность данных. Мы настоятельно рекомендуем иностранным организациям в Беларуси использовать сквозной зашифрованный VPN-туннель, желательно внеполосный (то есть не с конечной точки), обеспечивающий подключение к Интернету из доверенной сети.

Рисунок 5 изображает нашу гипотезу о векторе компрометации и перехвате трафика.

Рисунок 5. Сценарий компрометации через AitM

Рисунок 5. Сценарий компрометации через AitM

AitM – Общие соображения

Сценарий AitM напоминает нам о злоумышленниках Turla и StrongPity, которые подменяли установщики программ на лету на уровне интернет-провайдера.

Обычно этот метод первоначального доступа используется злоумышленниками, действующими в своей стране, поскольку он требует значительного доступа к интернет-провайдерам или их вышестоящим поставщикам. Во многих странах службы безопасности имеют право выполнять так называемый «законный перехват» с использованием специальных устройств, установленных в помещениях интернет-провайдеров.

В России закон 2014 года требует от интернет-провайдеров установки устройств под названием СОРМ-3, которые позволяют Федеральной службе безопасности (ФСБ) проводить целевую слежку. Устройства обладают возможностями глубокой проверки пакетов (DPI) и, вероятно, использовались Turla в их кампании Mosquito.

В 2018 году Citizen Lab обнаружила, что устройства DPI, разработанные канадской компанией Sandvine, использовались для изменения HTTP-трафика в Турции и Египте. В Турции устройства, предположительно, использовались для перенаправления интернет-пользователей на вредоносный сервер при попытке загрузки определенных приложений Windows, что соответствует деятельности StrongPity. В Египте эти устройства, предположительно, использовались для показа рекламы и скриптов майнинга криптовалют с целью получения прибыли.

В 2020 году статья Bloomberg показала, что белорусский Национальный центр обмена трафиком приобрел то же оборудование DPI от Sandvine, но, согласно статье Cyberscoop, контракт был расторгнут в сентябре 2020 года.

Согласно отчету Amnesty International, опубликованному в 2021 году, «Согласно белорусскому законодательству, все телекоммуникационные провайдеры в стране должны обеспечить совместимость своего оборудования с системой СОРМ». Они также заявляют, что «Система СОРМ предоставляет властям прямой удаленный доступ ко всем коммуникациям пользователей и связанным с ними данным без уведомления провайдера». Мы с низкой уверенностью полагаем, что MoustachedBouncer использует эту систему СОРМ для проведения своих операций.

Хотя компрометация маршрутизаторов для проведения AitM в сетях посольств не может быть полностью исключена, наличие возможностей законного перехвата в Беларуси предполагает, что манипуляции с трафиком происходят на уровне интернет-провайдера, а не на маршрутизаторах целей.

Импланты: NightClub и Disco

С 2014 года используемые MoustachedBouncer семейства вредоносных программ эволюционировали, и в 2020 году произошли большие изменения, когда группа начала использовать атаки AitM. В то же время она начала использовать гораздо более простые инструменты, разработанные на .NET и Go. В отношении NightClub мы назвали этот новый набор инструментов Disco.

MoustachedBouncer эксплуатирует два семейства имплантов параллельно, но на конкретной машине развернут только один. Мы считаем, что Disco используется в сочетании с атаками AitM, в то время как NightClub используется для жертв, где перехват трафика на уровне интернет-провайдера невозможен из-за такой меры, как использование сквозного зашифрованного VPN, где интернет-трафик маршрутизируется за пределы Беларуси.

Disco

Как упоминалось в предыдущем разделе, поддельная страница обновления Windows доставляет первую стадию (SHA-1: E65EB4467DDB1C99B09AE87BA0A964C36BAB4C30). Это простой дроппер, написанный на Go, который создает запланированную задачу для ежеминутного выполнения \35.214.56[.]2OfficeBrokerOfficeBroker.exe. OfficeBroker.exe загружается по протоколу SMB через атаку AitM. Основная функция дроппера показана на Рисунке 6.

Рисунок 6. Основная функция дроппера на Go

Рисунок 6. Основная функция дроппера на Go

Наконец, дроппер выполняет DNS-запрос для windows.system.update[.]com. Этот домен не существует, но DNS-запрос, вероятно, перехватывается через AitM и, скорее всего, является маяком для уведомления операторов об успешной компрометации машины.

Нам не удалось получить файл OfficeBroker.exe, но весьма вероятно, что он действует как загрузчик, поскольку мы наблюдали выполнение дополнительных плагинов из общих ресурсов SMB. Плагины разработаны на Go и довольно просты, поскольку в основном полагаются на внешние библиотеки Go. Таблица 2 обобщает различные плагины.

Таблица 2. Плагины на Go, используемые MoustachedBouncer в 2021–2022 гг.

URL загрузки / Путь на диске

Описание

\209.19.37[.]184driverpackaact.exe

Делает снимки экрана с использованием библиотеки kbinani/screenshot. Снимки сохраняются в .AActdata<d>_<s>.dat (на SMB-шаре), где <d> — номер активного дисплея, а <s> — дата. Он спит 15 секунд между каждым снимком экрана.

C:UsersPublicdriverpackdriverpackUpdate.exe

Выполняет скрипты PowerShell с помощью powershell.exe -NoProfile -NonInteractive <command>, где <command> считывается из файла .idata. Вывод записывается в .odata.

C:UsersPublicdriverpacksdrive.exe

Выполняет C:UsersPublic‌driverpackdriverpackUpdate.exe (предыдущий плагин) с повышенными правами через CVE-2021-1732. Код, вероятно, был вдохновлен PoC на GitHub и использует библиотеку генерации кода zydis.

\209.19.37[.]184driverpackofficetelemetry.exe

Обратный прокси, сильно вдохновленный репозиторием GitHub revsocks. Нам не удалось получить параметры командной строки с IP-адресом прокси.

\38.9.8[.]78driverpackDPU.exe

Еще один пример плагина PowerShell.

%userprofile%appdatanod32updatenod32update.exe

Еще один пример плагина обратного прокси.

\59.6.8[.]25outlooksyncoutlooksync.exe

Делает снимки экрана; похож на первый плагин. Изображения сохраняются в ./logs/${DATETIME}.dat.

\52.3.8[.]25oracleoracleTelemetry.exe

Плагин для снимков экрана, упакованный с помощью Themida.

Интересно, что плагины также используют SMB-шары для эксфильтрации данных. Нет никакого C&C-сервера вне помещений злоумышленников, на который можно было бы посмотреть или который можно было бы вывести из строя. Также, похоже, нет способа связаться с этим C&C-сервером из Интернета. Это обеспечивает высокую устойчивость инфраструктуры сети злоумышленников.

SharpDisco и плагины NightClub

В январе 2020 года мы наблюдали дроппер MoustachedBouncer, который мы назвали SharpDisco, загружаемый с https://mail.mfa.gov.<redacted>/EdgeUpdate.exe процессом Microsoft Edge. Неясно, как злоумышленникам удалось подменить HTTPS-трафик, но возможно, что жертве было показано предупреждение о недопустимом TLS-сертификате. Другая возможность заключается в том, что MoustachedBouncer скомпрометировала этот правительственный веб-сайт.

SharpDisco (SHA-1: A3AE82B19FEE2756D6354E85A094F1A4598314AB)

SharpDisco — это дроппер, разработанный на C#. Он отображает фейковое окно обновления, показанное на Рисунке 7, создавая одновременно две запланированные задачи в фоновом режиме.

Рисунок 7. Фейковое окно обновления Microsoft Edge

Рисунок 7. Фейковое окно обновления Microsoft Edge

Эти запланированные задачи:

scheduled tasks

WINCMDA.EXE и WINCMDB.EXE, вероятно, просто переименованные cmd.exe. Каждую минуту задача считывает содержимое файла \24.9.51[.]94EDGEUPDATEEDGEAIN (на SMB-шаре), передает его в cmd.exe и записывает вывод в \24.9.51[.]94EDGEUPDATEEDGEAOUT. То же самое происходит со второй задачей, но с файлами EDGEBIN и EDGEBOUT. В целом, эти задачи представляют собой обратные оболочки с задержкой в одну секунду.

Затем, как показано на Рисунке 8, дроппер отправляет DNS-запрос для незарегистрированного домена edgeupdate-security-windows[.]com. Это похоже на то, что делает дроппер Disco 2022 года.

Рисунок 8. Дроппер, использованный в 2020 году

Рисунок 8. Дроппер, использованный в 2020 году

Телеметрия ESET показывает, что обратная оболочка использовалась для размещения настоящего интерпретатора Python в C:UsersPublicWinTNWinTN.exe. Затем мы наблюдали, как cmd.exe разместил два плагина на диске, что означает, что они, скорее всего, также были размещены обратной оболочкой. Два плагина:

  • Сборщик недавно открытых файлов в C:UsersPublicWinSrcNTIt11.exe
  • Монитор внешних дисков в C:UsersPublicIt3.exe

Интересно, что эти плагины имеют общий код с NightClub (описанным ниже в разделе NightClub – 2017 (SHA-1: F92FE4DD679903F75ADE64DC8A20D46DFBD3B277)). Это позволило нам связать наборы инструментов Disco и NightClub.

Сборщик недавно открытых файлов (SHA-1: 0DAEA89F91A55F46D33C294CFE84EF06CE22E393)

Этот плагин представляет собой исполняемый файл Windows с именем It11.exe. Мы полагаем, что он был запущен через упомянутую выше обратную оболочку (reverse shell). В плагине нет механизма постоянства (persistence mechanism).

Он получает недавно открытые файлы на машине, читая содержимое папки %USERPROFILE%Recent (в Windows XP) или %APPDATA%MicrosoftWindowsRecent (в более новых версиях Windows). Эти папки содержат LNK-файлы, каждый из которых указывает на недавно открытый файл.

Плагин включает собственный парсер LNK-формата для извлечения пути к исходному файлу.

Нам не удалось заставить этот плагин работать, но статический анализ показывает, что файлы эксфильтруются в SMB-ресурс \24.9.51[.]94EDGEUPDATEupdate. Плагин хранит список уже эксфильтрованных файлов и их CRC-32 хеш в %TEMP%index.dat. Это, вероятно, позволяет избежать повторной передачи одного и того же файла.

Монитор внешних дисков (SHA-1: 11CF38D971534D9B619581CEDC19319962F3B996)

Этот плагин — исполняемый файл Windows с именем It3.exe. Как и в случае со сборщиком недавних файлов, он не реализует никакого механизма постоянства.

Плагин в цикле вызывает GetLogicalDrives для получения списка всех подключенных дисков, включая съемные, такие как USB-накопители. Затем он выполняет прямое копирование NTFS-тома каждого съемного диска и записывает его в текущий рабочий каталог, в нашем примере C:UsersPublic. Имя файла — это случайно сгенерированная строка из шести-восьми буквенно-цифровых символов, например heNNYwmY.

Он ведет лог-файл в <рабочий каталог>index.dat с CRC-32 хешами скопированных дисков.

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

NightClub

С 2014 года MoustachedBouncer использует фреймворк вредоносного ПО, который мы назвали NightClub, потому что он содержит C++ класс с именем nightclub. Мы нашли образцы от 2014, 2017, 2020 и 2022 годов. В этом разделе описывается эволюция NightClub от простого бэкдора до полностью модульного C++ импланта.

Вкратце, NightClub — это семейство имплантов, использующих электронную почту для связи с C&C. С 2016 года дополнительные модули могли доставляться по электронной почте для расширения его шпионских возможностей.

NightClub – 2014

Это самая старая известная версия NightClub. Мы нашли дроппер и оркестратор.

Дроппер (SHA-1: 0401EE7F3BC384734BF7E352C4C4BC372840C30D) — это исполняемый файл с именем EsetUpdate-0117583943.exe, который был загружен на VirusTotal из Украины 19.11.2014. Мы не знаем, как он распространялся в то время.

Основная функция, проиллюстрированная на Рисунке 9, загружает ресурс MEMORY и записывает его содержимое в %SystemRoot%System32creh.dll. Он хранится в открытом виде в PE-ресурсе.

Рисунок 9. Основная функция дроппера

Рисунок 9. Основная функция дроппера

Затем дроппер изменяет временные метки создания, доступа и записи creh.dll, устанавливая их такими же, как у подлинного DLL-файла Windows user32.dll.

Наконец, он создает службу Windows с именем WmdmPmSp и устанавливает в реестре ее ServiceDll на %SystemRoot%System32creh.dll – см. Рисунок 10.

Рисунок 10. Изменение значения ServiceDll

Рисунок 10. Изменение значения ServiceDll

Ранее размещенный DLL-файл, creh.dll (SHA-1: 5B55250CC0DA407201B5F042322CFDBF56041632), является оркестратором NightClub. Он имеет один экспорт с именем ServiceMain, а путь к его PDB — D:ProgrammingProjectsWorkSwampThingReleaseWin32WorkingDll.pdb.

Он написан на C++, и имена некоторых методов и классов присутствуют в данных RTTI – см. Рисунок 11.

Рисунок 11. Имена методов и классов из данных RTTI

Рисунок 11. Имена методов и классов из данных RTTI

Некоторые строки зашифрованы с использованием следующего линейного конгруэнтного генератора (LCG): staten+1 = (690069 × staten + 1) mod 232. Для каждой зашифрованной строки предоставляется начальное значение (state0) от 0 до 255. Для расшифровки строки staten вычитается из каждого зашифрованного byten. Пример структуры зашифрованной строки показан на Рисунке 12.

Рисунок 12. Формат зашифрованной строки

Рисунок 12. Формат зашифрованной строки

Нешифрованный лог-файл присутствует в C:WindowsSystem32servdll.log. Он содержит очень базовую информацию об инициализации оркестратора – см. Рисунок 13.

Рисунок 13. Лог-файл

Рисунок 13. Лог-файл

NightClub имеет две основные возможности:


Мониторинг файлов


Эксфильтрация данных через SMTP (электронная почта)

Монитор файлов

Реализованная здесь функциональность очень похожа на плагин монитора недавних файлов, замеченный в 2020 году и описанный выше. Он также просматривает каталоги %USERPROFILE%Recent в Windows XP и в более новых версиях Windows %APPDATA%MicrosoftWindowsRecent, и реализует тот же парсер LNK – см. Рисунки 14 и 15.

Рисунок 14. Парсер LNK (образец 2014 года – 5B55250CC0DA407201B5F042322CFDBF56041632)

Рисунок 14. Парсер LNK (образец 2014 года – 5B55250CC0DA407201B5F042322CFDBF56041632)

Рисунок 15. Парсер LNK (образец 2020 года – 0DAEA89F91A55F46D33C294CFE84EF06CE22E393)

Рисунок 15. Парсер LNK (образец 2020 года – 0DAEA89F91A55F46D33C294CFE84EF06CE22E393)

Файлы, полученные из LNK-файлов, копируются в %TEMP%<исходное имя файла>.bin. Обратите внимание, что в отличие от варианта 2020 года, копируются только файлы с расширениями .doc, .docx, .xls, .xslx или .pdf.

Он также отслеживает съемные диски в цикле, чтобы красть файлы с них.

SMTP C&C коммуникации

NightClub использует протокол SMTP для эксфильтрации данных. Хотя C&C коммуникация по электронной почте не уникальна для MoustachedBouncer и используется другими злоумышленниками, такими как Turla (см. LightNeuron и Outlook backdoor), она встречается довольно редко. Код основан на проекте CSmtp, доступном на GitHub. Информация об учетных записях электронной почты жестко закодирована и зашифрована с помощью алгоритма LCG. В проанализированном нами образце конфигурация почты следующая:


SMTP сервер: smtp.seznam.cz


Адрес отправителя: glen.morriss75@seznam[.]cz


Пароль отправителя: <удалено>


Адрес получателя: SunyaF@seznam[.]cz

seznam.cz — это чешский веб-портал, предлагающий бесплатный сервис веб-почты. Мы полагаем, что злоумышленники создали свои собственные учетные записи электронной почты, а не компрометировали существующие.

NightClub эксфильтрует файлы, ранее скопированные в %TEMP% функцией мониторинга файлов (FileMonitor на Рисунке 11). Они закодированы в base64 и добавляются как вложения. Имя вложения — это исходное имя файла с расширением .bin.

На Рисунке 16 показана эксфильтрация файла через SMTP. NightClub аутентифицируется с использованием учетных данных для аккаунта glen.morriss75@seznam[.]cz и отправляет электронное письмо на SunyaF@seznam[.]cz с прикрепленным украденным файлом.

Рисунок 16. TCP-поток SMTP-коммуникации с нашей тестовой машины

Рисунок 16. TCP-поток SMTP-коммуникации с нашей тестовой машины

Обратите внимание, что некоторые заголовки, которые на первый взгляд могут показаться подозрительными, являются значениями по умолчанию из проекта CSmtp, поэтому они, вероятно, не являются отличительными. К ним относятся:


X-Mailer: The Bat! (v3.02) Professional


Content-Type: multipart/mixed; boundary=»__MESSAGE__ID__54yg6f6h6y456345″

The Bat! — это почтовый клиент, широко используемый в Восточной Европе. Таким образом, заголовок X-Mailer, вероятно, смешивается с почтовым трафиком в Беларуси.

NightClub – 2017 (SHA-1: F92FE4DD679903F75ADE64DC8A20D46DFBD3B277)

В 2017 году мы обнаружили более новую версию NightClub, скомпилированную 05.06.2017. На машине жертвы она располагалась по пути C:WindowsSystem32metamn.dll. Ее имя файла в каталоге экспорта DLL — DownloaderService.dll, и она имеет один экспорт с именем ServiceMain. Она содержит путь к PDB D:AbcdMainProjectRootsrcProjectsMainSInkReleasex64EtfFavoriteFinder.pdb.

Для обеспечения постоянства она создает службу Windows с именем WmdmPmSp, как и в предыдущих версиях. К сожалению, мы не смогли восстановить дроппер.

Эта версия NightClub также включает несколько имен C++ классов и методов, включая nightclub, в данных RTTI – см. Рисунок 17.

Рисунок 17. Имена методов и классов из данных RTTI версии NightClub 2017 года

Рисунок 17. Имена методов и классов из данных RTTI версии NightClub 2017 года

Как и в предыдущих версиях, C&C коммуникации используют протокол SMTP через библиотеку CSmtp с жестко закодированными учетными данными. В проанализированном нами образце конфигурация почты следующая:


SMTP сервер: smtp.mail.ru


Адрес отправителя: fhtgbbwi@mail[.]ru


Пароль отправителя: [удалено]


Адрес получателя: nvjfnvjfnjf@mail[.]ru

Основное отличие заключается в том, что они сменили бесплатного почтового провайдера с Seznam.cz на Mail.ru.

Эта версия NightClub использует внешние плагины, хранящиеся в папке %APPDATA%NvmFilter. Это DLL-файлы с именем <случайная строка>.cr (например, et2z7q0FREZ.cr) с одним экспортом с именем Starts. Мы идентифицировали два плагина: кейлоггер и монитор файлов.

Кейлоггер (SHA-1: 6999730D0715606D14ACD19329AF0685B8AD0299)

Этот плагин хранился в %APPDATA%NvmFilteret2z7q0FREZ.cr и является DLL с одним экспортом, Starts. Он содержит путь к PDB D:ProgrammingProjectsAutogenKhAutogenAlgReleasex64SearchIdxDll.pdb и был разработан на C++. Данные RTTI показывают несколько имен классов – см. Рисунок 18.

Рисунок 18. Имена методов и классов из данных RTTI плагина кейлоггера NightClub

Рисунок 18. Имена методов и классов из данных RTTI плагина кейлоггера NightClub

Реализация кейлоггера довольно традиционна, используется функция Windows GetKeyState – см. Рисунок 19.

Рисунок 19. Кейлоггер NightClub

Рисунок 19. Кейлоггер NightClub

Кейлоггер ведет лог-файл в открытом виде в %TEMP%uirtl.tmp. Он содержит дату, заголовок приложения и записанные нажатия клавиш для конкретного приложения. Пример, который мы сгенерировали, приведен на Рисунке 20.

Рисунок 20. Пример вывода кейлоггера (сгенерирован нами)

Рисунок 20. Пример вывода кейлоггера (сгенерирован нами)

Монитор файлов (SHA-1: 6E729E84C7672F048ED8AE847F20A0219E917FA)

Этот плагин хранился в %APPDATA%NvmFiltersTUlsWa1.cr и является DLL с одним экспортом с именем Starts. Его путь к PDB, D:ProgrammingProjectsAutogenKhAutogenAlgReleasex64FileMonitoringModule.pdb, не был удален, и он повторно использует код из мониторов файлов 2014 и 2020 годов, описанных выше. Он отслеживает диски и недавние файлы, а также копирует файлы для эксфильтрации в %TEMP%AcmSymrm. Его лог-файл хранится в %TEMP%indexwti.sxd.

NightClub – 2020–2022

В 2020-11 годах мы наблюдали новую версию NightClub, развернутую в Беларуси на компьютерах дипломатического персонала европейской страны. В 2022-07 годах MoustachedBouncer снова скомпрометировал некоторые из тех же компьютеров. Версии NightClub 2020 и 2022 годов почти идентичны, а вектор компрометации остается неизвестным.

Его архитектура немного отличается от предыдущих версий, так как оркестратор также реализует сетевые функции. Второй компонент, который разработчики называют модульным агентом (module agent), отвечает только за загрузку плагинов. Все образцы были найдены в папке %APPDATA%microsoftdef и написаны на C++ со статически связанными библиотеками, такими как CSmtp или cpprestsdk. В результате исполняемые файлы довольно большие – около 5 МБ.

Оркестратор

На машинах жертв оба варианта оркестратора (SHA-1: 92115E21E565440B1A26ECC20D2552A214155669 и D14D9118335C9BF6633CB2A41023486DACBEB052) назывались svhvost.exe. Мы полагаем, что MoustachedBouncer пытался замаскироваться под имя легитимного исполняемого файла svchost.exe. Для обеспечения постоянства он создает службу с именем vAwast.

В отличие от предыдущих версий, для шифрования строк они просто добавляют 0x01 к каждому байту. Например, строка cmd.exe будет зашифрована как dne/fyf. Другое отличие заключается в том, что конфигурация хранится во внешнем файле, а не жестко закодирована в бинарном файле. Она хранится по жестко закодированному пути %APPDATA%MicrosoftdefGfr45.cfg, а данные расшифровываются с помощью закрытого RSA-ключа длиной 2048 бит (см. Рисунок 21) с использованием функции BCryptImportKeyPair и BCryptDecrypt.

Рисунок 21. Жестко закодированный закрытый RSA-ключ

Рисунок 21. Жестко закодированный закрытый RSA-ключ

Конфигурация форматируется в JSON, как показано на Рисунке 22.

Рисунок 22. Формат внешней конфигурации NightClub

Рисунок 22. Формат внешней конфигурации NightClub

Наиболее важными ключами являются transport и modules. Первый содержит информацию о почтовом ящике, используемом для C&C коммуникаций, как и в предыдущих версиях. Второй содержит список модулей.

Модульный агент

Два варианта модульного агента (SHA-1: DE0B38E12C0AF0FD63A67B03DD1F8C1BF7FA6128 и E6DE72516C1D4338D7E45E028340B54DCDC7A8AC) назывались schvost.exe, что является еще одной имитацией имени файла svchost.exe.

Этот компонент отвечает за запуск модулей, указанных в конфигурации. Это DLL-файлы, каждый с экспортом с именем Start или
Starts
. Они хранятся на диске незашифрованными с расширением .ini, но на самом деле являются DLL.

Модули

За время нашего расследования мы обнаружили пять различных модулей: аудиорекордер, два почти идентичных скриншоттера, кейлоггер и DNS-бэкдор. Для всех них: их конфигурация, отформатированная в JSON, передается в качестве аргумента функции Start или
Starts
.

По умолчанию вывод плагина записывается в %TEMP%tmp123.tmp. Это можно изменить с помощью поля конфигурации file. Таблица 3 показывает различные плагины.

Таблица 3. Плагины NightClub

Имя экспорта DLL

Конфигурация

Описание

NotifyLoggers.dll

{


«name»:»<значение>»,


«enabled»:»<значение>»,


«max_size»:»<значение>»,


«file»:»<значение>»,


«chk_t»:»<значение>»,


«r_d»:»<значение>»,


«f_hs»:»<значение>»,


«t_hs»:»<значение>»

}

Аудиорекордер, использующий библиотеку Lame и mciSendStringW для управления аудиоустройством. Дополнительные поля конфигурации, вероятно, используются для указания параметров Lame.

MicroServiceRun.dll

{


«name»:»<значение>»,


«enabled»:»<значение>»,


«max_size»:»<значение>»,


«file»:»<значение>»

«capture_on_key_press»:»<значение>»,


«period_in_sec»:»<значение>»,


«quality»:»<значение>»,


«app_keywords»:»<значение>»

}

Скриншоттер, использующий CreateCompatibleDC и GdipSaveImageToStream, и записывающий захваченные изображения в файл, указанный в file на диск. Если app_keywords не пуст, он использует GetForegroundWindow для проверки имени активного окна и захватывает его только в том случае, если оно соответствует app_keywords.

JobTesterDll.dll

{


«name»:»<значение>»,


«enabled»:»<значение>»,


«max_size»:»<значение>»,


«file»:»<значение>»

}

Кейлоггер, использующий API GetKeyState. Он записывает лог в файл, указанный в file на диск, и формат следующий: <Дата><Заголовок окна><Содержимое>.

ParametersParserer.dll

{


«name»:»<значение>»,


«enabled»:»<значение>»,


«max_size»:»<значение>»,


«file»:»<значение>»,


«cc_server_address»:»<значение>»

}

DNS-туннельный бэкдор. cc_server_address указывает IP-адрес DNS-сервера, на который отправляются запросы. Подробности далее.

DNS-туннельный бэкдор (ParametersParserer.dll) использует пользовательский протокол для отправки и получения данных от вредоносного DNS-сервера (cc_server_address). Рисунок 23 показывает, что DNS-запрос отправляется на IP-адрес, указанный в конфигурации, с использованием параметра pExtra функции DnsQuery_A.

Рисунок 23. DNS-запрос к C&C серверу

Рисунок 23. DNS-запрос к C&C серверу

Плагин добавляет данные для эксфильтрации как часть имени поддомена домена, используемого в DNS-запросе (pszName выше). Домен всегда 11.1.1.cid, а данные содержатся в поддомене. Он использует следующий формат, где x — это буква, а не переменная:

The plugin adds the data to exfiltrate as part of the subdomain name of the domain that is used in the DNS request (pszName above). The domain is always 11.1.1.cid and the data is contained in the subdomain. It uses the following format, where x is the letter, not some variable:

x + <модифицированный base64(buffer)> + x.11.1.1.cid

Например, первый DNS-запрос, который отправляет плагин, выглядит так: xZW1wdHkx.11.1.1.cid, где ZW1wdHk расшифровывается как empty (пусто).

Обратите внимание, что функция base64 здесь нестандартная. Она убирает символ =, если он есть, из результата base64-кодирования, а также заменяет символы / на -s и + на -p. Это делается для создания валидных поддоменов, потому что стандартное base64-кодирование может выдавать символы +, / и =, которые недопустимы в доменных именах и могут быть обнаружены в сетевом трафике.

Затем плагин читает результат, который должен представлять собой одну или несколько TXT-записей DNS, так как флаг DNS_TYPE_TEXT передается в DnsQuery_A. Microsoft называет базовую структуру DNS_TXT_DATAA. Она содержит массив строк, которые объединяются для формирования выходного буфера.

Figure 24. The plugin reads the TXT record

Figure 24. Плагин читает TXT-запись

Ожидаемый формат ответа:

x + <аргумент, закодированный модифицированным base64> + x.<cmd_id>.<неизвестный integer>.1.<cmd_name>

Это похоже на формат запросов. <аргумент, закодированный модифицированным base64> также использует кастомное base64-кодирование без = и с заменой + на -p и / на -s. <cmd_name> — это произвольная строка, которую бэкдор не использует; скорее всего, она нужна операторам для отслеживания разных команд. <cmd_id> — это целочисленный идентификатор команды в switch-операторе бэкдора.

Например, если бы операторы захотели выполнить calc.exe, DNS C&C сервер прислал бы ответ xYzpcd2luZG93c1xzeXN0ZW0zMlxjYWxjLmV4ZQx.27.2.1.calc, где Yzpcd2luZG93c1xzeXN0ZW0zMlxjYWxjLmV4ZQ расшифровывается как c:windowssystem32calc.exe, а 27 — это ID команды на создание нового процесса. Все команды, поддерживаемые этим бэкдором, перечислены в Таблице 4.

Таблица 4. Команды, реализованные в DNS-бэкдоре

ID

Описание

0x15 (21)

Копировать каталог (из источника в назначение)

0x16 (22)

Переместить файл (из источника в назначение)

0x17 (23)

Удалить файл или каталог

0x18 (24)

Поиск файла по заданному шаблону (Примечание: мы не уверены в точном поведении этой команды)

0x19 (25)

Запись буфера в файл

0x1A (26)

Чтение файла

0x1B (27)

Создание процесса

Результат выполнения команд также выводится злоумышленнику через DNS-запросы, как описано выше. Единственное отличие — вместо 11 в доменном имени используется 12, как показано в этом примере: xdGltZW91dAx.12.1.1.cid. В данном случае плагин отправил сообщение о тайм-ауте на C&C сервер.

Заключение

MoustachedBouncer — это искусный хакер, нацеленный на иностранных дипломатов в Беларуси. Он использует довольно продвинутые методы для связи с C&C, включая перехват трафика на уровне провайдера для импланта Disco, электронные письма для импланта NightClub и DNS для одного из плагинов NightClub.

Главный вывод: организациям, находящимся в зарубежных странах, где интернет небезопасен, следует использовать VPN-туннель с end-to-end шифрованием до доверенного местоположения для всего интернет-трафика, чтобы обойти любые устройства инспекции сети.

По всем вопросам, связанным с нашим исследованием, опубликованным на WeLiveSecurity, обращайтесь по адресу: threatintel@eset.com.
ESET Research предлагает частные отчеты по APT-разведке и потоки данных. По всем вопросам, связанным с этой услугой, посетите страницу ESET Threat Intelligence.

Подкаст ESET Research

Если вы хотите узнать, как исследователи ESET назвали MoustachedBouncer и его инструменты Disco и NightClub, что делает эту группу достойной звания «продвинутая», или могли ли сотрудники целевых посольств принести вредоносное ПО домой с работы, то послушайте последний выпуск подкаста ESET Research. Жан-Ян Бутен, директор отдела исследований угроз ESET, объясняет сложности MoustachedBouncer нашему ведущему и выдающемуся исследователю ESET Арье Горецкому. Если вам нравится слушать о кибербезопасности, подписывайтесь на наш подкаст ESET Research на Spotify, Google Podcasts, Apple Podcasts или PodBean.

IoCs

Файлы

SHA-1

Имя файла

Обнаружение

Описание

02790DC4B276DFBB26C714F29D19E53129BB6186

index.html

JS/TrojanDownloader.Agent.YJJ

Фейковая веб-страница обновления Windows.

6EFF58EDF7AC0FC60F0B8F7E22CFE243566E2A13

jdrop.js

JS/TrojanDownloader.Agent.YJJ

JavaScript-код, запускающий запрос на загрузку фейкового обновления Windows.

E65EB4467DDB1C99B09AE87BA0A964C36BAB4C30

MicrosoftUpdate845255.exe

WinGo/Agent.ET

Disco dropper.

3A9B699A25257CBD0476CB1239FF9B25810305FE

driverpackUpdate.exe

WinGo/Runner.B

Disco-плагин. Выполняет PowerShell-скрипты.

19E3D06FBE276D4AAEA25ABC36CC40EA88435630

DPU.exe

WinGo/Runner.C

Disco-плагин. Выполняет PowerShell-скрипты.

52BE04C420795B0D9C7CD1A4ACBF8D5953FAFD16

sdrive.exe

Win64/Exploit.CVE-2021-1732.I

Disco-плагин. Эксплойт LPE для CVE-2021-1732.

0241A01D4B03BD360DD09165B59B63AC2CECEAFB

nod32update.exe

WinGo/Agent.EV

Disco-плагин. Обратный прокси на базе revsocks.

A01F1A9336C83FFE1B13410C93C1B04E15E2996C

aact.exe

WinGo/Spy.Agent.W

Disco-плагин. Делает скриншоты.

C2AA90B441391ADEFAA3A841AA8CE777D6EC7E18

officetelemetry.exe

WinGo/Agent.BT

Disco-плагин. Обратный прокси на базе revsocks.

C5B2323EAE5E01A6019931CE35FF7623DF7346BA

oracleTelemetry.exe

WinGo/Spy.Agent.W

Disco-плагин, упакованный Themida. Делает скриншоты.

C46CB98D0CECCB83EC7DE070B3FA7AFEE7F41189

outlooksync.exe

WinGo/Spy.Agent.W

Disco-плагин. Делает скриншоты.

A3AE82B19FEE2756D6354E85A094F1A4598314AB

kb4480959_EdgeUpdate.exe

MSIL/TrojanDropper.Agent.FKQ

Disco .NET dropper.

4F1CECF6D05571AE35ED00AC02D5E8E0F878A984

WinSrcNT.exe

Win32/Nightclub.B

Плагин NightClub, используемый Disco. Крадет последние файлы.

0DAEA89F91A55F46D33C294CFE84EF06CE22E393

It11.exe

Win32/Nightclub.B

Плагин NightClub, используемый Disco. Крадет последние файлы.

11CF38D971534D9B619581CEDC19319962F3B996

It3.exe

Win32/Nightclub.B

Плагин NightClub, используемый Disco. Делает полные дампы съемных носителей.

F92FE4DD679903F75ADE64DC8A20D46DFBD3B277

metamn.dll

Win64/Nightclub.B

NightClub (версия 2017).

6999730D0715606D14ACD19329AF0685B8AD0299

et2z7q0FREZ.cr

Win64/Nightclub.B

Плагин NightClub. Кейлоггер.

6E729E84C7672F048ED8AE847F20A0219E917FA3

sTUlsWa1.cr

Win64/Nightclub.A

Плагин NightClub. Шпион за файлами.

0401EE7F3BC384734BF7E352C4C4BC372840C30D

EsetUpdate-0117583943.exe

Win32/Nightclub.C

NightClub dropper.

5B55250CC0DA407201B5F042322CFDBF56041632

creh.dll

Win32/Nightclub.C

NightClub (2014).

D14D9118335C9BF6633CB2A41023486DACBEB052

svhvost.exe

Win32/Nightclub.D

Оркестратор (NightClub).

E6DE72516C1D4338D7E45E028340B54DCDC7A8AC

schvost.exe

Win32/Nightclub.D

Модульный агент (NightClub).

3AD77281640E7BA754E9B203C8B6ABFD3F6A7BDD

nullnat.ini

Win32/Nightclub.D

Бэкдор с DNS-туннелированием (плагин NightClub).

142FF0770BC6E3D077FBB64D6F23499D9DEB9093

soccix.ini

Win32/Nightclub.D

Кейлоггер (плагин NightClub).

FE9527277C06D7F986161291CE7854EE79788CB8

oreonion.ini

Win32/Nightclub.D

Скриншоттер (плагин NightClub).

92115E21E565440B1A26ECC20D2552A214155669

svhvost.exe

Win32/Nightclub.D

Оркестратор (NightClub).

DE0B38E12C0AF0FD63A67B03DD1F8C1BF7FA6128

schvost.exe

Win32/Nightclub.D

Модульный агент (NightClub).

D2B715A72BBA307CC9BF7690439D34F62EDF1324

sysleg.ini

Win32/Nightclub.D

Записывает аудио (плагин NightClub).

DF8DED42F9B7DE1F439AEC50F9C2A13CD5EB1DB6

oreonion.ini

Win32/Nightclub.D

Делает скриншоты (плагин NightClub).

C&C серверы

IP

Домен

Замечен впервые

Комментарий

185.87.148[.]86

centrocspupdate[.]com

3 ноября 2021

Предполагаемый C&C сервер NightClub.

185.87.151[.]130

ocsp-atomsecure[.]com

11 ноября 2021

Предполагаемый C&C сервер NightClub.

45.136.199[.]67

securityocspdev[.]com

5 июля 2022

C&C сервер NightClub.

45.136.199[.]129

dervasopssec[.]com

12 октября 2022

Предполагаемый C&C сервер NightClub.

«Фейковые» домены, используемые в AitM

Примечание: Эти домены используются в контексте, когда DNS-запросы перехватываются до их отправки в интернет. Они не разрешаются вне контекста атаки AitM.

windows.network.troubleshooter[.]com

updates.microsoft[.]com

IP-адреса SMB-шар, пока идет AitM

Примечание: Эти IP-адреса используются в контексте, когда трафик к ним перехватывается до отправки в интернет. Эти маршрутизируемые в интернете IP-адреса не являются вредоносными вне контекста атаки AitM.

24.9.51[.]94

35.214.56[.]2

38.9.8[.]78

52.3.8[.]25

59.6.8[.]25

209.19.37[.]184

Email-адреса

fhtgbbwi@mail[.]ru

nvjfnvjfnjf@mail[.]ru

glen.morriss75@seznam[.]cz

SunyaF@seznam[.]cz

Техники MITRE ATT&CK

Эта таблица составлена с использованием версии 13 фреймворка MITRE ATT&CK.

Тактика

ID

Название

Описание

Разведка (Reconnaissance)

T1590.005

Сбор информации о сети жертвы: IP-адреса

Операторы MoustachedBouncer собирали IP-адреса или блоки адресов своих целей, чтобы модифицировать сетевой трафик только для этих адресов.

Первоначальный доступ (Initial Access)

T1189

Компрометация через браузер (Drive-by Compromise)

Disco доставляется через поддельный сайт обновлений Windows.

Выполнение (Execution)

T1204.002

Выполнение пользователем: вредоносный файл

Disco требует ручного запуска жертвой.

Закрепление (Persistence)

T1053.005

Планировщик заданий/Задание: Планировщик заданий

Disco закрепляется как запланированная задача, которая каждую минуту скачивает исполняемый файл из «поддельного» SMB-ресурса.

T1543.003

Создание или изменение системного процесса: Служба Windows

NightClub закрепляется как ServiceDll службы с именем WmdmPmSp.

Повышение привилегий (Privilege Escalation)

T1068

Эксплуатация для повышения привилегий

Disco имеет плагин для эксплуатации уязвимости повышения локальных привилегий CVE-2021-1732.

Обход защиты (Defense Evasion)

T1140

Деобфускация/декодирование файлов или информации

С 2020 года NightClub использует внешний конфигурационный файл, зашифрованный RSA.

Сбор данных (Collection)

T1005

Данные с локальной системы

NightClub крадет недавние файлы с локальной системы.

T1025

Данные со съемных носителей

NightClub крадет файлы с локальной системы.

T1056.001

Захват ввода: Кейлоггер (Keylogging)

NightClub имеет плагин для записи нажатий клавиш.

T1113

Захват экрана (Screen Capture)

NightClub и Disco имеют плагин для создания скриншотов.

T1123

Захват аудио (Audio Capture)

NightClub имеет плагин для записи аудио.

Командование и управление (Command and Control)

T1071.002

Протокол прикладного уровня: Протоколы передачи файлов (File Transfer Protocols)

Disco общается через протокол SMB.

T1071.003

Протокол прикладного уровня: Почтовые протоколы (Mail Protocols)

NightClub общается через протокол SMTP.

T1071.004

Протокол прикладного уровня: DNS

Один из плагинов NightClub — это backdoor, который общается через DNS.

T1132.001

Кодирование данных: Стандартное кодирование (Standard Encoding)

NightClub кодирует файлы, прикрепленные к письмам, в base64.

T1132.002

Кодирование данных: Нестандартное кодирование (Non-Standard Encoding)

NightClub кодирует команды и ответы, отправляемые через свой DNS C&C канал, с использованием модифицированной формы base64.

T1573.001

Зашифрованный канал: Симметричная криптография (Symmetric Cryptography)

NightClub получает плагины в виде вложений электронной почты, зашифрованных с использованием AES-CBC.

T1557

Атака «человек посередине» (Adversary-in-the-Middle)

MoustachedBouncer выполнял AitM на уровне интернет-провайдера, чтобы перенаправить свои цели на поддельную страницу обновлений Windows. Также они использовали AitM по протоколу SMB для доставки вредоносных файлов с «поддельных» серверов.

Кража данных (Exfiltration)

T1041

Кража данных через C2 канал (Exfiltration Over C2 Channel)

NightClub и Disco крадут данные через C&C канал (SMTP, SMB и DNS).

Воздействие (Impact)

T1565.002

Манипуляция данными: Манипуляция переданными данными (Transmitted Data Manipulation)

MoustachedBouncer модифицировал HTTP-трафик с определенных IP-адресов на уровне интернет-провайдера, чтобы перенаправить свои цели на поддельную страницу обновлений Windows.

Читать полный анализ на WeLiveSecurity →