Platinum является одной из самых технологически продвинутых APT-группировок и традиционно действует в Азиатско-Тихоокеанском регионе (APAC). Недавно мы обнаружили, что группа использует новый инструмент — бэкдор, который мы назвали Titanium (таким паролем был зашифрован один из SFX-архивов, который был обнаружен во время анализа). Говоря об атаке в целом, Titanium — это финальный этап заражения в многоуровневой схеме установки троянца на атакуемую систему. Все этапы успешно скрываются на компьютере жертвы благодаря тому, что каждый из них выдаёт себя за популярное ПО (антивирусные продукты, утилит из дистрибутива с аудио-драйверами, программы для создания DVD-видео).
География атакованных систем
Согласно нашему исследованию, основными целями новой кампании APT Platinum были организации, расположенные в Южной и Юго-восточной Азии.
Вступление
Как уже было сказано, Titanium APT представляет собой последовательность из нескольких этапов внедрения вредоносного ПО на компьютер жертвы, где конечным результатом атаки является троянец-бэкдор. В каждом конкретном случае для осуществления атаки обычно используется следующий набор вредоносного ПО:
- Эксплойт, позволяющий исполнять вредоносный код с правами SYSTEM.
- Шеллкод, –который должен загрузить на атакуемую систему следующий компонент схемы заражения.
- Загрузчик, скачивающий защищенный паролем SFX-архив с командного сервера (C&C). Архив содержит файлы, необходимые для добавления задачи в планировщик задач Windows. Благодаря созданной задаче, зловред закрепляется в системе
- Защищенный паролем SFX-архив, содержащий установщик троянца-бэкдора
- Скрипт-установщик бэкдора в систему (PowerShell)
- DLL-библиотека COM-объекта (загрузчик бэкдора)
- Собственно, сам троянец-бэкдор (Titanium)
Вектор заражения
Мы считаем, что для распространения на компьютеры жертв Titanium использует локальные веб-ресурсы.
1 – Шеллкод
Ещё одним известным способом распространения Titanium является использование шеллкода, который внедряется в память какого-либо процесса. В рассматриваемой кампании использовался системный процесс winlogon.exe. К сожалению, нам не известно, каким образом шеллкод попадал на компьютеры жертв.
2 – DLL-обёртки
Атакующие активно использовали различные типы «обёрток». Каждая из них обычно являлась DLL-библиотекой COM-объекта с соответствующими экспортируемыми функциями. Задачей данных DLL является расшифровка и загрузка в оперативную память зашифрованных файлов – полезной нагрузки, ранее распакованной или загруженной из интернета. Далее происходит перенаправление вызовов функций библиотеки-«обёртки» на экспортируемые функции полезной нагрузки.
Имеется также и другой тип DLL-«обёрток», который нужен лишь для создания новых процессов с аргументами командной строки, переданными в экспортируемую функцию библиотеки-«обёртки».
3 – Установщик задачи в планировщик задач Windows (SFX-архив)
Представляет собой защищенный паролем SFX-архив, который скачивается с C&C через BITS-загрузчик. Пароль к архиву жёстко задан в коде загрузчика, и передаётся при запуске самораспаковывающегося архива в качестве аргумента командной строки с помощью ключа «-p«.
Главной особенностью данного архива является то, что он содержит в себе код открытого ПО cURL, скомпилированный в виде DLL-библиотеки.
В результате запуска архива в планировщике задач Windows появится задача, благодаря которой зловред сможет оставаться в системе после перезагрузки.
Установщик троянца-бэкдора (SFX-архив)
Собственно, сам бэкдор использует самораспаковывающийся архив, который может быть запущен из командной строки с указанием пароля для его распаковки. Все примеры здесь и далее будут указаны для варианта с ПО для создания DVD-видео, но схема установки остаётся такой же и для других вариантов.
BITS-загрузчик
Этот компонент использовался для скачивания зашифрованных файлов с командного сервера злоумышленников и их последующего запуска.
Описание шеллкода
Шеллкод представляет из себя позиционно-независимый код (PIC), располагающийся в памяти определённого процесса, и не требует каких-либо предварительно загруженных библиотек, кроме Kernel32.dll. Задачами шеллкода являются установка соединения с C&C злоумышленников, загрузка зашифрованной полезной нагрузки (SFX-архива), последующая ее расшифровка и запуск с использованием жёстко заданного в коде пароля. Обычно командная строка в результате выглядит так:
1 |
"rundll32 "$temp\IOZwXLeM023.tmp",GetVersionInfo -t 06xwsrdrub2i84n6map3li3vz3h9bh4vfgcw" |
Описание BITS-загрузчика
BITS-загрузчик представляет из себя DLL-библиотеку с единственной экспортируемой функцией: GetVersionInfoA. Единственной задачей библиотеки является скачивание зашифрованных файлов с C&C злоумышленников и их запуск.
Последовательность исполнения
Первое, что делает загрузчик — это проверяет, запущен ли процесс, в памяти которого он находится, с правами SYSTEM. Если проверка прошла успешно, загрузчик с использованием WMI запускает командую строку, которая была передана шеллкодом на предыдущем этапе. В противном случае загрузчик проверят наличие в указанных аргументах командной строки следующих ключей:
Ключ | Описание параметра |
-c URL | Задаёт URL, куда будет отправлена информация о системе. |
-t STRING | Дополнительная строка, которая будет добавлена к строке запроса к C&C злоумышленников. |
-u URL | URL-адрес сервера, на который будут отправляться различные запросы и подтверждения во время работы загрузчика. |
-br GUID | Прекращение скачивания полезной нагрузки. Параметр GUID должен содержать корректный идентификатор созданной BITS-задачи. |
Если указан хотя бы один из этих аргументов, загрузчик соберёт и отправит информацию об установленных защитных продуктах на C&C.
После этого загрузчик отправляет запрос на скачивание полезной нагрузки, в ответ C&C-сервер злоумышленников отдаёт файл, который будет загружен в каталог %USERPROFILE%.
Чтобы расшифровать загруженный файл, используется MD5-хэш от ключа, которым зашифрованы строки в коде загрузчика.
URL для запроса полезной нагрузки
Адрес по умолчанию: http://70.39.115.196/payment/confirm.gif
Строка запроса обычно выглядит так:
- http://70.39.115.196/payment/confirm.gif?f=1 (x86)
- http://70.39.115.196/payment/confirm.gif?f=2 (x64)
Расшифровка и запуск полезной нагрузки
Так выглядит структура зашифрованного файла:
1 2 3 4 5 |
typedef struct { byte hash[16]; // md5 hash of the following data dword data_size; byte data[data_size]; } enc_data; |
Загрузчик считает хэш MD5 от поля data, сравнивает результат с содержимым поля hash и, если контрольная сумма совпадает, выполняет следующие действия:
- Добавляет расширение DLL или EXE, в зависимости от типа загруженного файла
- Сохраняет загруженный файл в каталоге %TMP% с именем %(SystemTimeAsFileTime.dwLowDateTime).%TMP
Далее загрузчик формирует аргументы командной строки для загруженного файла. В случае, если загруженный файл является DLL-библиотекой, командная строка будет выглядеть так:
1 |
"%systemroot%\system32\rundll32.exe %(SystemTimeAsFileTime.dwLowDateTime)%.TMP,-peuwewh383eg -t 06xwsrdrub2i84n6map3li3vz3h9bh4vfgcw" |
После этого загрузчик самоудаляется, используя следующую команду:
1 |
/c for /L %i in (1,1,100) do ( for /L %k in (1,1,100) do (del /f /q module_path > NUL & if not exist module_path exit /b 0)) |
Запуск файла
Для запуска загруженного файла, загрузчик использует WMI-классы, такие как Win32_ProcessStartup, Win32_Process.
Скачивание файла с использованием BITS
Для скачивания файла загрузчик использует BITS-службы Windows и COM-интерфейс IBackgroundCopyManager. Загрузчик создаёт задачу с именем «Microsoft Download», указывая затем URLы скачиваемого и локального файлов, а также необходимые таймауты.
Установка задачи для планировщика задач (SFX-архив с cURL)
Архив содержит файлы:
Имя | Описание |
p.bat | Запускает cURL и обфусцированные ps1-скрипты |
c.dll | cURL, скомпилированный в виде DLL (7.50.3) |
f1.ps1 | Будет запущен после первого запроса к CC. Расшифровывает x.dat |
f2.ps1 | Будет запущен после второго запроса к CC. Расшифровывает b.dat |
e.ps1 | Содержит код, который генерирует строку для поля Authorization в HTTP-заголовке |
h.ps1 | Получает информацию о настройках прокси в системе |
e.dll | DLL-библиотека с единственной экспортируемой функцией. Вызывает CreateProcessA |
Загружаются файлы:
Исходный файл | Загруженный и расшифрованный файл | Описание |
x.dat | u.xml | Файл, зашифрованный с помощью AES (f1.ps1 содержит алгоритм расшифровки) |
b.dat | i.bat | Файл, зашифрованный с помощью AES (тот же алгоритм шифрования) |
Результат:
Имя | Описание |
i.bat | Выполняет установку задачи для планировщика задач Windows |
Процесс, запускающий SFX-архив (предыдущий этап), должен указать следующие аргументы командой строки:
Аргумент | Описание |
-pKEY | Аргумент, содержащий ключ для распаковки SFX-архива |
-t ACCEPTANCE_ID_STRING | Аргумент со строкой — AcceptanceID (используется в запросах к C&C) |
p.bat
Запускает скрипт h.ps1 для получения информации о используемом в системе прокси-сервере. Далее запускает скрипт e.ps1, чтобы сгенерировать SystemID, который будет использоваться в запросах к C&C.
Для отправки запроса используется c.dll — cURL DLL-библиотека с единственной экспортируемой функцией DllGetClassObject.
Запрос 1
Аргументы командной строки:
Где:
Параметр | Описание |
%pp% | Прокси-сервер, используемый в системе |
%output% | SystemID |
%p3% | AcceptanceID |
Этот запрос скачивает файл x.dat, который затем расшифровывается с помощью скрипта f1.ps1 в файл u.xml. После этого p.bat выполняет следующий запрос.
Запрос 2
Аргументы командной строки:
Этот запрос скачивает файл b.dat, который затем расшифровывается с помощью скрипта f2.ps2 в файл i.bat (используется тот же алгоритм дешифрования).
Установка задачи в планировщик Windows
После расшифровки файла в командной строке запускается следующая команда, которая устанавливает задачу в планировщик:
i.bat использует предыдущий расшифрованный файл u.xml в качестве дескриптора задачи для планировщика.
Установщик троянца-бэкдора
Архив распаковывает содержащиеся в нём файлы в следующий каталог (в варианте с ПО для создания DVD-видео):
Содержимое архива:
Имя | Описание |
BabyBoyStyleBackground.wmv | Файл конфигурации для бэкдора |
DvDupdate.dll | Загрузчик троянца-бэкдора |
nav_downarrow.png | Троянец-бэкдор |
psinstrc.ps1 | Скрипт-установщик загрузчика |
Единственное отличие варианта с использованием ПО настройки аудио-драйверов от варианта с использованием имён от ПО для создания DVD-видео заключается только в том, что злоумышленники используют известные CLSID другого ПО для подмены загружаемых библиотек на вредоносные.
psinstrc.ps1
Представляет из себя установочный скрипт, который регистрирует библиотеку DvDupdate.dll как сервис «DVDMaker Help» и устанавливает точку входа (основную исполняемую функцию) как DllGetClassObject. Это требует прав администратора для корректного исполнения.
Скрипт также содержит конфигурируемые параметры, поэтому злоумышленник может легко изменять их под каждую атакуемую систему.
В итоге, существует два способа установки загрузчика для бэкдора:
- Системная служба с экспортируемой функцией DllGetClassObject в качестве ServiceMain
- COM-библиотека для подмены ей других известных COM-объектов (CLSID Hijacking)
DvDupdate.dll
Представляет из себя сервисную DLL-библиотеку, экспорты которой абсолютно идентичны тем, которые должна экспортировать обычная COM-библиотека. Является загрузчиком троянца-бэкдора.
Весь код обфусцирован посредством вызовов различных функций Windows API с использованием циклов с большим количеством итераций. Это сделано не с целью сделать задачу реверс-инженера сложнее, а с целью обхода некоторых антивирусных движков.
Первой вызываемой функцией данной библиотеки всегда будет DllGetClassObject.
DllGetClassObject
Загрузчик создаёт поток, который расшифровывает полезную нагрузку, восстанавливает MZ и PE тэги и загружает в память основного исполняемого файла бэкдор Titanium. Содержимое зловреда зашифровано с помощью AES 256 CBC, а ключ расшифровки жёстко задан в теле загрузчика, как и другие зашифрованные строки. Как уже было сказано, тело троянца не содержит ‘MZ’ и ‘PE’ тегов, что позволяет ему обходить некоторые защитные продукты. После инициализации бэкдора в памяти загрузчик вызывает его экспортируемую функцию с ординалом 1.
nav_downarrow.png
Представляет собой DLL-файл, содержащий основной функционал Titanium. Вредоносный код содержится только в экспортируемой функции с ординалом 1.
nav_downarrow.png — Ординал 1 (Основная функция троянца)
Первое, что делает данная функция, это расшифровка другого зашифрованного файла – файла конфигурации – из SFX-архива:
Файл конфигурации разбит на блоки, и каждый блок имеет свой индекс. Бэкдор использует эти индексы для доступа к конкретным элементам. Файл конфигурации содержит:
- Адрес командного сервера
- Ключ шифрования трафика
- UserAgent
- Другие менее важные параметры
Основной поток
Данный поток отвечает за получение команд от C&C и отправку ответов. При формировании запроса используются параметр UserAgent из конфигурации и специальный алгоритм генерации cookie-строки. Также, зловред может использовать системные настройки прокси из Internet Explorer.
В ответ на данный запрос командный сервер отдаёт PNG-файл, который содержит спрятанные с помощью стеганографии данные. Эти данные зашифрованы тем же ключом, что используется в запросах к C&C. Расшифрованные стеганографические данные содержат команды для бэкдора и аргументы к ним.
Примеры PNG-изображений:
Командный процессор (описание команд)
Бэкдор может принимать множество различных команд, приводим только самые интересные из них:
- Чтение любого файла на компьютере жертвы и отправка его на C&C.
- Загрузка (или удаление) файла на компьютер жертвы.
- Загрузка и запуск файла.
- Запуск командной строки с последующей отправкой результатов работы на C&C.
- Обновление параметров конфигурации (кроме ключа шифрования трафика).
- Интерактивный режим. Позволяет принимать от злоумышленника данные для ввода в консоль с отправкой результатов на сервер.
Выводы
Titanium представляет собой довольно сложную и многоуровневую схему из загружаемых и устанавливаемых на компьютеры жертв компонентов. такой подход требует хорошей координации действий между каждым из компонентов. Вдобавок, ни один из загружаемых и устанавливаемых на файловую систему компонентов не может быть определён как вредоносный, т.к. авторы Titanium применяют шифрование для каждого из загружаемых на диск файла в сочетании с «fileless» техниками запуска кода. Другим ключевым моментом является использование имён каталогов и файлов реально существующего и популярного ПО.
Titanium: APT-группа Platinum снова атакует