Статья подготовлена командой BI.ZONE Cyber Threat Research Мы не первый раз натыкаемся на киберпреступные группировки, которые прикидываются легальными организациями и маскируют свою малварь под инструменты для анализа защищенности. Сотрудники таких компаний могут даже не подозревать, что работают на злоумышленников и используют самый настоящий вредоносный пакет. FIN7 (также именуемая как Carbanak и Navigator Group), одна из знаменитых АРТ-группировок, для разведки и закрепления на зараженных системах разработала Lizar — якобы инструмент для пентеста сетей Windows. Мы заинтересовались им и провели исследование, результатами которого поделимся в статье. Раньше инструмент назывался Tirion, но дальше по тексту мы будем использовать только новое название Lizar APT-группировка FIN7, предположительно, основана еще в 2013 году, однако мы сосредоточимся на анализе ее деятельности с 2020 года: именно тогда киберпреступники сфокусировались на атаках с использованием шифровальщиков. FIN7 составляла список жертв, фильтруя компании по доходу с помощью сервиса Zoominfo. В 2020–2021 годах мы наблюдали атаки на американские фармацевтические компании, IT-компанию со штаб-квартирой в Германии, один из ключевых финансовых институтов Панамы, игорное заведение и образовательные учреждения в США. Довольно долго для целей разведки и закрепления на зараженных системах члены FIN7 использовали набор инструментов Carbanak Backdoor, почитать о котором можно в отчете FireEye (посты в блоге: 1, 2, 3, 4). Мы неоднократно наблюдали, как организаторы пытались маскироваться под представительство компании Check Point Software Technologies и Forcepoint. Пример этого — интерфейс инструмента Carbanak Backdoor версии 3.7.4 с отсылкой к компании Check Point Software Technologies (рис. 1). 
Рис. 1. Интерфейс инструмента Carbanak Backdoor версии 3.7.4 Недавно у преступников появился новый вредоносный пакет — Lizar. В сети ранее публиковался отчет об исследовании Lizar версии 1.6.4, а мы решили изучить функциональные возможности компонентов более новой версии, 2.0.4 (дата и время компиляции Fri Jan 29 03:27:43 2021), обнаруженных нами в феврале 2021 года. По структуре набор инструментов Lizar похож на Carbanak Backdoor. Краткая характеристика обнаруженных нами компонентов представлена в табл. 1. Табл. 1. Сущность и назначение компонентов Lizar Lizar loader и Lizar plugins работают на зараженной системе и логически могут быть объединены в компонент Lizar bot. То, как функционируют и взаимодействуют инструменты Lizar, можно увидеть на рис. 2. 
Рис. 2. Схема работы набора инструментов Lizar Lizar client состоит из следующих компонентов: Ниже представлено содержимое и описание конфигурационного XML-файла (табл. 2). Табл. 2. Характеристика элементов структуры конфигурационного XML-файла В табл. 3 представлены характеристики обнаруженного файла client.exe. Табл. 3. Файл client.exe На рис. 3 — скриншот интерфейса последней обнаруженной нами версии клиента. 
Рис. 3. Интерфейс версии 2.0.4 Lizar client Клиент поддерживает несколько команд для бота. То, как они выглядят в графическом интерфейсе, можно увидеть на рис. 4. 
Рис. 4. Список команд, поддерживаемых Lizar client Вот что позволяет сделать каждая из команд: Info — получить информацию о системе. Плагин для данной команды расположен на сервере. При получении от плагина результата информация записывается в колонку Info. Kill — завершить работу плагина. Period — изменить период отстука (рис. 5).

Рис. 5. Команда Period в графическом интерфейсе Lizar client Screenshot — сделать скриншот (рис. 6). Плагин для данной команды расположен на сервере. Если удалось сделать скриншот, он отобразится в отдельном окне.

