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

Denis и его команда

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

В данной статье мы рассмотрим наиболее примечательных «пользователей» DNS-туннеля. Продукты «Лаборатории Касперского» детектируют их как общими (Trojan.Denes.UDP.C&C и Backdoor.Win32.Denis.*), так и «индивидуальными» вердиктами.

Trojan.Win32.Ismdoor.gen

Первый рассматриваемый зловред имеет многоуровневую структуру протокола взаимодействия с C&C, сходную с моделью OSI, что выгодно отличает его от прочих описанных троянцев — авторы Trojan.Win32.Ismdoor.gen действительно постарались при его проектировании и разработке.

В качестве транспортного уровня используется, само собой, DNS-туннель. Длина исходящих «датаграмм» ограничена 60 символами – конфигурация DNS-серверов и сам протокол подразумевает возможность увеличения данного значения. Команды сервера разрешаются в виде адреса в формате IPv6.

В общем виде запрос к C&C выглядит следующим образом:

n.n.c.<ID сессии>.<Домен сервера>.com


Структура запроса/ответа «транспортного уровня»

Над транспортным протоколом DNS-туннеля выстроен сеансовый, подразумевающий возможность обмена «короткими» и «длинными» пакетами и отличающийся от транспортного протокола механизмом проверки утерянных сообщений. Тогда как сессия транспортного протокола завершается обменом данными о количестве отправленных и полученных пакетов, в сеансовом протоколе производится проверка корректного получения каждого отправленного пакета. Выбор, какой способ использовать, остается за сервером, — к примеру, для получения файла с зараженного компьютера используется протокол с «длинными» пакетами.

Пример протокола для обмена короткими сообщениями

Короткие сообщения

На этом уровне работу бота можно условно разделить на пять шагов:

  • Объявление серверу IDсессии;
  • Отправка сообщения пакетами;
  • Отправка количества переданных пакетов;
  • Получение количества входящих пакетов;
  • Прием входящих пакетов.

Пример сессии:

  1. Объявление серверу ID сессии

При каждом открытии сессии связи бот генерирует GUID и сообщает его серверу. Все дальнейшие взаимодействия сеанса идентифицируются этим GUID, который всегда записывается на место домена третьего уровня. Структура URL в данном случае имеет следующий вид:

n.n.c.<ID сессии>.<Домен сервера>.com

Положительным ответом является сообщение A67DDB8A2A17334765443253702AA3. В противном случае отправка повторяется.

  1. Отправка сообщения

Как уже говорилось ранее, выбранный механизм коммуникации накладывает некоторые ограничения на размер пакетов. Исходящее сообщение разбивается на пакеты длиной 60 байт и передается в виде URL:

<Исходящий пакет>.<Номер пакета>.dr.<ID сессии>. <Домен сервера>.com

В качестве ответа должно быть получено A67DDB885A3432576548A2A3707334.

  1. Отправка количества переданных пакетов

После успешной отправки всех пакетов передается их количество в виде запроса следующего вида:

n.<Количество пакетов>.f.<ID сессии>.<Домен сервера>.com

Стоит отметить, что нумерация пакетов начинается с 0. Ответом служит 20202020202020202020202020202020.

  1. Получение количества входящих пакетов

Данный шаг реализуется с помощью URL вида:

n.n.fc.<ID сессии>.<Домен сервера>.com

Ответ должен быть вида

A67D: DB8: 85A3: 4325: 7654: 8A2A :: <Количество входящих пакетов>

  1. Прием входящих пакетов

Запрос на получение очередного пакета выглядит так:

www. <Номер пакета>.s. <ID сессии> .<Домен сервера>.com

Входящие сообщения приходят в виде 16-байтных пакетов IPv6 .

Длинные сообщения

В данном случае взаимодействие с сервером можно разбить на следующие шаги:

  • Передача количества пакетов, на которые был разбит файл;
  • Отправка файла;
  • Периодический опрос сервера на предмет утерянных пакетов;
  • Повторная отправка утерянных пакетов.

