![](https://habrastorage.org/getpro/habr/upload_files/a9c/3da/fb2/a9c3dafb2473170834505f214df087ad.png)
TL;DR
13-го апреля 2023 года в мессенджере Telegram обнаружена рассылка с архивом под красноречивым названием 这几笔错误的账单我圈出来了你看看.zip:
![Сообщение с архивом Сообщение с архивом](https://habrastorage.org/getpro/habr/upload_files/49b/43a/1f6/49b43a1f6e6f93d149947e51a258a327.png)
В результате анализа удалось выяснить, что архив содержит вредоносное программное обеспечение нацеленное на пользователей ОС семейства Windows, краткая схема работы которого представлена на следующем рисунке:
![Схема работы ВПО Схема работы ВПО](https://habrastorage.org/getpro/habr/upload_files/e11/e70/2c5/e11e702c5f6dc78d867ad88c9df40cd8.png)
где 1 – получение архива, 2 – ручное извлечение и запуск пользователем загрузчика ВПО, 3 – подгрузка ВПО с сервера злоумышленника в сети CloudFlare,
4 – передача управления основной вредоносной программе, 5 – подключение
к серверу управления и получение команд.
В этой статье представлен технический анализ трояна. Он может быть полезен специалистам ИБ, которым хочется изучить возможности данного семпла или ознакомиться базовыми подходами ручного анализа вредоносного ПО.
Технический анализ
Загрузка
В архиве находится одноимённый исполняемым EXE файл (MD5: 50351169d2ee00143091254fc7e8b3ab), название которого в дословном переводе гугл-транслейта означает “Я обвел эти неправильные счета, чтобы вы могли видеть.exe”. Ну-с, очень заманчиво. Отметим, что вредонос совсем не “юзерфрендли”, так как пользователь должен сам распаковать и запустить его.
Тем не менее, откроем его с помощью любого удобного дизассемблера. Перейдя к main-процедуре видим, что если пользователь запустит файл, то программа скачает ряд файлов с сервера imgcache.vip033324[.]xyz, используя функцию WinAPI URLDownloadToFile:
![Фрагмент дизассемблированного кода загрузчика Фрагмент дизассемблированного кода загрузчика](https://habrastorage.org/getpro/habr/upload_files/eac/d79/97b/eacd7997bff231819335bb3246e3489b.png)
Отметим, что загрузчик первой стадии (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 Фрагмент дизассемблированного кода LiveUpdate.exe](https://habrastorage.org/getpro/habr/upload_files/df3/6a0/011/df36a00112b42940fcb65cb68bbd0646.png)
Из архива в память загружаются два файла – _TUProj.dat (80 КБ)
и _TUProjDT.dat (4 байта). Если открыть их в шестнадцатеричном редакторе, то можно заметить, что в файле _TUProj.dat располагаются различные скрипты LUA (теперь понятно зачем его реализация есть в LiveUpdate.exe).
Среди скриптов обнаруживается некий ClientScript:
![Фрагмент LUA-скрипта из _TUProj.dat Фрагмент LUA-скрипта из _TUProj.dat](https://habrastorage.org/getpro/habr/upload_files/381/c48/33e/381c4833eb793423ae87377dfe641bfe.png)
Даже не зная языка 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] ^ 0x30) + 0x30 ( i <= 4).
![Чтение и корректировка файла Media.xml в коде g_table_char Чтение и корректировка файла Media.xml в коде g_table_char](https://habrastorage.org/getpro/habr/upload_files/e3f/491/d97/e3f491d971e8213dda0942a56c1a8b5b.png)
После исправления обнаруживается, что данный файл является исполняемым файлом Windows формата PE (сигнатура MZ там со времен MS-DOS). Впрочем, об этом и так можно было догадаться и так, открыв файл в hex-редакторе.
![Фрагмент исправленного заголовка Media.xml Фрагмент исправленного заголовка Media.xml](https://habrastorage.org/getpro/habr/upload_files/12b/4fd/ec9/12b4fdec962cec29a53a3c3281901670.png)
После этого, как ни странно, исполнение переходит в загруженный и исправленный файл. Что ж, ожидаемо. Грузим и этот файл в дизассемблер.
Распаковка update.log
Мы почти добрались до конца этой цепочки, ведь далее загруженный файл Media.xml получает управление в своей точке входа и загружает файл update.log, повторяя описанную ранее процедуру декодирования с байтом 0x30 (только уже для всего файла).
![Декодирование update.log Декодирование update.log](https://habrastorage.org/getpro/habr/upload_files/5cb/9ea/6e4/5cb9ea6e4200595872a38d301fe408d8.png)
Данный файл после декодирования также представляет из себя исполняемую библиотеку MS Windows, в которую в очередной раз передаётся управление. Отметим про себя, что вредоносный код в этот и в предыдущий раз не использовал стандартные процедуры динамической загрузки исполняемого кода (например, LoadLibrary), а высчитал Entry Point загруженного кода самостоятельно.
Без лишних слов вооружаемся Python-ом, декодируем файл по уже известной формуле и загружаем в дизассемблер
Расшифрование внутреннего файла в update.log
Замечаем, что большая часть библиотеки update.log также упакована, после дизассемблирования в ней можно обнаружить лишь 28 функций (а ведь файл довольно “жирный”, почти полтора мегайбайта).
Ищем начало недизассемблированных данных и видим, что на них есть ссылка в коде, бинго! Обнаруживаем циклическое расшифрование 1105920 байт по адресу 0x04010A0 XOR-ом на 40-битном ключе 0xBE16CF52CD:
![Расшифрование в update.log Расшифрование в update.log](https://habrastorage.org/getpro/habr/upload_files/3ef/6b8/ec3/3ef6b8ec365f3599bb14374559fc3534.png)
Повторяем эту процедуру с помощью всё того же питона, и с удивлением (нет) обнаруживаем, что расшифрованные данные также представляют из себя DLL-библиотеку. Срочно грузим в дизассемблер.
Единственной экспортируемой процедурой этой библиотеки (помимо стандартной DLLMain) является процедура под названием Shellex. Далее управление из update.log переходит в неё.
Вот и всё, мы извлекли основную “полезную нагрузку”. Бегло проанализировав полученный файл можем увидеть, что он действительно подозрительно напоминает вредоносный файл, или… нестандартное средство удалённого администрирования. Далее в статье будут представлены некоторые результаты статического анализа этого файла и динамического анализа вредоноса в целом.
Закрепление
Если открыть планировщик задач Windows, то можно заметить, что вредонос закрепляет свой запуск в системе путём добавления задачи ThunderLiveUpdate и красноречиво названной задачи “Ñ¸À׸üзþÎñ”.
![Созданные трояном задачи в планировщике задач Windows Созданные трояном задачи в планировщике задач Windows](https://habrastorage.org/getpro/habr/upload_files/fc4/517/979/fc45179791b6f3a48d3b4e4e848338b3.png)
Это один из типичных способов закрепления, так что одним из первых пунктов анализа взломанных машин можно проверять именно планировщик (например, утилита Autostart из пакета Sysinternals поможет обнаружить этот и многие другие способы закрепления).
Взаимодействие с C2
Чтобы быть полезным для злоумышленников, троян должен откуда-то получать команды и куда-то отправлять данные. Этот вредонос для связи с сервером получает IP-адрес сервера злоумышленников из скачанного на первом этапе файла setting.ini:
![IP-адрес сервера злоумышленников в setting.ini IP-адрес сервера злоумышленников в setting.ini](https://habrastorage.org/getpro/habr/upload_files/fe7/eda/ebe/fe7edaebe269ba85b787ca1e4d14a693.png)
Вредоносный агент взаимодействует с сервером злоумышленника по нестандартному протоколу поверх TCP (порт 18076):
![Фрагмент трафика взаимодействия с сервером злоумышленников Фрагмент трафика взаимодействия с сервером злоумышленников](https://habrastorage.org/getpro/habr/upload_files/a18/a57/017/a18a570174ce65eebbde199777f31578.png)
В результате статического анализа кода дизассемблером и декомпилятором можно уточнить формат данного протокола (просто ищем сетевые импортированные функции, и пытаемся найти нужные вызовы). Все данные при отправке кодируются побайтово в соответствии со следующим кодом:
![Кодирование / Декодирование пакета Кодирование / Декодирование пакета](https://habrastorage.org/getpro/habr/upload_files/dad/524/945/dad52494525ee27f4b0ed2fdce779596.png)
Если декодировать таким образом представленный ранее пакет, то можно обнаружить следующие данные:
![Фрагмент декодированного пакета Фрагмент декодированного пакета](https://habrastorage.org/getpro/habr/upload_files/b22/10f/f55/b2210ff5571d61fdc848c2273a0147e0.png)
Первые три байта 0x687620 являются сигнатурой протокола “hx ” (в закодированном виде – 0xF6E6AE). Её инициализация также обнаружена в коде:
![Инициализация сигнатуры протокола Инициализация сигнатуры протокола](https://habrastorage.org/getpro/habr/upload_files/5b9/9d3/ee3/5b99d3ee3613fdd9660a82cb1db9d752.png)
По этой сигнатуре и порту назначения возможно обнаружение такого трафика в сети. Впрочем, в других версиях и модификациях вредоноса эти данные могут быть изменены. Следующие 4 байта заголовка – полный размер пакета в формате Little Endian (в приведённом выше примере – 0xCB030000 == 0x03CB).
Анализ возможностей
Если продолжить реверс полученного бинаря, и перейти от сетевых вызовов к реализации протокола, то путём анализа “сверху вниз” можно обнаружить, что после компрометации системы троян предоставляет злоумышленнику достаточно широкие возможности по управлению системой, среди которых имеются, например:
•различные форматы удалённого администрирования;
•взаимодействие с периферийными устройствами;
•контроль файловой системы;
•осуществление сетевой активости;
•зачистка следов веб активности;
•логирование действий и запись экрана;
•похищение аутентификационных данных;
•обнаружение антивирусного ПО;
•подгрузки и выполнения произвольного кода;
Можно пойти обратным, “восходящим” путём анализа, и перейти от вызовов “полезных” импортированных функций WinAPI (запуск процессов, модификация реестра, взаимодействие с устройствами) ко всему доступному функционалу в целом. Как правило, в ходе реверса применяется и то и другое сразу.
Далее чуть подробнее остановимся на некоторых возможностях вредоноса.
В качестве одного из способов удалённого управления злоумышленник может при необходимости активировать сервис RDP на компьютере:
![Фрагмент процедуры активации RDP Фрагмент процедуры активации RDP](https://habrastorage.org/getpro/habr/upload_files/966/52d/0c6/96652d0c65544571f202a764385aa05b.png)
Точно неизвестно, как злоумышленники планируют к нему подключаться, но учитывая возможность исполнения произвольного кода, вполне возможен запуск реверс-прокси.
Для аутентификации злоумышленник может создать произвольного пользователя или модифицировать гостевую учетную запись, активировать её и добавить в группу администраторов:
![Процедура активации учетной записи guest Процедура активации учетной записи guest](https://habrastorage.org/getpro/habr/upload_files/ba2/1bd/3c2/ba21bd3c264d67dc07ef6b09f6a5064e.png)
Интересно также целевое назначение вредоноса. Ввиду того, что он ориентирован на китайских пользователей, в нем реализован функционал взаимодействия с китайской социальной сетью и мессенджером qq.com. В результате анализа различных скриптов автоматизации использования API qq.com, которые можно обнаружить, например, на github.com (https://gist.github.com/kagurazakasanae/a76b01f60c89aa3866dfc689345a3faf, https://github.com/LeoHuang2015/qqloginjs/) удалось разобрать некоторые процедуры такого взаимодействия.
Сначала в процедуре осуществляется аутентификация в qq под всеми доступными аккаунтами текущего пользователя,
![Фрагмент процедуры аутентификации в qq.com Фрагмент процедуры аутентификации в qq.com](https://habrastorage.org/getpro/habr/upload_files/6e0/cc0/4f3/6e0cc04f34057ed3c0f77682574ede14.png)
затем происходит получение списка друзей пользователя:
![Фрагмент процедуры получения списка друзей пользователя Фрагмент процедуры получения списка друзей пользователя](https://habrastorage.org/getpro/habr/upload_files/84e/67e/62b/84e67e62b1bd267a2dfd39a5a9a48295.png)
и групп, в которых он состоит:
![Фрагмент процедуры получения групп пользователя Фрагмент процедуры получения групп пользователя](https://habrastorage.org/getpro/habr/upload_files/bb7/a01/d1a/bb7a01d1afe883c5b0f29d55dd97626e.png)
Для каждой группы предпринимается попытка получить список пользователей этой группы:
![Фрагмент процедуры получения списка пользователей группы Фрагмент процедуры получения списка пользователей группы](https://habrastorage.org/getpro/habr/upload_files/1bf/326/2ed/1bf3262ede3b303f32e1e81a5c15bc8d.png)
И вся эта информация благополучно отправляется на сервера злоумышленников. Зачем? Точно неизвестно. Возможно, для того чтобы отправить всем доступным пользователям этот же самый троян с аккаунта жертвы и осуществить распространение вредоноса таким образом. А может, для проведения социологических исследований…
Среди прочего, в троян встроены команды завершения процессов различных браузеров и очистки их кэша:
![Команды по очистке следов активности Команды по очистке следов активности](https://habrastorage.org/getpro/habr/upload_files/578/74c/19d/57874c19d5647d916fa73a77eab47e17.png)
Заметим, что некоторые из них также очень специализированы для китайской аудитории. Вкупе с возможностями по записи экрана и кейлоггингу сброс кеша браузеров позволяет злоумышленникам похищать аутентификационную информации различных сервисов.
Заключение
В статье представлен анализ трояна, в ходе которого мы познакомились с некоторыми базовыми техниками анализа вредоносного ПО, а также с техниками, которые злоумышленники используют для сокрытия полезной нагрузки вредоносов.
Данный троян предоставляет злоумышленникам гибкие возможности по удалённому контролю и получению информации в системе, в том числе – чтение, изменение и создание файлов и процессов, активация RDP и других стандартных сервисов администрирования, осуществление сетевой активности и запуск сетевых сервисов, логирование нажатий клавиш и создание скриншотов экрана, запись звука, создание и удаление пользователей, получение аутентификационной информации, модификация реестра Windows.
Отметим, что никаких продвинутых техник по обфускации и антиотладке он не использует и с точки зрения защиты кода является достаточно примитивным. Но даже так, вредоносный код скрыт от автоматического обнаружения статическим путём, и без динамического анализа (например, запуска вредоноса в песочнице, эмуляции), антивирусу будет сложно идентифицировать модификации данного семпла.
MD5-хеш исходного архива: 62275e818ff92c030f75fdb89cddd40b, на текущий момент некоторые антивирусные решения уже отмечают его как троян семейства “lotok” (https://www.virustotal.com/gui/file/fe00e9c691f85871adfd4d8b43e6ba4a797f89cde8f5f9239884c60809b475ac/detection), однако подробной информации об этом трояне нет.
![Идентификация трояна на VirtusTotal Идентификация трояна на VirtusTotal](https://habrastorage.org/getpro/habr/upload_files/b2b/95f/323/b2b95f323d5cdef6ba676c6c5bbafefc.png)
На момент обнаружения трояна 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. Автор: Шаих Галиев, ведущий реверс-инженер
Понравилась ли вам статья? Пишите в комментах!
ссылка на оригинал статьи https://habr.com/ru/companies/usergate/articles/737626/
Добавить комментарий