Анализ вредоносного ПО Thunder
TL; DR
13-го апреля 2023 года в мессенджере Telegram обнаружена рассылка с архивом под красноречивым названием 这几笔错误的账单我圈出来了你看看.zip:
Сообщение с архивом
В результате анализа удалось выяснить, что архив содержит вредоносное программное обеспечение нацеленное на пользователей ОС семейства Windows, краткая схема работы которого представлена на следующем рисунке:
Схема работы ВПО
где 1 — получение архива, 2 — ручное извлечение и запуск пользователем загрузчика ВПО, 3 — подгрузка ВПО с сервера злоумышленника в сети CloudFlare,
4 — передача управления основной вредоносной программе, 5 — подключение
к серверу управления и получение команд.
В этой статье представлен технический анализ трояна. Он может быть полезен специалистам ИБ, которым хочется изучить возможности данного семпла или ознакомиться базовыми подходами ручного анализа вредоносного ПО.
Технический анализ
Загрузка
В архиве находится одноимённый исполняемым EXE файл (MD5: 50351169d2ee00143091254fc7e8b3ab), название которого в дословном переводе гугл-транслейта означает «Я обвел эти неправильные счета, чтобы вы могли видеть.exe». Ну-с, очень заманчиво. Отметим, что вредонос совсем не «юзерфрендли», так как пользователь должен сам распаковать и запустить его.
Тем не менее, откроем его с помощью любого удобного дизассемблера. Перейдя к main-процедуре видим, что если пользователь запустит файл, то программа скачает ряд файлов с сервера imgcache.vip033324[.]xyz, используя функцию WinAPI URLDownloadToFile:
Фрагмент дизассемблированного кода загрузчика
Отметим, что загрузчик первой стадии (beacon, stager в англоязычных источниках) никак не защищен от статического или динамического анализа. Впрочем, даже с обфускацией время жизни подобных семплов до детекта AV-решениями идёт на дни, так что ничего особенного в этом нет.
Разреверсив бинарь окончательно, получаем перечень загружаемых файлов и путей их сохранения (пытливые читатели на данном этапе могут попытаться скачать эти файлы и подключиться к анализу, если домен ещё не снесли):
URL на сервере http://imgcache.vip033324[.]xyz | Локальный путь сохранения файла |
/picturess/2023/30.45.txt | C:\ProgramData\setting.ini |
/picturess/2023/LiveUpdate.exe | C:\ProgramData\Thunder\LiveUpdate.exe, C:\ProgramData\ThunderUpdate\LiveUpdate.exe |
/picturess/2023/Mediax.xml | C:\ProgramData\Thunder\Media.xml |
/picturess/2023/RSD.xml | C:\ProgramData\ThunderUpdate\Media.xml |
/picturess/2023/update.log | C:\ProgramData\Thunder\update.log |
/picturess/2023/LiveUpdate360.dat | C:\ProgramData\Thunder\LiveUpdate.dat, C:\ProgramData\ThunderUpdate\LiveUpdate.dat |
Эта информация вкупе с адресом сервера — мастхев для любых систем обнаружения таких вредоносов, так как позволяет защититься ещё до внедрения трояна в систему, или же вылечить систему путём удаления необходимых для вредоноса файлов.
Далее перейдём к поиску «полезной нагрузки», ведь загрузчик пока никаких вредоносных действий не выполнил (да и не может их выполнить, в нем просто нет такого функционала). Может это и не вредонос вовсе, а какая-нибудь вычурная китайская программа обновления ПО?
Распаковка LiveUpdate.exe
После загрузки необходимых файлов, beacon запускает скачанную программу LiveUpdate.exe. С помощью программ типа Binwalk, DetectItEasy, PEInfo (или же просто в дизассемблере) легко можно обнаружить, что эта программа запакована с помощью упаковщика с открытым исходным кодом UPX. Просто скачиваем её с официального сайта (https://upx.github.io/) и распаковываем LiveUpdate.exe. Снова отметим, что ничего вредоносного в UPX нет, он часто используется разработчиками для сокращения размера своих программ.
Распаковка LiveUpdate.dat
Загружаем распакованный LiveUpdate.exe в дизассемблер и видим… Ничего? Да, файл не выглядит особо вредоносным, но почему-то содержит в себе виртуальную машину LUA?! Интересно… На этом этапе может помочь динамический анализ, чтобы определить, зачем же всё-таки нужен этот файл (только лучше делать это на виртуальной машине не имеющей доступа к сети). А можно не лезть в отладчик, а взглянуть на другие загруженные beacon-ом файлы.
Кроме LiveUpdate.dat, все остальные бинарные файлы в каком-то неясном формате, а вот LiveUpdate, как можно заметить в хекс-редакторе, является ZIP-архивом. Однако открыть вы его не сможете, он требует пароля. Что же, давайте попробуем поискать, кто же его разархивирует? В строках LiveUpdate.exe замечаем LiveUpdate.dat и названия запакованных в нём файлов. Переходим по ссылкам, и спустя несколько минут поисков видим, что LiveUpdate.exe разархивирует и загружает в память содержимое файла используя пароль, так же находящийся в строках файла в открытом виде:»3D9E9F5F9B2B40E1A9158385E2E4B660»:
Фрагмент дизассемблированного кода LiveUpdate.exe
Из архива в память загружаются два файла — _TUProj.dat (80 КБ)
и _TUProjDT.dat (4 байта). Если открыть их в шестнадцатеричном редакторе, то можно заметить, что в файле _TUProj.dat располагаются различные скрипты LUA (теперь понятно зачем его реализация есть в LiveUpdate.exe).
Среди скриптов обнаруживается некий ClientScript:
Фрагмент LUA-скрипта из _TUProj.dat
Даже не зная языка LUA, можно заметить, что в этом коде происходит выделение памяти на куче для массива чисел из переменной g_table_char (24), преобразуемого в массив байт и загружаемого в выделенную память (29). Вообще цепочка вида VirtualAlloc (выделить память), заполнить её какой-либо функцией (RtlFillMemory), и начать исполнять (CreateThread) — очень типична, и сразу бросается в глаза. После загрузки по данному адресу создаётся новый поток выполнения (38). После этого скрипт в цикле загружает картинку с сайта baidu.com (генерация мусорного трафика для отвлечения внимания).
Отлично, вооружимся любым скриптовым языком (я выбрал Python) и преобразуем последовательность из переменной g_table_char в двоичный код, и загрузим его в дизассемблер.
Распаковка Media.xml
Декомпилируем, ищем строки и видим, что новый поток кода, полученный из переменной g_table_char, считывает скачанный ранее файл Media.xml из текущей рабочей директории программы и правит первые 4 байта файла: buf[i] = (buf[i] ^ 0×30) + 0×30 (i <= 4).
Чтение и корректировка файла Media.xml в коде g_table_char
После исправления обнаруживается, что данный файл является исполняемым файлом Windows формата PE (сигнатура MZ там со времен MS-DOS). Впрочем, об этом и так можно было догадаться и так, открыв файл в hex-редакторе.
Фрагмент исправленного заголовка Media.xml
После этого, как ни странно, исполнение переходит в загруженный и исправленный файл. Что ж, ожидаемо. Грузим и этот файл в дизассемблер.
Распаковка update.log
Мы почти добрались до конца этой цепочки, ведь далее загруженный файл Media.xml получает управление в своей точке входа и загружает файл update.log, повторяя описанную ранее процедуру декодирования с байтом 0×30 (только уже для всего файла).
Декодирование update.log
Данный файл после декодирования также представляет из себя исполняемую библиотеку MS Windows, в которую в очередной раз передаётся управление. Отметим про себя, что вредоносный код в этот и в предыдущий раз не использовал стандартные процедуры динамической загрузки исполняемого кода (например, LoadLibrary), а высчитал Entry Point загруженного кода самостоятельно.
Без лишних слов вооружаемся Python-ом, декодируем файл по уже известной формуле и загружаем в дизассемблер
Расшифрование внутреннего файла в update.log
Замечаем, что большая часть библиотеки update.log также упакована, после дизассемблирования в ней можно обнаружить лишь 28 функций (а ведь файл довольно «жирный», почти полтора мегайбайта).
Ищем начало недизассемблированных данных и видим, что на них есть ссылка в коде, бинго! Обнаруживаем циклическое расшифрование 1105920 байт по адресу 0×04010A0 XOR-ом на 40-битном ключе 0xBE16CF52CD:
Расшифрование в update.log
Повторяем эту процедуру с помощью всё того же питона, и с удивлением (нет) обнаруживаем, что расшифрованные данные также представляют из себя DLL-библиотеку. Срочно грузим в дизассемблер.
Единственной экспортируемой процедурой этой библиотеки (помимо стандартной DLLMain) является процедура под названием Shellex. Далее управление из update.log переходит в неё.
Вот и всё, мы извлекли основную «полезную нагрузку». Бегло проанализировав полученный файл можем увидеть, что он действительно подозрительно напоминает вредоносный файл, или… нестандартное средство удалённого администрирования. Далее в статье будут представлены некоторые результаты статического анализа этого файла и динамического анализа вредоноса в целом.
Закрепление
Если открыть планировщик задач Windows, то можно заметить, что вредонос закрепляет свой запуск в системе путём добавления задачи ThunderLiveUpdate и красноречиво названной задачи «Ñ¸À׸üзþÎñ».
Созданные трояном задачи в планировщике задач Windows
Это один из типичных способов закрепления, так что одним из первых пунктов анализа взломанных машин можно проверять именно планировщик (например, утилита Autostart из пакета Sysinternals поможет обнаружить этот и многие другие способы закрепления).
Взаимодействие с C2
Чтобы быть полезным для злоумышленников, троян должен откуда-то получать команды и куда-то отправлять данные. Этот вредонос для связи с сервером получает IP-адрес сервера злоумышленников из скачанного на первом этапе файла setting.ini:
IP-адрес сервера злоумышленников в setting.ini
Вредоносный агент взаимодействует с сервером злоумышленника по нестандартному протоколу поверх TCP (порт 18076):
Фрагмент трафика взаимодействия с сервером злоумышленников
В результате статического анализа кода дизассемблером и декомпилятором можно уточнить формат данного протокола (просто ищем сетевые импортированные функции, и пытаемся найти нужные вызовы). Все данные при отправке кодируются побайтово в соответствии со следующим кодом:
Кодирование / Декодирование пакета
Если декодировать таким образом представленный ранее пакет, то можно обнаружить следующие данные:
Фрагмент декодированного пакета
Первые три байта 0×687620 являются сигнатурой протокола «hx » (в закодированном виде — 0xF6E6AE). Её инициализация также обнаружена в коде:
Инициализация сигнатуры протокола
По этой сигнатуре и порту назначения возможно обнаружение такого трафика в сети. Впрочем, в других версиях и модификациях вредоноса эти данные могут быть изменены. Следующие 4 байта заголовка — полный размер пакета в формате Little Endian (в приведённом выше примере — 0xCB030000 == 0×03CB).
Анализ возможностей
Если продолжить реверс полученного бинаря, и перейти от сетевых вызовов к реализации протокола, то путём анализа «сверху вниз» можно обнаружить, что после компрометации системы троян предоставляет злоумышленнику достаточно широкие возможности по управлению системой, среди которых имеются, например:
• различные форматы удалённого администрирования;
• взаимодействие с периферийными устройствами;
• контроль файловой системы;
• осуществление сетевой активости;
• зачистка следов веб активности;
• логирование действий и запись экрана;
• похищение аутентификационных данных;
• обнаружение антивирусного ПО;
• подгрузки и выполнения произвольного кода;
Можно пойти обратным, «восходящим» путём анализа, и перейти от вызовов «полезных» импортированных функций WinAPI (запуск процессов, модификация реестра, взаимодействие с устройствами) ко всему доступному функционалу в целом. Как правило, в ходе реверса применяется и то и другое сразу.
Далее чуть подробнее остановимся на некоторых возможностях вредоноса.
В качестве одного из способов удалённого управления злоумышленник может при необходимости активировать сервис RDP на компьютере:
Фрагмент процедуры активации RDP
Точно неизвестно, как злоумышленники планируют к нему подключаться, но учитывая возможность исполнения произвольного кода, вполне возможен запуск реверс-прокси.
Для аутентификации злоумышленник может создать произвольного пользователя или модифицировать гостевую учетную запись, активировать её и добавить в группу администраторов:
Процедура активации учетной записи guest
Интересно также целевое назначение вредоноса. Ввиду того, что он ориентирован на китайских пользователей, в нем реализован функционал взаимодействия с китайской социальной сетью и мессенджером qq.com. В результате анализа различных скриптов автоматизации использования API qq.com, которые можно обнаружить, например, на github.com (https://gist.github.com/kagurazakasanae/a76b01f60c89aa3866dfc689345a3faf, https://github.com/LeoHuang2015/qqloginjs/) удалось разобрать некоторые процедуры такого взаимодействия.
Сначала в процедуре осуществляется аутентификация в qq под всеми доступными аккаунтами текущего пользователя,
Фрагмент процедуры аутентификации в qq.com
затем происходит получение списка друзей пользователя:
Фрагмент процедуры получения списка друзей пользователя
и групп, в которых он состоит:
Фрагмент процедуры получения групп пользователя
Для каждой группы предпринимается попытка получить список пользователей этой группы:
Фрагмент процедуры получения списка пользователей группы
И вся эта информация благополучно отправляется на сервера злоумышленников. Зачем? Точно неизвестно. Возможно, для того чтобы отправить всем доступным пользователям этот же самый троян с аккаунта жертвы и осуществить распространение вредоноса таким образом. А может, для проведения социологических исследований…
Среди прочего, в троян встроены команды завершения процессов различных браузеров и очистки их кэша:
Команды по очистке следов активности
Заметим, что некоторые из них также очень специализированы для китайской аудитории. Вкупе с возможностями по записи экрана и кейлоггингу сброс кеша браузеров позволяет злоумышленникам похищать аутентификационную информации различных сервисов.
Заключение
В статье представлен анализ трояна, в ходе которого мы познакомились с некоторыми базовыми техниками анализа вредоносного ПО, а также с техниками, которые злоумышленники используют для сокрытия полезной нагрузки вредоносов.
Данный троян предоставляет злоумышленникам гибкие возможности по удалённому контролю и получению информации в системе, в том числе — чтение, изменение и создание файлов и процессов, активация RDP и других стандартных сервисов администрирования, осуществление сетевой активности и запуск сетевых сервисов, логирование нажатий клавиш и создание скриншотов экрана, запись звука, создание и удаление пользователей, получение аутентификационной информации, модификация реестра Windows.
Отметим, что никаких продвинутых техник по обфускации и антиотладке он не использует и с точки зрения защиты кода является достаточно примитивным. Но даже так, вредоносный код скрыт от автоматического обнаружения статическим путём, и без динамического анализа (например, запуска вредоноса в песочнице, эмуляции), антивирусу будет сложно идентифицировать модификации данного семпла.
MD5-хеш исходного архива: 62275e818ff92c030f75fdb89cddd40b, на текущий момент некоторые антивирусные решения уже отмечают его как троян семейства «lotok» (https://www.virustotal.com/gui/file/fe00e9c691f85871adfd4d8b43e6ba4a797f89cde8f5f9239884c60809b475ac/detection), однако подробной информации об этом трояне нет.
Идентификация трояна на VirtusTotal
На момент обнаружения трояна VirusTotal считал данный файл безопасным. А подгружаемые им файлы и до сих пор считаются безопасными большинством AV-вендоров.
В заключение ещё раз приведём некоторые индикаторы компрометации системы данным вредоносом.
URL загрузки файлов и соответствующие им хеши сохраняемых файлов:
URL на сервере http://imgcache.vip033324[.]xyz | Локальный путь сохранения файла в директорию C:\\ProgramData\\ | MD5 |
/picturess/2023/30.45.txt | setting.ini | 9dd530e124f1c6425e975fa9b66cee13 |
/picturess/2023/LiveUpdate.exe | Thunder\\LiveUpdate.exe, ThunderUpdate\\LiveUpdate.exe | 96e4b47a136910d6f588b40d872e7f9d |
/picturess/2023/Mediax.xml | Thunder\\Media.xml | 3668799602e1e5b94bf893141b4b76e6 |
/picturess/2023/RSD.xml | ThunderUpdate\\Media.xml | 481b4106e3f1e40a98e3e89c385ecc7b |
/picturess/2023/update.log | Thunder\\update.log | 8c4862a32095d0b71fcf8fb0b244161a |
/picturess/2023/LiveUpdate360.dat | Thunder\\LiveUpdate.dat, ThunderUpdate\\LiveUpdate.dat | f149d3f3ef0361ebe4d346811f29b527 |
Задачи в планировщике задач Windows
ThunderLiveUpdate |
ѸÀ׸üзþÎñ |
Домены, к которым троян получает доступ
imgcache.vip033324[.]xyz |
43.249.30[.]45 (конфигурируется через setting.ini) |
UserGate MRC. Автор: Шаих Галиев, ведущий реверс-инженер
Понравилась ли вам статья? Пишите в комментах!