ID сессии берется из запроса, в котором этот файл был затребован.

  1. Передача количества пакетов

Запрос: n.<Количество пакетов>.<ID сессии>.<Домен сервера>.com

Ответ: A67DDB8A2A17334765443253702AA3.

  1. Отправка файла пакетами

Запрос: <Исходящий пакет>.<Номер пакета>.d.<ID сессии>.<Домен сервера>.com

Ответ: на данное сообщение сервер отвечать не будет или ответит ошибкой Server failure.

  1. Периодический опрос сервера на предмет утерянных пакетов

Периодически бот опрашивает сервер:

uff<Количество пакетов>.<Количество пакетов>.<Домен сервера>.com

Ответ: 20202020202020202020202020202020

Далее реализуются пункты «Получение количества входящих пакетов» и «Прием входящих пакетов» из предыдущего раздела.

В ответе указываются через запятую номера пакетов, которые сервер не получил.

  1. Повторная отправка утерянных пакетов

Запрос: <Исходящий пакет>.<Номер пакета>.dl.<ID сессии>.<Домен сервера>.com

Представительский уровень OSI отвечает за кодирование и декодирование сообщений. Ответ сервера, содержащийся в поле IPv4, представлен в виде обычной ASCII-строки, кратной шестнадцати. Обращение к серверу в DNS-запросе кодируются в base64 c переопределенной индексной таблицей.

Пример первого сообщения и его же в теле «датаграммы»

Прикладной уровень — это просто набор «GET-подобных» обращений к C&C:

  • Проверка соединения. Cам запрос выглядит как строка «M:CC?»;
  • Регистрация подключения — определяет доступные команды и идентификаторы зараженной машины и бота (M:AV?appId=<…>&uniqueId=<…>);
  • Команда подтверждения регистрации;
  • «Обобщенный» ответ (M:ME?appId=<…>&message=<…>);
  • Получение команды (M:GAC?appId=8);
  • Подтверждение команды (M:CR?cd=<GUID команды>);
  • Отправить файл (M:SF?commandId=CmdResult=<GUID команды>|||<Результат выполнения команды>);
  • Получить файл (M:GF?).

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

  • SI — передача информации о зараженной системе;
  • RunNewVersion — обновление;
  • Restart — перезапуск;
  • remove — «самоудаление»;
  • CreateMimi1Bat — выполнение Mimikatz;
  • ExecuteKL — активация кейлоггера ;
  • RemoveKL — удаление файлов, созданных ExecuteKL;
  • GetVersion — отправка версии зловреда;
  • PauseUpload — приостанавливает загрузку файла на сервер;
  • ResumeUpload — возобновляет загрузку файла на сервер;
  • PauseDownload — приостанавливает скачивание файла с сервера;
  • ResumeDownload — возобновляет скачивание файла с сервера;
  • PWS — создание скриншота;
  • DownloadFile — скачать файл с сервера;
  • UploadFile — загрузить файл на сервер.

Прочие команды, которыми располагает троянец, отвечают за логику его работы (изменение адреса командного сервера и т.п.).

Backdoor.Win32.ClIEcker

Следующий из рассматриваемых семплов использует другую схему работы, основанную на пакетах ANY DNS. Такой механизм позволяет принимать от сервера DNS-пакеты произвольной структуры. В троянце отсутствует логическое разбиение на подпротоколы — есть просто исходящие и входящие запросы. Нам удалось обнаружить несколько модификаций данного зловреда, ниже будут описаны функции и особенности, присутствующие во всех.

