Главная » Хабрахабр » Опасное приглашение, или Как работает боевая нагрузка к фишинговому письму

Опасное приглашение, или Как работает боевая нагрузка к фишинговому письму

В этом материале мы расскажем, как обычный с виду документ превращается в троян, позволяющий злоумышленнику захватывать изображение с веб-камер, записывать звук по команде или при обнаружении окна Skype, запускать PowerShell-скрипты, делать скриншоты экрана, копировать файлы с медиаустройств. Недавно специалисты PT ESC обнаружили документ формата Publisher с названием «Приглашение 29–30 ноября 2018.pub» (1edd5b6a02ec82cec381c1a1ec74a67e).

Итак, при открытии документа появляется окно с размытым документом-заглушкой и просьбой включить скрипт Microsoft Publisher.

Выглядит он так: После того как пользователь его включит, исполнится встроенный в документ сценарий на JavaScript.

Оба файла будут записаны по адресу C:\Users\\AppData\Roaming\DBFUpdate. Результатом работы скрипта будет раскодирование двух файлов, PDF и EXE, из Base64. Соответственно, оба файла исполнятся, и пользователь увидит на экране документа такую заглушку:

Treasure Hunter RAT

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

Особенности кода:

  1. Целиком написан на С++ с большим количеством STL-конструкций, которые используются внутри.
  2. Применение библиотеки boost, в частности JSON и Archive.
  3. Отладочные функции (подробнее в секции, посвященной stager).

Основной троян

Основной троян закрепляется на машине жертвы и представляет из себя платформу, на которую загружаются из С2 вредоносные модули.

Сначала stager инициализирует рабочую директорию, в которой впоследствии будут храниться собранная модулями информация, утилиты, необходимые для работы модулей, и т. п.

Ниже — инициализация путей для создания рабочей директории:

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

Троян интересуется такими данными:

  • идентификатором версии ОС, на которой запущен основной троян;
  • установленным по умолчанию языком интерфейса;
  • старшим номером версии Service Pack ОС;
  • именем компьютера и идентификатором машины (подробнее о получении идентификатора машины — в разделе, посвященном сетевому протоколу).

Так происходит сбор информации о зараженной машине:

Здесь прописывается имя исполняемого файла, которое было выделено при инициализации рабочей директории, в этом случае оно равно «DCTHOST.exe». Далее основной троян закрепляется на зараженной машине через модификацию значения в реестре по адресу HKCU\Environment\UserInitMprLogonScript. Данный способ описан в блоге Hexacorn, a также использовался APT28 и группой Cobalt в их ComDLLDroper.

И последний шаг в инициализации основного трояна — копирование исполняемого файла из его текущего местоположения в рабочую директорию с таким же именем, какое было выделено при инициализации рабочей директории.

В cписок запущенных модулей добавляется модуль Core, коим и является основной троян. После того как основной троян инициализирован, осуществляется подготовка к приему команд. Реализация данной команды в основном модуле отсутствует, вместо нее просто заглушка. Далее запускается команда из модуля Core c идентификатором 0. Конструктор объекта модуля Core представлен ниже.

Один из потоков запускает таймер, который просыпается по умолчанию каждую секунду и пытается запросить команду у С2. В конце происходит запуск двух потоков.

Библиотеки, как и модули, имеют идентификатор, но в отличие от модулей идентификаторы библиотек отрицательные, начинаются с –1, растут в сторону меньших чисел. Второй поток осуществляет загрузку дополнительных библиотек и стандартных модулей. Ниже — список библиотек, загружаемых с С2.

Отладочные функции основного трояна

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

Сетевой протокол

Обмен между ПО и С2 происходит с помощью самописного бинарного протокола. Каждое сообщение описывается с помощью BinPackage (название взято из RTTI). Каждый BinPackage по своей сути является оберткой над std::vector, который хранит в себе набор PackageRecord (название выдумано). PackageRecord является минимальной единицей для хранения данных.

struct PackageRecord
{
_DWORD dataId; _DWORD datatype; _DWORD szData; char[] data;
};

Подробнее о полях этой структуры:

  • dataId — указывает на тип записи. Либо запись является идентификатором модуля, либо идентификатором команды, либо полезной нагрузкой.
  • szData — размер данных, хранимых в записи.
  • datatype — тип данных.

