Исследование

KBOT: иногда они возвращаются

Хотя многие по привычке до сих пор называют «вирусом» любое вредоносное ПО, этот некогда крайне распространенный класс угроз постепенно уходит в прошлое. Однако есть и интересные исключения из этого тренда: недавно мы обнаружили зловред, который распространялся с помощью внедрения вредоносного кода в исполняемые файлы Windows, проще говоря — вирус. Это первый «живой» вирус за последние несколько лет, замеченный нами в «дикой природе».
Мы назвали его KBOT, а решения «Лаборатории Касперского» детектируют зловред и его компоненты как Virus.Win32.Kpot.a, Virus.Win64.Kpot.a, Virus.Win32.Kpot.b, Virus.Win64.Kpot.b и Trojan-PSW.Win32.Coins.nav.

Что делает KBOT

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

Методы заражения

KBOT заражает все EXE-файлы, расположенные на подключаемых логических дисках (разделах HDD, внешних носителях, сетевых дисках), а также в общих сетевых папках, путем добавления полиморфного вредоносного кода в тело файла. Для этого зловред подписывается на события подключения локальных и сетевых логических дисков, используя интерфейс IID_IwbemObjectSink и запрос вида SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA ‘Win32_LogicalDisk, переопределяет функцию Indicate интерфейса IWbemObjectSink, где для каждого диска реализует рекурсивное сканирование директорий и заражение EXE-файлов.
Зловред получает пути к расшаренным сетевым ресурсам c помощью API функций NetServerEnum и NetShareEnum, а затем сканирует директории и заражает исполняемые .EXE файлы:

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

Код вируса в точке входа

Команда jmp осуществляет переход на полиморфный код:

Также вирус добавляет зашифрованные данные в конец одной из следующих секций: .rsrc, .data, .rdata. Расположенные после выбранной секции данные сдвигаются. При этом соответствующим образом исправляются параметры директории настроек адресов (Relocation Table), ресурсов, импортов, параметры секций и другие параметры PE-файла. В зашифрованных данных содержится тело основного модуля зловреда (DLL-библиотека), а также код для расшифровки, загрузки в память и запуска на исполнение данной библиотеки. Данные зашифрованы методом XOR, причем библиотека дополнительно зашифрована алгоритмом RC4 и сжата с помощью Aplib.

Пример зараженного файла

В конце полиморфного кода находится классический код получения базы kernel32.dll:

Далее осуществляется получение адреса API функции VirtualProtect, с помощью которой устанавливаются права на запись и исполнение зашифрованных данных вируса, расположенных в конце упомянутых ранее секций .rsrc, .data и .rdata. Данные расшифровываются, и осуществляется переход на соответствующий код:

Код расшифровывает DLL-библиотеку с основной функциональностью бота (зашифрована с помощью RC4 и сжата с помощью Aplib), осуществляет маппинг заголовков и секций библиотеки в память, заполняет директорию импортов, осуществляет настройку адресов в соответствии с таблицей настроек адресов (Relocations Table) и запускает код в точке входа библиотеки на исполнение.

Функции KBOT

Инжекты

Для сокрытия вредоносной активности в системе и возможности работы в контексте системных приложений KBOT пытается осуществить внедрение кода в запущенные системные процессы.

С помощью API функций OpenProcess/OpenProcessToken и GetTokenInformation он получает SID процесса, в адресное пространство которого загружен основной модуль зловреда. Если SID процесса совпадает с WinLocalSystemSid, KBOT с помощью API CreateProcess с флагом CREATE_SUSPENDED создает новый процесс svchost.exe и далее выполняет классический инжект: с помощью API функций NtCreateSection/NtMapViewOfSection выделяет память в адресном пространстве процесса svchost.exe, куда копирует заголовок и секции основного модуля, после чего осуществляет заполнение директории импорта и настройку адресов в соответствии с таблицей настроек адресов. Далее KBOT выполняет вызов API CreateRemoteThread/RtlCreateUserThread с адресом точки входа. Если SID процесса не равен WinLocalSystemSid, зловред устанавливает привилегии отладчика SeDebugPrivilege и пытается осуществить подобный инжект в запущенные процессы services.exe, svchost.exe, SID которых равен WinLocalSystemSid, а также в процесс explorer.exe.