Одной из интересных особенностей Backdoor.Win32.ClIEcker является способ получения IP-адреса — для этого он использует COM-интерфейс Internet Explorer. Троянец содержит список адресов сайтов, на которых посетитель может увидеть свой IP-адрес (например: http://www.ip-adress.com). Зловред выбирает случайным образом один, переходит по нему, находит в теле страницы строку, после которой начинается IP-адрес и извлекает его. Для того чтобы максимально правдоподобно «замаскировать» обращение, троянец также подбирает случайный адрес реферала и заполняет его в соответствующем запросе к Internet Explorer.

Неясно только, почему был выбран такой сложный способ: как правило, троянцы узнают IP-адрес жертвы, запрашивая данные с сайтов, возвращающих в качестве HTML-страницы строку с IP-адресом. Можно предположить, что это было сделано в попытке исключить резолв IP из списка IoC данного вредоноса, либо же это просто бездумный «копипаст» с репозитория или форума.

Ситуация усугубляется еще и тем, что в зловреде есть команда для открытия страницы в IE по запросу от сервера и для этого используется тривиальный вызов формата «IEXPLORE.EXE ya.ru», а не сложное взаимодействие через COM. Из-за этого зловред может детектироваться как Trojan-Clicker, однако, как было рассказано в одной из предыдущих статей, троянцы данной группы обычно используют для этих целей виртуальный рабочий стол.

Примеры адресов для резолва IP/Адреса рефералов/Получения содержимого страницы через COM

В качестве инициирующего запроса передается ряд параметров с информацией о системе, а также уникальный ключ RC4, созданный на основании данных о зараженном компьютере:

  • Старшая версия операционной системы;
  • Логический флаг – используется ли подключение по модему или нет;
  • Идентификатор троянца;
  • Зашифрованный IP-адрес пользователя;
  • Код антивирусной службы.

По последнему пункту следует дать некоторое пояснение – троянец содержит список процессов защитного ПО, где каждый продукт имеет свой бит в коде, передаваемом на сервер. То есть, например, все процессы, относящиеся к продуктам McAfee, будут обозначатся флагом 0x400 в коде антивирусной службы.

Далее приведем описание некоторых команд:

Код Аргументы Описание
0 Имя файла Запуск скачанного файла.
1 URL Открытие указанной страницы при помощи IE.
2,3 NULL Данные команды должны получать в качестве аргумента код исполняемого файла, сохранять его и запускать, причем в первом случае работа текущего семпла завершается. По какой-то причине их функционирование отключено и зловред, игнорируя оставшуюся часть списка команд, переходит к запросу нового.
5 Период опроса сервера в минутах Предусмотрено два различных периода опроса сервера. Первый применяется, если предыдущий список команд был выполнен до конца. В противном случае используется второй. Данная команда выставляет период ожидания для первого варианта.
6 NULL Завершение работы.
7 Период ожидания в минутах Пауза в работе на указанное количество минут.
18 Модификатор Если модификатор >= 0, выполняется следующая команда в списке. В противном случае обработка списка прерывается.
19 Период опроса сервера в минутах Установка периода опроса сервера на случай, когда обработка списка была прервана.
21 NULL Устанавливает флаг быстрого подключения. Это позволяет малваре опрашивать сервер на предмет нового списка команд сразу же после выполнения предыдущего.
22 NULL Удалить скачанный файл.
23 Имя файла Задает новое имя для скаченного файла.

Отдельного внимания заслуживает команда с кодом 8, так как в ней сосредоточен основные возможности программы. Ее задача — скачать и запустить полезную нагрузку. Аргументы у данной команды следующие:

Имя аргумента Описание
File_Size Размер загружаемого файла.
SessionID Идентификатор сессии.
ServerKey Ключ для RC4, полученный от сервера.
GetFile_URL URL для скачивания файла.
DNS_URL URL DNS-сервера, который будет использоваться для создания DNS-туннеля.
GetPacketInterval Интервал опроса сервера на предмет следующего пакета.
KeyMod Флаг смены ключа.
ReportURL URL сервера, куда будет отправлено сообщение об успешном получении файла.
ExecMode Модификатор исполнения файла. Если он больше 2, файл не будет ни сохранен, ни исполнен. Если равен 2, он будет сохранен и запущен. В ином случае будет произведена попытка инъекции переданного файла в процесс IE.
Packet_Number Номер пакета.

Для передачи файла используются пакеты формата TXT DNS.

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

После завершения дешифровки целостность полученного файла проверяется с помощью CRC32.

Backdoor.Win32.Denis

Backdoor.Win32.Denis имеет наиболее простую структуру и наиболее простую функциональность для взаимодействия с DNS-сервером. Имя данной малвары совпадает с именем троянца, описанного в этой статье, но на этом сходство заканчивается.

Для взаимодействия с DNS-сервером используются пакеты формата A DNS, ограничивающего размер ответа четырьмя байтами. По всем признакам, данный зловред – обычный Trojan-Downloader с крайне низкой скоростью загрузки. В общем виде сообщение серверу выглядит следующим образом:

IC<Тип контейнера>.<UID>.<Контейнер>.<Адрес сервера>

Как «контейнер» мы обозначили упакованные результаты работы троянца — в зависимости от команды и ответа, структура контейнера может сильно разнится. UID это идентификатор пользователя с длинной 0x20. Представляет собой строку Base32, которая после декодирования имеет следующую структуру:

Смещение Описание
0x0 – 0xF Содержит имя хоста пользователя.
0x10 – 0x14 Содержит IP-адрес пользователя.

Контейнер так же является Base32-строкой:

Смещение Описание
0x0 – 0x3 Время создания сообщения в секундах.
0x4 – 0xB Сигнатура «IACIMAOQ».
0xC – 0x22 Сообщение.

Существует всего четыре типа контейнеров – троянец определяет необходимый исходя из входящей команды и результатов ее выполнения:

Тип Назначение Сообщение Описание
1 Передача информации о системе. Информация о логических дисках в системе пользователя. Первый байт указывает на количество передаваемых данных. Далее следуют пары байт: буква логического диска и его тип. Оставшаяся часть заполняется произвольными символами.
2 Передача информации о состоянии получения файла. Реальный размер файла, фактический размер файла, счетчик потерянных ответов Если передаваемый файл еще не существует, он создается, а тип контейнера меняется на 1. Иначе, передается сообщение, где первые 4 байта содержат реальный размер передаваемого файла, полученный в сообщении с кодом 0xC0. Следующие 4 байта хранят фактический размер файла на текущий момент. Далее – 4 байта с счетчиком потерянных сообщений от сервера. Оставшаяся часть заполняется произвольными символами.
3 Передача информации об успешном получении всего файла. Нет Перед каждым сетевым взаимодействием проверяется соответствие реального и фактического размера файла. Если они совпадают, тип контейнера меняется на 4.
4 Передача информации об успешном выполнении команды с кодом 0xCB. Нет NULL

Команды

Код Аргументы Описание
0x7F Хранится в 4-м байте. Количество минут. Ожидание в течение указанного количества минут. Передача контейнера типа 1.
0xC0 Хранится в последних трех байтах. Размер передаваемого файла. Получение размера передаваемого файла.
Передача контейнера типа 2.
0xCB NULL Переименовывает текущий исполняемый файл в
<APPDATA>\ IACIMAOQ.
Передача контейнера типа 4
0xA Во втором байте хранится номер пакета. В третьем и четвертом — пара байт передаваемого файла. Получение части файла и ее запись, передача контейнера типа 1.

Как видно из описания команд, целевое назначение троянца – выгрузка и запуск файлов.

MD5

15b36b1e3a41ad80bbd363aea8f2d704 — Trojan.Win32.Ismdoor.gen
1FD599FB9FA62EB91511002771D78104 — Backdoor.Win32.ClIEcker
1f3a2c48a7f5c2c31e71f552d74c3543 — Backdoor.Win32.Denis

Denis и его команда

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

 

Отчеты

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

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

Азиатские APT-группировки: тактики, техники и процедуры

Делимся с сообществом подходами, которые используют азиатские APT-группировки при взломе инфраструктуры, и подробной информацией о тактиках, техниках и процедурах (TTPs) злоумышленников, основанной на методологии MITRE ATT&CK.

Как поймать «Триангуляцию»

Эксперты «Лаборатории Касперского» смогли получить все этапы «Операции Триангуляция»: эксплойты нулевого дня для iOS, валидаторы, имплант TriangleDB и дополнительные модули.

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

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