Новая модификация банковского трояна TrickBot отказалась от привычного HTTP-протокола и перешла на передачу данных через DNS-запросы. Такая техника позволяет обходить сетевые экраны и системы обнаружения вторжений, которые редко анализируют DNS-трафик на предмет вредоносной активности.
Описание
Вредоносная программа, которую аналитики FortiGuard Labs изучали на протяжении нескольких месяцев, сохраняет модульную архитектуру, характерную для семейства TrickBot. Однако способ связи с управляющими серверами изменился кардинально. Вместо прямых HTTP-соединений злоумышленники теперь используют искажённые DNS-запросы, внешне неотличимые от легитимного трафика. Это значительно усложняет выявление заражённых устройств в корпоративных сетях.
Троян устанавливается на компьютер жертвы и обеспечивает себе закрепление в системе через планировщик задач Windows. Для этого он создаёт задачу с именем, маскирующимся под автоматическое обновление легитимного приложения, например Wireshark. Задача запускает исполняемый файл каждые несколько минут, что гарантирует постоянное присутствие вредоноса даже после перезагрузки системы. Важный нюанс: троян сохраняет имя задачи и путь к своему файлу в альтернативных потоках данных NTFS, что затрудняет ручное обнаружение.
Сам процесс связи с командным сервером устроен сложнее, чем в предыдущих версиях TrickBot. Вредоносная программа шифрует управляющие команды с помощью простого XOR-алгоритма, затем преобразует результат в шестнадцатеричную строку и разбивает её на поддомены размером не более 63 символов. Полученная строка дописывается к легитимно выглядящему доменному имени - в данном анализе это был "westurn[.]in". Такой подход позволяет упаковать до 183 байт полезной нагрузки в один DNS-ответ, используя нестандартную кодировку данных в IPv4-адресах.
Как показало расследование, троян передаёт три типа пакетов: запросы команд (тип 0x30), запросы размера ответа (тип 0x31) и собственно приём данных (тип 0x32). Для каждого сеанса связи генерируется уникальный идентификатор - UUID длиной 10 байт, который позволяет согласовывать фрагментированные пакеты. Если запрос превышает 96 байт, он разбивается на несколько фрагментов, а затем собирается на стороне сервера. Такая схема делает трафик похожим на обычный DNS-трафик с многочисленными поддоменами.
При ответе командный сервер использует IP-адреса для передачи данных. Старшие 6 бит первого октета каждого адреса зарезервированы под индекс сортировки, а оставшиеся 26 бит несут три байта полезной нагрузки. Максимальное число адресов в одном DNS-ответе - 63, но первые два зарезервированы для смещения данных и размера полезной нагрузки. Таким образом, реально передаётся 61 адрес, что даёт 183 байта на пакет. Для защиты от перемешивания адресов промежуточными DNS-резолверами троян сортирует полученные адреса по индексу перед расшифровкой.
Скорость передачи данных через DNS-туннель невысока: в тестовой среде передача файла объёмом 1,2 мегабайта заняла 40 секунд, что соответствует примерно 30 килобайтам в секунду. Однако для кражи учётных данных, перехвата нажатий клавиш или другой конфиденциальной информации такой пропускной способности вполне достаточно.
Анализ управляющих команд показал, что структура протокола заимствована из более старых HTTP-версий TrickBot. Первая команда "0" регистрирует жертву на сервере, передавая имя компьютера, версию операционной системы и уникальный идентификатор. Интересно, что модуль ошибочно определяет Windows 10 как Windows 8 x64 - вероятно, это остаток от предыдущих версий кода. После регистрации троян отправляет команду "1", ожидая от сервера задание: загрузить и выполнить дополнительный модуль, выполнить команду Windows, запустить скрипт PowerShell или даже исполнить машинный код прямо в памяти.
Всего поддерживается 12 типов ответных команд, среди которых - запуск исполняемого файла, инжекция кода в другие процессы через технику подмены процесса, а также выполнение команд через анонимные каналы cmd.exe. Для загрузки дополнительных модулей используется команда "5", которая принимает имя модуля (ранее полученное в ответе на команду "1") и инициирует передачу двоичных данных через DNS-туннель.
Скачанные динамические библиотеки сохраняются во временные файлы со случайными именами и запускаются с помощью rundll32.exe с вызовом экспортируемой функции Control_RunDLL. Это стандартный приём, характерный для многих семейств вредоносного ПО, позволяющий выполнять код в контексте легитимного системного процесса.
С точки зрения обфускации, новая версия TrickBot использует шифрование строковых констант, которые расшифровываются только во время выполнения. Все вызовы Windows API осуществляются по хешам - функция Get_API_By_Hash() получает на вход 32-битный хеш и возвращает адрес нужной функции из загруженных библиотек. Это затрудняет статический анализ: аналитик не может увидеть, какие именно API использует троян, просто открыв исполняемый файл в дизассемблере.
Примечательно, что образцы вредоноса, захваченные в разных местах, имеют одинаковые характеристики и структуру стартового кода. Это указывает на то, что все они являются частью одной кампании и, вероятно, генерируются одним инструментом сборки. Различаются только хеши файлов, что не позволяет использовать сигнатурный поиск для обнаружения.
Использование DNS-туннелирования - не новая техника, но её применение в TrickBot показывает эволюцию угрозы: злоумышленники адаптируются к современным средствам защиты, которые редко анализируют DNS-трафик на предмет скрытых каналов. Для бизнеса это означает, что стандартные политики блокировки подозрительных HTTP-соединений могут оказаться недостаточными. Необходимо мониторить аномалии в DNS-запросах - например, необычно длинные имена поддоменов или большое количество запросов к одному домену с разных хостов.
Хотя оригинальный командный сервер был отключён к моменту анализа, исследователи смогли воссоздать его поведение с помощью симуляции. Это позволило полностью описать протокол обмена данными и подтвердить, что TrickBot остаётся серьёзной угрозой благодаря своей модульной архитектуре и способности адаптироваться к новым условиям.
Индикаторы компрометации
Domain
- westurn.in
SHA256
- 105f652e6b8f31c371f2385877e43b6772aff5d3168d5d4635f8a1fcbb321421
- 33c331ededbf8ee9829895424423ce3fd17e359d2e784fcbce396aacff458cf5
- 3b19a82e1354ac14a3da7c840cbdd0ce50db38432d78e767b36f08e45024c23d
- 6c677eb2b3ffd288083c59a13d7bb712d4754af61a5563873f76c440962346f4
- bf80245ba792992fbfe24abac33f8fd66f24cdeb5f0f21cfdf45a29d107c8d3b
- df527a5c2fbde43816cd02f4cd49eee4bb82fb4a3c7045021360888c7d504c98