Рис. 6. Команда Screenshot в графическом интерфейсе Lizar client List Processes — получить список процессов (рис. 7). Плагин для данной команды расположен на сервере. В случае успешной работы плагина список процессов отображается в отдельном окне.

Рис. 7. Команда List Processes в графическом интерфейсе Lizar client Command Line — получить CMD на зараженной системе. Плагин для данной команды расположен на сервере. Если плагин успешно выполнил команду, результат отобразится в отдельном окне. Executer — запустить дополнительный модуль (рис. 8).

Рис. 8. Команда Executer в графическом интерфейсе Lizar client Jump to — осуществить миграцию лоадера в другой процесс. Плагин для данной команды расположен на сервере. Параметры команды передаются через файл client.ini.xml. New session — создать еще одну сессию лоадера (запустить копию лоадера на зараженной системе). Mimikatz — запустить mimikatz. Grabber — запустить один из плагинов, собирающих пароли в браузерах и ОС. Во вкладке Grabber есть две кнопки: Passwords + Screens и RDP (рис. 9). При использовании каждой из них отправляется команда на запуск соответствующего плагина.
 Network analysis — запустить один из плагинов для получения информации об Active Directory и информации о сети (рис. 10).
 Rat — запустить Carbanak Backdoor (RAT). IP-адрес и порт сервера и панели администратора задаются через конфигурационный файл client.ini.xml (рис. 11).
 Мы перепрыгнули команду в общем списке Company computers — она в настоящее время не обрабатывается. В коде образца нет обработчика для данной команды, так что мы не можем точно определить, что она делает. Приложение Lizar server, как и Lizar client, написано на платформе .Net Framework. В отличие от клиента, сервер запускается на удаленном Linux-хосте. Дата и время компиляции последней обнаруженной нами версии сервера: Fri Feb 19 16:16:25 2021. Приложение запускается при помощи утилиты wine с предустановленным wine-mono (wine-mono-5.0.0-x86.msi). Директория приложения сервера включает в себя следующие компоненты: Перед отправкой на сервер данные шифруются на сессионном ключе размером от 5 до 15 байт, затем — на ключе, указанном в конфигурации (31 байт). Используемая функция шифрования представлена ниже. Если ключ, указанный в конфигурации (31 байт), не совпадает с ключом на сервере, данные с сервера не отправляются. Для проверки ключа на стороне сервера клиент отправляет контрольную сумму от ключа, рассчитанную по следующему алгоритму: Данные, полученные с сервера, расшифровываются на сессионном ключе размером от 5 до 15 байт, затем — на ключе, указанном в конфигурации (31 байт). Функция для расшифровывания: Данные, передаваемые от клиента серверу и от сервера клиенту, имеют бинарный формат. Расшифрованные данные представляют собой список ботов (рис. 12). 
Рис. 12. Пример расшифрованных данных, переданных от сервера клиенту Lizar loader предназначен для выполнения команд посредством запуска плагинов, а также для запуска дополнительных модулей. Он работает на стороне зараженного компьютера.
Как мы уже отметили, Lizar loader и Lizar plugins работают на зараженной системе и логически могут быть объединены в компонент Lizar bot. Модульная архитектура бота обеспечивает расширяемость инструмента и возможность вести независимую разработку всех компонентов.
Мы обнаружили три вида ботов: DLL, EXE и PowerShell-скрипты, которые в результате исполняют DLL в адресном пространстве процесса PowerShell. Псевдокод главной функции лоадера вместе с восстановленной структурой функций представлены на рис. 13. 
Рис. 13. Псевдокод главной функции лоадера Вот что происходит в функции x_Init: Генерация случайного ключа g_ConfigKey31 при помощи функции SystemFunction036. Данный ключ используется в дальнейшем для расшифровывания конфигурационных данных. Получение системной информации и подсчет контрольной суммы от полученной информации (рис. 14).