Всего было зафиксировано использование трех типов данных:

  • Значение «0» — означает, что данные, хранимые в записи, необходимо интерпретировать как DWORD.
  • Значение «1» — данные, хранимые в записи, необходимо интерпретировать как ASCIIZ-строку.
  • Значение «2» — данные, хранимые в записи, необходимо интерпретировать как зашифрованные данные/raw buffer.

Идентификатор представляет из себя GUID раздела, из которого вырезаются все спецсимволы. При отправке BinPackage на контрольный сервер к нему добавляется идентификатор машины. На рисунке — получение идентификатора машины:

Для шифрования используется библиотека WinAES, а конкретно AES-128-CBC. Перед отправкой все записи, хранящиеся в BinPackage, собираются последовательно в единый буфер и подвергаются шифрованию.

Один для IV, другой для ключа. С помощью CryptoAPI Windows генерируются два псевдослучайных массива размером 16 байт. Выполняется шифрование, и зашифрованные данные складываются обратно в BinPackage, который содержит зашифрованный пакет и состоит из трех записей:

  • запись с ID 0x777 — содержит в себе ключ, использованный для шифрования;
  • запись с ID 0x555 — содержит в себе IV, использованный для шифрования;
  • запись с ID 0x999 — содержит в себе зашифрованные данные (в общем виде запись с таким ID обозначает полезную нагрузку и используется не только для хранения зашифрованных данных).

После окончания процесса шифрования сформированный BinPackage опять собирается в единый буфер и отправляется через HTTP POST-запрос на управляющий сервер 151.80.237.222.

Ниже — пример пакета, содержащего информацию о машине:

А это пример зашифрованного пакета с информацией о системе:

Модули

Каждый модуль, за исключением Core, загружается с контрольного сервера. Все модули можно разделить на две категории — модули, загружаемые автоматически, и модули, загрузка которых осуществляется по запросу с контрольного сервера.

Пример пакета, запрашивающего модуль:

Ответ на запрос модуля:

Также каждый модуль обладает экспортом c именем GetModule, который строит объект, представляющий данный модуль, и возвращает его основному трояну. Каждый модуль имеет простой интерфейс, состоящий из трех функций: вызываемой при загрузке модуля Init, вызываемой при завершении fini и функции, изменяющей конфигурацию модуля. Все обнаруженные нами модули запускаются в памяти с помощью рефлективной загрузки.

Далее названия модулей даны в том виде, в котором они присутствуют в RTTI как имена классов.

Модуль CCore

Данный модуль представляет базовую функциональность и встроен непосредственно в основной троян. Его конструктор можно увидеть в таблице ниже:

ID модуля

ID команды

Описание

0

0

В основном трояне вместо команды заглушка, и точное ее назначение установить не удалось

1

Изменить конфигурацию модуля

2

Запросить информацию о компьютере

3

Скачать утилиту с контрольного сервера

4

Запросить листинг директории, содержащей утилиты

5

Загрузить модуль и выполнить его

Модуль CShell

Данный модуль предоставляет удаленный шелл на зараженную машину. При инициализации модуля создается процесс cmd.exe, к которому прикрепляются два пайпа: один для стандартного ввода и один для стандартного вывода, через которые осуществляются прием и передача команд от контрольного сервера и обратно. Также в этот момент запускается поток, который автоматически забирает весь вывод и отправляет его на контрольный сервер. На рисунке — инициализация модуля СShell.

ID модуля

ID команды

Описание

2

0

Послать команду в шелл

1

Вывести файл. Читается файл, путь до которого передается с контрольного сервера, и содержимое этого файла загружается на контрольный сервер

2

Получить список всех дисков, существующих в системе. Данные отправляются на контрольный сервер в формате JSON

3

Загрузить файл с контрольного сервера. Путь, куда сохранить файл, и данные получаются с контрольного сервера

Модуль CFileSystemBrowser

Это пассивный модуль, который по запросу позволяет получать информацию о структуре файловой системы. Так происходит инициализация модуля CFileSystemBrowser:

ID модуля

ID команды

Описание

3

0

Получить список всех дисков, существующих в системе. Данные отправляются на С2 в формате JSON

1

Получить листинг директории. Листинг формируется в формате JSON

2

Вывести файл. Читается файл, путь до которого передается с С2, и содержимое этого файла загружается на С2

3

Удалить файл. Путь до файла передается с С2

Модуль CScreenShot

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

ID модуля

ID команды

Описание

4

0

Сделать скриншот и отправить его на контрольный сервер

1