Также KBOT инжектирует указанные в файле injects.ini DLL-библиотеки (находятся в виртуальном файловом хранилище) в процессы, перечисленные в этом же INI-файле. Конфигурационные файлы, включая injects.ini, находятся в зашифрованном виде в одной из последних секций основного модуля бота, откуда они считываются, расшифровываются и помещаются в виртуальное файловое хранилище. Сэмпл сначала осуществляет поиск актуальной версии нужного файла в своем хранилище (актуальная версия могла быть ранее получена от C&C), а затем в случае неудачи считывает данные файла из первоначальной версии, которая в зашифрованном виде находится в теле самого бота. За обработку таких файлов отвечает специальный модуль бота JF — joined files. В начале зашифрованных данных каждого такого файла располагается структура с описанием данных, которая содержит сигнатуру JF.

Описание процедуры обработки данных конфигурационного файла

Каждому присоединенному зашифрованному файлу соответствует структура с описанием зашифрованных данных файла:

Пример injects.ini:

Упомянутые в примере JUPITER.32 и JUPITER.64 — это DLL-библиотеки, осуществляющие веб-инжекты, с помощью которых зловред крадет персональные данные пользователей, введенные в браузерах: пароли, номера кредитных карт и кошельков и т. п. Такие инжекты осуществляются путем подмены содержимого веб-страниц в результате внедрения вредоносного кода в HTTP-трафик. Для этого необходимо изменить код функций браузеров и системных функций, ответственных за передачу и обработку трафика. Для этого после осуществления инжекта в системные процессы, а также в процессы веб-браузеров, библиотека для веб-инжектов патчит код функций популярных браузеров (Chrome, FireFox, Opera, Яндекс.Браузер) и код системных функций, ответственных за передачу трафика:

Список инжектов из конфигурационного файла зловред хранит в глобальном массиве дескрипторов инжектов — функциональность, во многом аналогичная буткиту Rovnix.

Ниже приведем пример конфигурационного файла kbot.ini, где Hosts — список C&C, ServerPub — публичный ключ для шифрования данных:

DLL hijacking

Чтобы при загрузке системы иметь возможность работы в адресном пространстве легитимного системного приложения, зловред выполняет атаку DLL hijacking: заражает системные библиотеки, указанные в директории импорта системного исполняемого файла, и размещает эти библиотеки рядом с системным файлом, который впоследствии прописывает в автозагрузку.
В системной папке С:\Windows\\System32 зловред ищет исполняемые EXE-файлы, подходящие для атаки, и при этом исключает из рассмотрения следующие файлы:

  1. Содержащие в манифесте строки level=»requireAdministrator» и >true. То есть исполняемые файлы, требующие для выполнения наличие прав администратора. Вызов таких приложений приводит к появлению диалогового окна UAC.
  2. Содержащие в таблице импортов имена библиотек, начинающиеся с API-MS-WIN- и EXT-MS-WIN-. То есть файлы, содержащие виртуальные имена библиотек в импортах и использующие таблицу перенаправления API-набора, содержащуюся в ApiSetSchema.dll. Для таких файлов реализовать DLL hijacking невозможно, так как виртуальные имена транслируются в имена системных библиотек с полными путями.
  3. Имена которых содержатся в стоп-листе:

Обнаружив исполняемый файл, отвечающий всем критериям, KBOT создает в системной директории папку со случайным именем, копирует в нее найденный EXE-файл, а также системные DLL-библиотеки, находящиеся в директории импорта исполняемого файла. Для выполнения этих операций с привилегиями администратора зловред формирует шелл-код (за основу взят этот код) с использованием EIFOMoniker Elevation:Administrator!new:{3ad05575-8857-4850-9277-11b85bdb8e09}».

Описанная функциональность шелл-кода

Данный шелл-код вместе с необходимыми параметрами инжектится в процесс explorer.exe с помощью API функции CreateRemoteThread.

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