Рис. 14. Псевдокод для получения системной информации и подсчета контрольной суммы от нее Получение идентификатора текущего процесса (контрольная сумма и PID процесса лоадера отображаются в колонке Id в приложении клиента). Подсчет контрольной суммы от ранее полученной контрольной суммы и идентификатора текущего процесса (на рис. 13 обозначено как g_BotId). Расшифровывание конфигурационных данных: списка IP-адресов, списка портов для каждого сервера. Конфигурационные данные расшифровываются на 31-байтовом ключе g_LoaderKey алгоритмом XOR. После расшифровывания данные повторно зашифровываются на ключе g_ConfigKey31 алгоритмом XOR. Ключ g_LoaderKey также используется при шифровании данных, отправляемых на сервер, и при расшифровывании данных, получаемых с сервера. Инициализация глобальных переменных и критических секций для некоторых переменных. Это нужно для доступа к данным из различных потоков. Инициализация исполняемой памяти для выполнения плагинов. Запуск пяти потоков, в которых происходит обработка очереди сообщений с сервера. Этот механизм реализован с помощью функций PostQueuedCompletionStatus и GetQueuedCompletionStatus. Данные, полученные с сервера, расшифровываются и отправляются обработчику (рис. 15).

Рис. 15. Псевдокод алгоритма расшифровывания данных, полученных с сервера, и передачи этих данных обработчику При этом обработчик принимает данные с помощью функции GetQueuedCompletionStatus. Тело плагинов содержится в переменной vServerData→ServerData после расшифровывания (еще раз взгляните на рис. 15). Псевдокод алгоритма, которым расшифровываются данные, полученные с сервера, представлен на рис. 16. 
Рис. 16. Псевдокод алгоритма расшифровывания данных, полученных с сервера Перед отправкой на сервер структура данных формируется так, как показано на рис. 17.

