03.10.2023

Hack Pub

Новости интересные и малоизвестные из IT индустрии

Технический анализ QakBot

Общее описание

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 выполняет следующие вредоносные действия:

  • Сбор информации о скомпрометированном хосте.
  • Создание планируемых заданий (эскалация привилегий и закрепление в системе).
  • Сбор учетных данных:
    • Cоздание дампа учетных данных (Mimikatz, доступ к exe)*.
    • Кража паролей (данные браузера и cookie-файлы).
    • Манипуляции с веб-страницами банков (веб-инжект)*.
  • Подбор паролей.
  • Манипуляции с реестром (закрепление в системе).
  • Копирование себя.
  • Внедрение кода в процессы, чтобы скрыть вредоносную активность.

Взаимодействие с командным сервером

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 может приниматься или передаваться один или несколько таких пакетов (потоковая передача данных).

Стандартный поток выполнения прокси-модуля выглядит следующим образом:

  1. Установка связи с командным сервером, попытка выполнить переадресацию портов через UPnP, определение доступных портов и передача информации о них командному серверу. Как правило, для связи с командным сервером используются запросы HTTP POST с данными в формате JSON, зашифрованными по алгоритму RC4.
  2. Загрузка библиотеки OpenSSL. При этом загруженный файл не сохраняется — QakBot лишь измеряет скорость загрузки и удаляет полученный файл.
  3. Настройка соединения с внешним командным прокси по полученной от промежуточного компонента команде 37 (обновление конфигурации) для модуля 274 (прокси).

Взаимодействие с внешним командным прокси:

  1. Отправка начального запроса прокси-модуля. Начальный запрос содержит идентификатор бота, внешний IP-адрес зараженного компьютера, данные обратного просмотра DNS для этого внешнего IP-адреса, измеренную ранее скорость интернет-соединения и время с момента запуска прокси-модуля (в секундах).
  2. Установление соединения с командным прокси (с помощью последовательности прокси-команд 1->10->11).
  3. Инициализация сеансов, аутентификация SOCKS5 с использованием логина и пароля, полученных от командного прокси по команде 10.
  4. Инициация соединения типа 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 человек.

Количество пользователей, пострадавших от атак QakBot в период с января по июль 2020 и 2021 гг. (скачать)

Самые масштабные кампании мы наблюдали в первом квартале 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

Индикаторы компрометации (адреса командных серверов)

75.67.192[.]125:443 24.179.77[.]236:443 70.163.161[.]79:443
72.240.200[.]181:2222 184.185.103[.]157:443 78.63.226[.]32:443
83.196.56[.]65:2222 95.77.223[.]148:443 76.168.147[.]166:993
105.198.236[.]99:443 73.151.236[.]31:443 64.121.114[.]87:443
213.122.113[.]120:443 97.69.160[.]4:2222 77.27.207[.]217:995
105.198.236[.]101:443 75.188.35[.]168:443 31.4.242[.]233:995
144.139.47[.]206:443 173.21.10[.]71:2222 125.62.192[.]220:443
83.110.109[.]155:2222 76.25.142[.]196:443 195.12.154[.]8:443
186.144.33[.]73:443 67.165.206[.]193:993 96.21.251[.]127:2222
149.28.98[.]196:2222 222.153.122[.]173:995 71.199.192[.]62:443
45.77.117[.]108:2222 45.46.53[.]140:2222 70.168.130[.]172:995
45.32.211[.]207:995 71.74.12[.]34:443 82.12.157[.]95:995
149.28.98[.]196:995 50.29.166[.]232:995 209.210.187[.]52:995
149.28.99[.]97:443 109.12.111[.]14:443 209.210.187[.]52:443
207.246.77[.]75:8443 68.186.192[.]69:443 67.6.12[.]4:443
149.28.99[.]97:2222 188.27.179[.]172:443 189.222.59[.]177:443
149.28.101[.]90:443 98.192.185[.]86:443 174.104.22[.]30:443
149.28.99[.]97:995 189.210.115[.]207:443 142.117.191[.]18:2222
149.28.101[.]90:8443 68.204.7[.]158:443 189.146.183[.]105:443
92.59.35[.]196:2222 75.137.47[.]174:443 213.60.147[.]140:443
45.63.107[.]192:995 24.229.150[.]54:995 196.221.207[.]137:995
45.63.107[.]192:443 86.220.60[.]247:2222 108.46.145[.]30:443
45.32.211[.]207:8443 193.248.221[.]184:2222 187.250.238[.]164:995
197.45.110[.]165:995 151.205.102[.]42:443 2.7.116[.]188:2222
45.32.211[.]207:2222 71.41.184[.]10:3389 195.43.173[.]70:443
96.253.46[.]210:443 24.55.112[.]61:443 106.250.150[.]98:443
172.78.59[.]180:443 24.139.72[.]117:443 45.67.231[.]247:443
90.65.234[.]26:2222 72.252.201[.]69:443 83.110.103[.]152:443
47.22.148[.]6:443 175.143.92[.]16:443 83.110.9[.]71:2222
149.28.101[.]90:995 100.2.20[.]137:443 78.97.207[.]104:443
207.246.77[.]75:2222 46.149.81[.]250:443 59.90.246[.]200:443
144.202.38[.]185:995 207.246.116[.]237:8443 80.227.5[.]69:443
45.77.115[.]208:995 207.246.116[.]237:995 125.63.101[.]62:443
149.28.101[.]90:2222 207.246.116[.]237:443 86.236.77[.]68:2222
45.32.211[.]207:443 207.246.116[.]237:2222 109.106.69[.]138:2222
149.28.98[.]196:443 45.63.107[.]192:2222 84.72.35[.]226:443
45.77.117[.]108:443 71.163.222[.]223:443 217.133.54[.]140:32100
144.202.38[.]185:2222 98.252.118[.]134:443 197.161.154[.]132:443
45.77.115[.]208:8443 96.37.113[.]36:993 89.137.211[.]239:995
45.77.115[.]208:443 27.223.92[.]142:995 74.222.204[.]82:995
207.246.77[.]75:995 24.152.219[.]253:995 122.148.156[.]131:995
45.77.117[.]108:8443 24.95.61[.]62:443 156.223.110[.]23:443
45.77.117[.]108:995 96.61.23[.]88:995 144.139.166[.]18:443
45.77.115[.]208:2222 92.96.3[.]180:2078 202.185.166[.]181:443
144.202.38[.]185:443 71.187.170[.]235:443 76.94.200[.]148:995
207.246.77[.]75:443 50.244.112[.]106:443 71.63.120[.]101:443
140.82.49[.]12:443 24.122.166[.]173:443 196.151.252[.]84:443
81.214.126[.]173:2222 73.25.124[.]140:2222 202.188.138[.]162:443
216.201.162[.]158:443 47.196.213[.]73:443 74.68.144[.]202:443
136.232.34[.]70:443 186.154.175[.]13:443 69.58.147[.]82:2078

* данная операция может быть выполнена как внешняя команда (вызов внешнего модуля).