Общее описание
QakBot, также известный как QBot, QuackBot и Pinkslipbot, — это банковский троянец, существующий уже более тринадцати лет. Он был обнаружен в 2007 году и с тех пор постоянно совершенствуется.
В последние годы QakBot стал одним из самых активных банковских троянцев в мире. Его основная цель — кража учетных данных (логинов, паролей и т. д.) для входа в финансовые сервисы. Однако это не единственная его функция. QakBot может шпионить за банковской деятельностью организации, распространяться по сети и устанавливать программы-шифровальщики для получения максимальной прибыли от атаки на организации.
QakBot постоянно совершенствуется, получая новые возможности и применяя новые техники: он записывает нажатия клавиш, выполняет функции бэкдора и использует различные приемы для защиты от обнаружения. Из последних функций стоит отметить обнаружение виртуальных сред, регулярное самообновление и изменение схем шифрования и упаковки бинарного кода. Кроме того, QakBot старается защитить себя от анализа и отладки вручную или с помощью автоматизированных инструментов.
Еще одна интересная функция — перехват электронных писем. Злоумышленники впоследствии используют их для целевых рассылок: содержащаяся в них информация может помочь убедить жертву открыть вредоносное письмо.
Цепочка заражения QakBot
QakBot известен тем, что заражает системы жертв в основном через спам. В некоторых случаях письма содержат вложенные документы Microsoft Office (Word, Excel) или защищенные паролем архивы с такими файлами. В документах, в свою очередь, присутствуют вредоносные макросы. Пользователям предлагается открыть вложение, потому что оно якобы содержит важную информацию (например, счет-фактуру). В других письмах злоумышленники рассылают ссылки на страницы загрузки вредоносных документов.
Помимо спам-рассылок злоумышленники используют еще один вектор заражения, который предусматривает загрузку полезной нагрузки QakBot на компьютер жертвы с помощью другого вредоносного ПО, уже присутствующего на нем.
Как правило, злоумышленники выбирают тот вектор заражения, который считают наиболее действенным для конкретной организации. Известно, что многие преступники заранее собирают и анализируют информацию о целевых организациях из открытых источников (OSINT), чтобы решить, какой вектор заражения будет наиболее эффективен.
Цепочка заражения QakBot
Цепочка заражения для последних вариантов QakBot (2020–2021 гг.) выглядит следующим образом:
- Пользователь получает фишинговое письмо с вложенным ZIP-архивом, содержащим документ Office со встроенным макросом или незаархивированным документом; также в письме может быть ссылка для загрузки исполняемого файла QakBot.
- Пользователь открывает вредоносное вложение или ссылку и соглашается включить содержимое документа.
- Выполняется вредоносный макрос. Некоторые варианты зловреда отправляют GET-запрос на загрузку файла PNG. Однако на самом деле это бинарный исполняемый файл.
- Загруженная полезная нагрузка (промежуточный компонент) включает в себя другой бинарный файл, содержащий зашифрованные модули ресурсов. Один из зашифрованных ресурсов содержит двоичный файл DLL (загрузчик), который расшифровывается позже при выполнении вредоносного файла.
- Промежуточный компонент загружает в память загрузчик, который дешифрует и выполняет полезную нагрузку. Параметры конфигурации извлекаются из другого ресурса.
- Полезная нагрузка взаимодействует с командным сервером.
- На зараженный компьютер могут загружаться дополнительные вредоносные программы, например программа-шифровальщик ProLock.
Стандартные функции QakBot
По нашим наблюдениям, QakBot выполняет следующие вредоносные действия:
- Сбор информации о скомпрометированном хосте.
- Создание планируемых заданий (эскалация привилегий и закрепление в системе).
- Сбор учетных данных:
- Подбор паролей.
- Манипуляции с реестром (закрепление в системе).
- Копирование себя.
- Внедрение кода в процессы, чтобы скрыть вредоносную активность.
Взаимодействие с командным сервером
QakBot содержит список из 150 IP-адресов, которые встроены в один из ресурсов бинарного файла загрузчика. Большая часть этих адресов принадлежит другим зараженным системам, которые используются как прокси-серверы для перенаправления трафика на другие прокси или на реальный командный сервер.
Зловред отправляет на командный сервер запрос HTTPS POST с данными, закодированными по методу Base64. Данные шифруются по алгоритму RC4. Для шифрования используется статическая строка jHxastDcds)oMc=jvh7wdUhxcsdt2 и случайная 16-байтная последовательность. Сами данные имеют формат JSON.
Исходное сообщение в формате JSON
Запрос HTTPS POST с зашифрованными данными в формате JSON
В общем случае после заражения бот отправляет сообщения PING, SYSTEM INFO и ASK for COMMAND. Командный сервер отвечает сообщениями ACK и COMMAND. Если командный сервер передает дополнительные модули, бот отправляет сообщение STOLEN INFO с данными, украденными этими модулями.
- Сообщение PING— запрос от бота к командному серверу с данными BOT ID для проверки активности командного сервера.
Сообщение PING
- Сообщение ACK— ответ командного сервера с единственным значимым полем «16», содержащим внешний IP-адрес зараженной системы.
Сообщение ACK
- Сообщение SYSTEM INFO— запрос от бота к командному серверу с собранной информацией о зараженной системе. Помимо общей информации о системе (версия и разрядность ОС, имя пользователя, имя компьютера, домен, разрешение экрана, системное время, время работы системы, время работы бота), здесь также содержатся результаты выполнения следующих команд и запросов WMI:
- whoami /all
- arp -a
- ipconfig /all
- net view /all
- cmd /c set
- nslookup -querytype=ALL -timeout=10 _ldap._tcp.dc._msdcs.{DOMAIN}
- nltest /domain_trusts /all_trusts
- net share
- route print
- netstat -nao
- net localgroup
- qwinsta
- WMI Query ROOTCIMV2:Win32_BIOS
- WMI Query ROOTCIMV2:Win32_DiskDrive
- WMI Query ROOTCIMV2:Win32_PhysicalMemory
- WMI Query ROOTCIMV2:Win32_Product
- WMI Query ROOTCIMV2:Win32_PnPEntity
Сообщение SYSTEM INFO
- Сообщение ASK for COMMAND— запрос команды от бота к командному серверу. После отправки сообщения SYSTEM INFO бот начинает запрашивать у сервера команду для выполнения. Поле «14» — один из основных параметров запроса (SALT). Его значение уникально и изменяется в каждом запросе. Оно используется для защиты от перехвата управления ботом. После получения этого запроса командный сервер использует значение SALT в процедуре подписывания. Он добавляет подпись в ответ, чтобы бот мог удостовериться, что данные подписаны. Выполняться будут только действительные и подписанные команды.
Сообщение ASK for COMMAND
- Сообщение COMMAND— ответ сервера с командой для выполнения. Текущая версия бота поддерживает 24 команды, большинство из которых связаны с загрузкой, выполнением, внедрением дополнительных модулей и конфигурационных файлов модулей с различными параметрами, а также настройкой и обновлением параметров конфигурации.
Сообщение этого типа содержит подписанное значение SALT (полученное из поля «14» в запросе бота), а также идентификаторы COMMAND ID и MODULE ID. Остальные значения в сообщении не подписываются.В предыдущих версиях бот получал модули и команды сразу после заражения и отправки сообщения SYSTEM INFO. Сейчас командный сервер примерно в течение часа отвечает пустой командой и только по истечении этого времени отправляет в ответ необходимые команды и модули. Мы полагаем, что эта временная задержка нужна для того, чтобы затруднить получение и анализ новых команд и модулей в изолированной контролируемой среде.
Сообщение COMMAND — ответ сервера с пустой командой
Если командный сервер доставляет какие-либо модули, их бинарное содержимое в кодировке Base64 помещается в поле «20» сообщения.
Сообщение COMMAND — ответ сервера с дополнительным модулем
- Сообщение STOLEN INFO— сообщение от бота к командному серверу, содержащее украденную информацию (пароли, учетные записи, электронную почту и т. д.). Эти данные шифруются по алгоритму RC4 и кодируются по алгоритму Base64. Ключ для RC4-шифрования генерируется другим способом — с использованием идентификатора зараженной системы (Bot ID), а не статической строки, как при шифровании трафика.
Сообщение STOLEN INFO
После взаимодействия с командным сервером QakBot скачивает и использует дополнительные модули для выполнения вредоносных действий.
Каждый образец содержит разные дополнительные компоненты. Это могут быть сборщики cookie-файлов, электронных писем или учетных данных, прокси и другие модули.
Злоумышленники могут создавать их самостоятельно или брать из сторонних репозиториев и адаптировать для своих целей. В разных образцах могут использоваться разные модули. Например, более старые образцы использовали утилиту Mimikatz для выгрузки дампа учетных данных.
Ниже перечислены модули, которые мы нашли во время анализа.
Дополнительные модули
- Сборщик cookie-файлов собирает cookie из популярных браузеров (Edge, Firefox, Chrome, Internet Explorer).
- Скрытый VNC-доступ (hVNC) позволяет злоумышленникам подключаться к зараженному компьютеру и взаимодействовать с ним незаметно для пользователя.
- Сборщик электронных писем пытается найти Microsoft Outlook на зараженном компьютере, затем последовательно просматривает программные папки одну за другой и рекурсивно собирает письма. В конце модуль отправляет собранную информацию на удаленный сервер.
Какое-то время злоумышленники распространяли отладочную версию модуля сборщика электронных писем
- Модуль перехвата перехватывает жестко заданный набор функций WinAPI и DLL-библиотек браузера Mozilla (если он имеется в системе). Это необходимо для выполнения веб-инжектов, мониторинга трафика и данных, вводимых с клавиатуры, и даже предотвращения DNS-резолвинга определенных доменов. Перехват выполняется следующим образом: QakBot внедряет в нужный процесс модуль перехвата, который находит функции из заданного в коде зловреда набора и изменяет их, чтобы они выполняли код злоумышленников.
Модуль содержит зашифрованный список DLL-библиотек и функций, которые бот будет перехватывать
- Сборщик паролей собирает имена пользователей и пароли из разных источников: файлов Firefox и Chrome, хранилища Microsoft Vault и т. п. Вместо Mimikatz, как в предыдущих версиях, модуль использует собственные алгоритмы для сбора паролей.
Процедура сбора паролей из разных источников
- Прокси-модуль старается определить доступные для прослушивания порты, используя переадресацию портов через UPnP и запросы к командному серверу второго уровня. При сравнении текущей и старой версий загрузчика прокси обнаружились интересные моменты: злоумышленники решили убрать из бинарного файла зависимость от библиотеки cURL и осуществлять все коммуникации по протоколу HTTP с помощью собственного кода. Помимо этого, они также убрали зависимости от библиотеки OpenSSL и свели все функции вместе: отдельные модули загрузчика прокси и собственно прокси стали единым исполняемым файлом.
Формирование запроса на переадресацию портов через UPnP
После попытки определить, открыты ли порты и может ли компьютер выступать в роли прокси для командного сервера второго уровня, модуль прокси также запускает многопоточный прокси-сервер SOCKS5. Протокол SOCKS5 инкапсулируется в прокси-протокол QakBot, который выглядит следующим образом: команда прокси QakBot (1 байт), версия (1 байт), идентификатор сеанса (4 байта), общая длина пакета (значение типа DWORD), данные (общая длина пакета минус 10). Входящие и исходящие пакеты хранятся в буферах; в одном сегменте данных TCP может приниматься или передаваться один или несколько таких пакетов (потоковая передача данных).
Стандартный поток выполнения прокси-модуля выглядит следующим образом:
- Установка связи с командным сервером, попытка выполнить переадресацию портов через UPnP, определение доступных портов и передача информации о них командному серверу. Как правило, для связи с командным сервером используются запросы HTTP POST с данными в формате JSON, зашифрованными по алгоритму RC4.
- Загрузка библиотеки OpenSSL. При этом загруженный файл не сохраняется — QakBot лишь измеряет скорость загрузки и удаляет полученный файл.
- Настройка соединения с внешним командным прокси по полученной от промежуточного компонента команде 37 (обновление конфигурации) для модуля 274 (прокси).
Взаимодействие с внешним командным прокси:
- Отправка начального запроса прокси-модуля. Начальный запрос содержит идентификатор бота, внешний IP-адрес зараженного компьютера, данные обратного просмотра DNS для этого внешнего IP-адреса, измеренную ранее скорость интернет-соединения и время с момента запуска прокси-модуля (в секундах).
- Установление соединения с командным прокси (с помощью последовательности прокси-команд 1->10->11).
- Инициализация сеансов, аутентификация SOCKS5 с использованием логина и пароля, полученных от командного прокси по команде 10.
- Инициация соединения типа SOCKS5, инкапсулированного в протокол прокси-модуля Qak
Прокси-команды QakBot:
Команда | Описание |
1 | Приветствие (бот -> командный сервер) |
10 | Настройка учетных данных для авторизации (командный сервер -> бот) |
11 | Подтверждение настройки учетных данных (бот -> командный сервер) |
2 | Создание нового прокси-сеанса (командный сервер -> бот) |
3 | Аутентификация SOCKS5 (бот -> командный сервер) |
4 | Обработка запросов SOCKS5 (выполняется в обе стороны) |
5 | Завершение сеанса (выполняется в обе стороны) |
6 | Обновление состояния сеанса / уведомление об обновлении состояния сеанса (выполняется в обе стороны) |
7 | Обновление состояния сеанса / уведомление об обновлении состояния сеанса (выполняется в обе стороны) |
8 | PING (командный сервер -> бот) |
9 | PONG (бот -> командный сервер) |
19 | Сохранение текущего времени в реестре (командный сервер -> бот) |
Результат парсинга пакетов, полученных от командного сервера
Отслеживание одиночного прокси
- Веб-инжект— файл конфигурации для модуля перехвата.
После установления связи с командным сервером загружаются дополнительные модули, один из которых — веб-инжект. Он отслеживает трафик жертвы, внедряясь в процесс браузера и перехватывая сетевые API. Модуль перехвата получает доступ к потоку выполнения перехваченных API, и, когда жертва открывает определенные веб-страницы, связанные с банкингом и финансами, в исходный код таких страниц внедряется дополнительный код на JavaScript.
Фрагмент кода на JavaScript, внедренного в исходный код страницы входа на сайт Wells Fargo
Статистика QakBot
Мы проанализировали статистику атак QakBot, сформированную с помощью Kaspersky Security Network (KSN), — это решение, которое собирает и обрабатывает обезличенные данные, добровольно предоставленные пользователями продуктов «Лаборатории Касперского». За первые семь месяцев 2021 года наши продукты выявили 181 869 попыток скачать или запустить QakBot. Это меньше, чем в период с января по июль 2020 года, однако количество пострадавших пользователей выросло на 65% по сравнению с прошлым годом и достигло 17 316 человек.
Самые масштабные кампании мы наблюдали в первом квартале 2021 года, когда с QakBot столкнулись 12 704 пользователя продуктов «Лаборатории Касперского»: 8068 пользователей были атакованы в январе и 4007 в феврале.Выводы
QakBot — известный банковский троянец, в разных версиях которого (старых и новых) могут использоваться разные методы атак. Его разработка ведется уже более тринадцати лет, он до сих пор активно используется, и, судя по всему, его активность не прекратится в ближайшее время. Зловред постоянно обновляется: злоумышленники продолжают добавлять в него новые возможности и обновлять модули, чтобы получать максимальную прибыль.
Известно, что преступники могут менять свои способы работы в зависимости от установленных на устройстве жертвы защитных решений и использовать сложные приемы, чтобы оставаться незамеченными. Несмотря на то, что QakBot применяет различные техники, чтобы избежать обнаружения (например, составляет список запущенных процессов и ищет среди них защитные решения), наши продукты могут обнаружить эту угрозу с помощью поведенческого анализа. Основные вердикты, с которыми детектируется это вредоносное ПО:
Backdoor.Win32.QBot
Backdoor.Win64.QBot
Trojan.JS.QBot
Trojan.MSOffice.QBot
Trojan.MSOffice.QbotLoader
Trojan.Win32.QBot
Trojan-Banker.Win32.QBot
Trojan-Banker.Win32.QakBot
Trojan-Banker.Win64.QBot
Trojan-Downloader.JS.QBot
Trojan-PSW.Win32.QBot
Trojan-Proxy.Win32.QBot
Индикаторы компрометации (адреса командных серверов)
* данная операция может быть выполнена как внешняя команда (вызов внешнего модуля).
Технический анализ QakBot