Запустить таймер, после срабатывания которого осуществляется снятие скриншота с экрана машины. Полученные скриншоты упаковываются в BinPackage и сохраняются в папку logs. Имена для файлов генерируются с помощью API GetTempFileName с префиксом «MS_».

2

Получить видео устройств, доступных на зараженной машине

3

Захватить кадр с веб-камеры и отправить его на контрольный сервер

Модуль CSender

Данный модуль изначально не активирован. Осуществляет загрузку содержимого папки logs на контрольный сервер. Активируется тогда, когда приходит запрос на смену конфигурации, в котором содержится период проверки.

Модуль CKeylogger

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

Модуль CDictaphone

Данный модуль осуществляет запись звука по команде или при обнаружении окна Skype. При запуске запускает поток, который перечисляет все окна и их дочерние окна в системе и ищет среди классов окно, имя класса у которого равно TLiveConversation или TCallMonitorControl. Если такое окно было найдено, начинается запись. Ниже — инициализация модуля CDictaphone:

И поиск окна Skype

Так выглядит цикл записи модуля CDictaphone: Запись осуществляется через MCI путем отправки специальных команд.

Закодированный файл сохраняется в папку logs. После закрытия окна или поступления команды на завершение записи полученные данные сохраняются во временную папку, после чего кодируются MP3-кодировщиком lame (он считается утилитой и должен быть уже загружен, заполучить его с контрольного сервера не удалось). Генерация имени папки аналогична генерации имен для скриншотов.

ID модуля

ID команды

Описание

7

0

Начать запись и завершить ее по прошествии 15 минут

1

Остановить запись

2

Проверить статус: ведется ли сейчас запись

Модуль CProcessesManager

Это пассивный модуль, по запросу способный вернуть список процессов или завершить по переданному ему PID.

ID модуля

ID команды

Описание

8

0

Возвращает список процессов: их имена, PID и имя пользователя который является владельцем процесса.

1

Завершение процесса по PID

Модуль CDownloader

Модуль предназначен для загрузки больших файлов на контрольный сервер. Осуществляет передачу данных чанками, размер которых устанавливается его конфигурацией. Модуль читает данные из файла, путь до которого он получает с контрольного сервера, а чанки упаковывает в BinPackage. К каждому BinPackage, содержащему чанк, добавляется запись с идентификатором 0x888, включающая путь до файла. После передачи каждого чанка осуществляется sleep на 5 секунд.

ID модуля

ID команды

Описание

9

0

Заглушка, точное значение установить не удалось

1

Осуществляет передачу большого объема данных (0x500000 байт), после чего замеряет время, потраченное на передачу, и отправляет это значение на С2

2

Осуществляет загрузку файла с машины

Модуль CPS

Данный модуль позволяет запускать PowerShell-скрипты.

ID модуля

ID команды

Описание

10

0

Получает с С2 PowerShell-скрипт и выполняет его

Модуль CDeviceMonitor

Пассивный модуль, который осуществляет мониторинг подключаемых медиаустройств и копирует с них файлы. Для обнаружения подключения устройств использует широковещательные сообщения WM_DEVICECHANGE. После подключения устройства на контрольный сервер отправляется информация о том, когда было подключено устройство, его метка тома и путь до устройства. Код, используемый для получения пути до устройства, очень похож на этот. Все файлы копируются в папку logs. Имена генерируются так же, как для скриншотов. Отдельно создается файл fsIndex.dat, в котором находится сериализованный с помощью boost::archive словарь. Этот словарь хранит оригинальные пути до файлов, которые были скопированы, и их MD5-хеши. Ниже — получение DevicePath:

В качестве эпилога несколько рекомендаций:

  • Не надо открывать вложения в письмах от неизвестных адресатов и тем более включать скрипт Microsoft Publisher.
  • Не менее опасно кликать по ссылкам в письмах неизвестных отправителей. На сайте, куда вы перейдете, может размещаться вредоносное ПО, которое автоматически загрузится на ваш ПК.
  • Необходимо регулярно обновлять ПО, особенно Microsoft Windows и Microsoft Office, что позволит закрыть доступ для широкого спектра вредоносного ПО.

Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

Вырастить и научить. Как мы подружились с PEGA

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

В ЕС добиваются права на ремонт крупной бытовой техники

Источник: Schraube locker!? Им удалось собрать более 100 тыс. Европейские активисты движения «права на ремонт» решили начать с холодильников. подписей под соответствующим документом и даже добиться голосования в Брюсселе по поводу изменения законодательства, имеющего отношение к ремонту бытовой техники. Традиционная ...