В результате директория с системным приложением, DLL-библиотеками из директории импорта и служебным хранилищем данных KBOT выглядит следующим образом (красным выделено имя файла зашифрованного виртуального хранилища зловреда):

Далее KBOT заражает скопированные системные библиотеки. Код точки входа DLLEntryPoint перезаписывается следующим кодом:

Как и в случае заражения исполняемого файла, вирус добавляет полиморфный код в секцию кода и зашифрованный код в конец одной из секций .rsrc, .data или .rdata. В отличие от кода, добавляемого в EXE-файл, этот код не содержит зашифрованный основной модуль бота, а читает и расшифровывает его из хранилища файлов. Начало функций, импортируемых системным EXE-файлом из созданной папки, перезаписывается кодом перехода в полиморфный код:

Дальнейший алгоритм действий вредоносного кода аналогичен алгоритму действий вредоносного кода в зараженных EXE-файлах за исключением того, что основной модуль бота читается из зашифрованного хранилища. Оригинальные данные зараженных DLL не сохраняются.
Зашифрованный код в конце последней секции DLL:

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

Автозагрузка

Для запуска при старте системы зловред использует следующие методы:

  1. Запись в Software\\Microsoft\\Windows\\CurrentVersion\\Run
    Для предотвращения появления окна UAC устанавливает значение переменной окружения __compat_layer в RunAsInvoker. С помощью API CreateDesktop создает новый рабочий стол. В рамках этого рабочего стола с помощью API CreateProcess создает процесс regedit.exe. Инжектит в данный процесс шелл-код, который с помощью API функций для работы с реестром записывает в указанный раздел реестра полный путь до системного .exe.
  2. Средствами WMI создается задача по запуску системного EXE-файла в Task Scheduler, рядом с которым расположены зараженные вредоносные DLL-библиотеки (см. DLL Hijacking выше).

Предварительно KBOT проверяет текущие задания в Task Scheduler — считывает содержимое DLL-библиотек, импортируемых EXE-файлами из заданий, и ищет ключевые данные идентификатора заражения:

Если заданий с зараженными файлами нет, создает новое задание от лица аккаунта локальной системы (S-1-5-18) без имени пользователя:

Параметры задания:

Пример XML с созданным заданием:

Удаленное управление

Для удаленного управления компьютером жертвы KBOT устанавливает реверсивные соединения с серверами, перечисленными в файле BC.ini.

Чтобы создать несколько одновременных сессий по протоколу RDP, зловред настраивает параметры Remote Desktop Server:

  1. Находит процессы, в память которых загружена библиотека termserv.dll.
  2. Патчит раздел памяти найденного процесса, куда загружена termserv.dll. Для разных версий системы — разный код патчинга.
  3. В процессе патчинга ищет в памяти модуля определенные наборы байт и заменяет их заданными.

Далее KBOT соответствующим образом редактирует значения ключей реестра, отвечающие за настройки службы терминалов (перечислены не все редактируемые значения):

  • HKLM\SYSTEM\ControlSet\Control\TerminalServer\LicensingCore\ EnableConcurrentSessions
  • HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\EnableConcurrentSessions
  • HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\ AllowMultipleTSSessions
  • HKLM\SOFTWARE\Policies\Microsoft\WindowsNT\TerminalServices\MaxInstanceCount

Затем перезапускает службу терминалов (TermService) и создает в системе пользователя для удаленных подключений с SID WinBuiltinRemoteDesktopUsersSid.

Общение C&C

Зловред по таймеру запускает в отдельном потоке процесс получения и обработки команд от сервера. Список команд отправляется в виде буфера. Для получения команд используются API для работы с сетевыми соединениями библиотеки wininet.dll. Домены для получения команд находятся в файле hosts.ini, который зловред периодически обновляет. Все конфигурационные файлы с данными о C&C и параметрами соединений хранятся в зашифрованном виде в одной из последних секций основного модуля бота, более новые версии — в зашифрованном VFAT-хранилище, о чем говорилось ранее. Файлы, полученные от C&C, помещаются в зашифрованное хранилище.

Пример конфигурационного файла hosts.ini