Рис. 17. Псевдокод функции, в которой генерируется структура, отправляемая серверу Плагины из директории plugins отправляются с сервера лоадеру и исполняются лоадером при осуществлении определенного действия в приложении Lizar Сlient. Механизм работы плагинов в общем виде можно представить так: Плагин предназначен для предоставления злоумышленникам доступа к интерфейсу командной строки на зараженной системе. Отправка команд процессу cmd.exe и получение результата выполнения команд реализованы через пайпы (рис. 18). 
Рис. 18. Псевдокод главной функции CommandLine32.dll/CommandLine64.dll С помощью Executer32.dll/Executer64.dll запускаются дополнительные компоненты, указанные в интерфейсе приложения Lizar client. Плагин поддерживает запуск следующих компонентов: Код плагина, который запускает шелл-код, представлен на рис. 19. 
Рис. 19. Код Executer32.dll/Executer64.dll, запускающий шелл-код Следует отметить, что файл плагина Executer64.dll содержит путь к PDB: M:\paal\Lizar\bin\Release\Plugins\Executer64.pdb. Вопреки своему названию, данный плагин не содержит функциональности граббера и представляет собой типичный загрузчик PE-файла. Хотя злоумышленники и называют его граббером, на деле загруженный PE-файл выполняет функции других инструментов, например стилера. Обе версии плагина используются в качестве загрузчиков грабберов, расположенных на стороне клиента: PswRdInfo64 и PswInfoGrabber64. Плагин предназначен для получения информации о зараженной системе. Плагин выполняется при использовании команды Info в приложении Lizar client. На сервер отправляется структура данных, содержащая версию ОС, имя пользователя и имя компьютера. На стороне сервера полученная структура приводится к специальной строке (рис. 20). 
Рис. 20. Приведение полученной структуры к специальной строке на стороне сервера Плагин предназначен для миграции лоадера в адресное пространство другого процесса. Параметры инжекта выставляются в конфигурационном файле Lizar client. Следует отметить, что данный плагин может быть использован не только для инжекта лоадера, но и для выполнения других PE-файлов в адресном пространстве указанного процесса. На рис. 21 представлен участок главной функции плагина. 
Рис. 21. Псевдокод главной функции Jumper32.dll/Jumper64.dll Из представленного псевдокода видно, что миграция лоадера в адресное пространство указанного процесса может происходить тремя способами: Рассмотрим каждый из них подробнее. Алгоритм инжекта по идентификатору процесса 
Рис. 22. Псевдокод функции для создания потока в виртуальном адресном пространстве указанного процесса Алгоритм инжекта по имени исполняемого файла Алгоритм инжекта в такой же процесс Псевдокод для данного метода представлен на рис. 26. 
Рис. 26. Псевдокод алгоритма инжекта Jumper32.dll/Jumper64.dll в такой же процесс Данный плагин предназначен для получения информации о запущенных процессах (рис. 27 и рис. 28). 
Рис. 27. Получение информации о каждом активном процессе 
Рис. 28. Добавление полученной информации для последующей отправки на сервер Для каждого процесса могут быть получены: Плагин mimikatz — обертка для модулей powerkatz, расположенных на стороне клиента: Плагин предназначен для получения информации обо всех сеансах, установленных на зараженном сервере. Для каждого сеанса может быть получен адрес хоста, с которого производится подключение, а также имя пользователя, инициирующего подключение. Псевдокод функции, в которой происходит получение информации, представлен на рис. 29 и 30. 
Рис. 29. Получение информации о сетевых сеансах с помощью функций из WinAPI 
Рис. 30. Добавление информации, полученной плагином, для отправки на сервер Плагин представляет собой урезанную версию бота из набора инструментов Carbanak Backdoor. Как мы писали в начале статьи, этот набор инструментов активно используется группировкой FIN7. Плагин позволяет сделать скриншот на зараженной системе в формате JPEG. Ниже показан участок функции, используемый для сохранения полученного изображения в стрим (рис. 31). 
Рис. 31. Участок функции, используемый для сохранения скриншота, сделанного плагином, в стрим Далее полученный стрим передается лоадеру для отправки на сервер. Плагины из директории plugins/extra передаются от клиента к серверу, после чего — от сервера к лоадеру (на зараженную систему). Файл ADRecon.ps1 — это инструмент для генерации отчета, содержащего информацию из среды Active Directory. Исходный код проекта ADRecon доступен на GitHub. Отметим, что этот плагин не является разработкой FIN7, однако активно используется группировкой для атак в рамках исследуемого набора инструментов. Плагин предназначен для получения NTLM-/LM-хешей пользователей. В основе плагина лежит код компонента lsadump из mimikatz. На рис. 32 представлен скриншот с псевдокодом экспортируемой функции Entry (имена функций выбраны в соответствии с названиями функций из mimikatz). 
Рис. 32. Псевдокод экспортируемой функции Entry для плагина GetHash Возвращаемое значение функции Execute (значение переменной g_outputBuffer) содержит указатель на буфер с данными, полученными в результате работы плагина. Если плагин не удалось запустить с правами SYSTEM, в результате его работы буфер заполнится данными, представленными на рис. 33. 
Рис. 33. Содержимое буфера при запуске плагина без прав пользователя SYSTEM Содержимое буфера в данном случае аналогично выводу mimikatz при запуске модуля lsadump::sam без прав SYSTEM (рис. 34). 
Рис. 34. Вывод mimikatz при запуске lsadump::sam без прав пользователя SYSTEM Если плагин запущен с правами SYSTEM, в результате его работы в буфер попадет вся искомая информация (рис. 35). 
Рис. 35. Содержимое буфера при запуске плагина с правами пользователя SYSTEM Такие же данные можно получить при выполнении команды lsadump::sam из mimikatz с правами пользователя SYSTEM (рис. 36). 
Рис. 36. Результат выполнения команды lsadump::sam из mimikatz с правами пользователя SYSTEM Плагин предназначен для получения паролей пользователей. В его основе лежит код компонента sekurlsa из mimikatz. Псевдокод экспортируемой функции Entry представлен на рис. 37. 
Рис. 37. Псевдокод экспортируемой функции Entry По результатам работы плагина мы увидим в значении переменной g_outputBuffer указатель на буфер с данными, которые можно получить при выполнении команды sekurlsa::logonpasswords в mimikatz (рис. 38). 
Рис. 38. Результат выполнения команды sekurlsa::logonpasswords Плагин представляет собой версию mimikatz, собранную в конфигурации Second_Release_PowerShell. Эта версия может быть загружена в адресное пространство процесса PowerShell посредством рефлексивной загрузки DLL — так, как это реализовано в модуле Exfiltration из PowerSploit. Псевдокод экспортируемой функции powershell_reflective_mimikatz (названия переменных и функций в декомпилированном выводе изменены в соответствии с названиями соответствующих переменных и функций из mimikatz): Через параметр input передается список команд, разделенных пробелом. Через глобальную переменную outputBuffer передается результат выполнения команд. Декомпилированный вид функции wmain представлен ниже: Плагин powerkatz_short — это модифицированная версия стандартной библиотеки powerkatz, описанной в предыдущем пункте. Плагин позволяет получить из зараженной системы историю браузеров Firefox, Google Chrome, Microsoft Edge, Internet Explorer, сохраненные в них логины и пароли пользователей, а также учетные записи почтовых клиентов Microsoft Outlook и Mozilla Thunderbird. Для получения конфиденциальных данных из браузера Firefox используется библиотека nss3.dll, подгружаемая из директории с установленным браузером (рис. 39). 
Рис. 39. Динамическое получение адресов функций из библиотеки nss3.dll С помощью функций, представленных на рис. 39, учетные данные извлекаются из файла logins.json, а история браузера — из базы данных places.sqlite. Атакуя Google Chrome, плагин получает историю браузера из базы %LOCALAPPDATA%\Google\Chrome\User Data\Default\History, а пароли — из базы %LOCALAPPDATA%\Google\Chrome\User Data\Default\Login Data (данные зашифрованы с использованием DPAPI). History, places.sqlite, Login Data — файлы базы данных sqlite3. Для работы с базами данных sqlite3 в плагине используются функции из библиотеки sqlite, статически слинкованные с результирующей DLL, то есть самим плагином. Для браузеров Internet Explorer и Microsoft Edge плагин получает учетные данные пользователей с использованием функций из библиотеки vaultcli.dll, реализующей функции утилиты vaultcmd.exe. PswRdInfo64.dll предназначен преимущественно для сбора доменных учетных записей и получения учетных данных для доступа к другим хостам через RDP. Плагин активируется из приложения клиента с помощью вкладки Grabber → RDP. Алгоритм работы плагина зависит от следующих условий. При запуске пользователем SYSTEM плагин перечисляет все активные консольные сессии (WTSGetActiveConsoleSessionId) и получает имена пользователей для данных сессий: Затем плагин получает приватные ключи из директории C:\Users\{SessionInformationUserName}AppData\Local\Microsoft\Credentials для каждого пользователя и осуществляет инжект в процесс lsass.exe для извлечения доменных учетных записей. При запуске другим пользователем (не SYSTEM) плагин пытается собрать учетные данные для доступа по RDP к другим хостам. Сбор учетных данных осуществляется с помощью функции CredEnumerateW, при этом в качестве цели используется строка TERMSRV. Исследуемый набор инструментов разнообразен и сложен. Сейчас инструмент Lizar находится на стадии активной разработки и тестирования, при этом его уже вовсю используют для управления зараженными компьютерами. Сегодня Lizar используется в основном на территории США. Но, судя по всему, группировка не остановится на достигнутом, и мы совсем скоро узнаем о новых АРТ-атаках с применением данного инструмента по всему миру. IP: 108.61.148.97
136.244.81.250
185.33.84.43
195.123.214.181
31.192.108.133
45.133.203.121 SHA256: