В апреле этого года мы представили детальный разбор вредоносного ПО, использующего 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сессии;
- Отправка сообщения пакетами;
- Отправка количества переданных пакетов;
- Получение количества входящих пакетов;
- Прием входящих пакетов.
Пример сессии:
- Объявление серверу ID сессии
При каждом открытии сессии связи бот генерирует GUID и сообщает его серверу. Все дальнейшие взаимодействия сеанса идентифицируются этим GUID, который всегда записывается на место домена третьего уровня. Структура URL в данном случае имеет следующий вид:
n.n.c.<ID сессии>.<Домен сервера>.com
Положительным ответом является сообщение A67DDB8A2A17334765443253702AA3. В противном случае отправка повторяется.
- Отправка сообщения
Как уже говорилось ранее, выбранный механизм коммуникации накладывает некоторые ограничения на размер пакетов. Исходящее сообщение разбивается на пакеты длиной 60 байт и передается в виде URL:
<Исходящий пакет>.<Номер пакета>.dr.<ID сессии>. <Домен сервера>.com
В качестве ответа должно быть получено A67DDB885A3432576548A2A3707334.
- Отправка количества переданных пакетов
После успешной отправки всех пакетов передается их количество в виде запроса следующего вида:
n.<Количество пакетов>.f.<ID сессии>.<Домен сервера>.com
Стоит отметить, что нумерация пакетов начинается с 0. Ответом служит 20202020202020202020202020202020.
- Получение количества входящих пакетов
Данный шаг реализуется с помощью URL вида:
n.n.fc.<ID сессии>.<Домен сервера>.com
Ответ должен быть вида
A67D: DB8: 85A3: 4325: 7654: 8A2A :: <Количество входящих пакетов>
- Прием входящих пакетов
Запрос на получение очередного пакета выглядит так:
www. <Номер пакета>.s. <ID сессии> .<Домен сервера>.com
Входящие сообщения приходят в виде 16-байтных пакетов IPv6 .
Длинные сообщения
В данном случае взаимодействие с сервером можно разбить на следующие шаги:
- Передача количества пакетов, на которые был разбит файл;
- Отправка файла;
- Периодический опрос сервера на предмет утерянных пакетов;
- Повторная отправка утерянных пакетов.
ID сессии берется из запроса, в котором этот файл был затребован.
- Передача количества пакетов
Запрос: n.<Количество пакетов>.<ID сессии>.<Домен сервера>.com
Ответ: A67DDB8A2A17334765443253702AA3.
- Отправка файла пакетами
Запрос: <Исходящий пакет>.<Номер пакета>.d.<ID сессии>.<Домен сервера>.com
Ответ: на данное сообщение сервер отвечать не будет или ответит ошибкой Server failure.
- Периодический опрос сервера на предмет утерянных пакетов
Периодически бот опрашивает сервер:
uff<Количество пакетов>.<Количество пакетов>.<Домен сервера>.com
Ответ: 20202020202020202020202020202020
Далее реализуются пункты «Получение количества входящих пакетов» и «Прием входящих пакетов» из предыдущего раздела.
В ответе указываются через запятую номера пакетов, которые сервер не получил.
- Повторная отправка утерянных пакетов
Запрос: <Исходящий пакет>.<Номер пакета>.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, однако, как было рассказано в одной из предыдущих статей, троянцы данной группы обычно используют для этих целей виртуальный рабочий стол.
В качестве инициирующего запроса передается ряд параметров с информацией о системе, а также уникальный ключ 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 и его команда