Предварительно на C&C отправляются идентификаторы бота и подробные сведения о зараженной системе: имя компьютера, домен, язык системы и ее версия, список локальных пользователей, список установленного защитного ПО и т. п. Трафик шифруется с помощью алгоритма AES:

От командного сервера зловред может получить следующие команды:

  • DeleteFile — удалить из файлового хранилища указанный файл.
  • UpdateFile — обновить указанный файл в файловом хранилище.
  • UpdateInjects — обновить injects.ini.
  • UpdateHosts — обновить hosts.ini.
  • UpdateCore — обновить основной модуль бота, а также конфигурационный файл с настройками — kbot.ini.
  • Uninstall — деинсталлировать зловред.
  • UpdateWormConfig — обновить worm.ini, содержащий информацию о местоположении EXE-файлов, которые необходимо заразить.
  • Пример worm.ini

  • UpdateBackconnectConfig — обновить конфигурационный файл со списком серверов для реверсивных соединений.
  • Пример bc.ini

  • Load — загрузить файл в хранилище. Загружает шпионские программы, собирающие данные пользователя, а также DLL для веб-инжектов (сохраняет под именами JUPITER.32, JUPITER.64), конфигурационные файлы для них и т. д.
  • Пример части конфигурационного файла для веб-инжекта

Обфускация

Для усложнения анализа своей вредоносной деятельности KBOT использует набор средств для обфускации. При загрузке основной модуль бота проверяет, пропатчены ли импортируемые функции на предмет точек останова, если да — загружает заново импортируемые DLL-библиотеки, «зануляет» имена импортируемых функций, а также использует обфускацию строк. Зашифрованные строки хранятся в специальном массиве структур, для доступа к ним вызывается функция расшифровки с номером структуры строки в массиве. Строки зашифрованы с помощью алгоритма RC4, ключ для расшифровки хранится в структуре.

Пример массива структур с описанием строк

Доступ к строке:

Функция расшифровки:

Обфускация DLL для веб-инжектов

Зловред «суспендит» потоки защитного решения одного из известных вендоров (аналогично троянцу Carberp) и в контексте своего процесса находит потоки, код которых был запущен из DLL-библиотек, расположенных по маске пути *\\Trusteer\\Rapport\\*.dll

Далее зловред проверяет содержимое DLL на интересующие его сигнатуры, и если они присутствуют — приостанавливает выполнение потока, патчит контекст так, чтобы он выполнял функцию Sleep, и возобновляет поток:

Затем KBOT проверяет код импортируемых функций на предмет патча. Если код пропатчен (например, добавлено 0xcc — точка останова), заново загружает импортируемые библиотеки и заполняет данные директории импорта.

Заключение

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

IOC

Исполняемые файлы:
Зараженные EXE
x86 — 2e3a7d4cf86025f5873ebddf3dcacf72
x64 — 46b3c12b44f587ae25d6f38d2a8c4e0f
Зараженные DLL
x86 — 5f00df73bb6e84c49b9bf33ff1d552c3
x64 — 1c15c98bc57c48140558d0e8d71b4ecd
Стилер:
c37058752b2c055ff3a3b3eac50f1350

C&C
213.252.245.229
my-backup-club-911[.]xyz
213.252.245.146/au.exe
sync-time[.]info/au.exe
sync-time[.]icu/au.exe
sync-time[.]club/au.exe

KBOT: иногда они возвращаются

Ваш e-mail не будет опубликован. Обязательные поля помечены *

 

  1. максим

    балдёж

Отчеты

CloudSorcerer: новая APT-угроза, нацеленная на российские государственные организации

«Лаборатория Касперского» обнаружила новую APT-угрозу CloudSorcerer, нацеленную на российские государственные организации и использующую облачные службы в качестве командных серверов аналогично APT CloudWizard.

StripedFly: двуликий и незаметный

Разбираем фреймворк StripedFly для целевых атак, использовавший собственную версию эксплойта EternalBlue и успешно прикрывавшийся майнером.

Подпишитесь на еженедельную рассылку

Самая актуальная аналитика – в вашем почтовом ящике