Модная тема
Фреймворки постэксплуатации становятся все популярнее среди злоумышленников. Это удобный инструмент для контроля зараженных машин и горизонтального перемещения внутри сети. Фреймворки помогают атакующему собрать карту сети и связи между хостами в одном интерфейсе, из которого и управляются.
В этой сфере есть своя мода и тренды: число хакерских фреймворков постоянно растет. Кроме того, в открытый доступ периодически попадают взломанные версии инструментов. Так, в 2021–2022 годах в интернете появились бесплатные релизы платформ Cobalt Strike и Brute Ratel C4. В результате их популярность резко выросла: последние исследования говорят о тысячах серверов Cobalt Strike, в честь решения называют целые группировки, а огромные корпорации борются с кейсами злоупотребления инструментом.
Какие вызовы несут хакерские фреймворки для систем защиты и специалистов по ИБ? Зачастую в этих инструментах есть богатый арсенал для обхода хостовых средств защиты (в основном для противостояния антивирусам и EDR-решениям). Все фреймворки используют сеть, чтобы получать команды и устанавливать связи с управляющими серверами. При этом так называемые биконы (beacons) Cobalt Strike умеют общаться с управляющим сервером и без доступа в интернет. Они просто передают свои данные по протоколу SMB или TCP по цепочке таких же биконов, пока те не выйдут «наружу». Соединение же с самим управляющим сервером может идти более привычным образом — по HTTP или HTTPS, нередко мимикрируя под загрузку библиотеки jQuery или общение с удостоверяющими центрами. Другие фреймворки, напротив, могут «притворяться» обычными сайтами: на HTML-страницы периодически отправляются «отстуки», а результаты их выполнения выглядят как POST-запросы на PHP-скрипты. Более того, искушенным пользователям этих инструментов предлагаются классические DNS-тоннели.
«Отстук» — периодический запрос на управляющий сервер. Его главная цель — дать понять, что бикон все еще «жив», и запросить новые команды.
Многообразие сетевых протоколов и способов маскировки помогает злоумышленникам в обходе привычных средств сетевой защиты. Но о решениях класса network traffic analysis (NTA), к которым относится наш PT Network Attack Discovery, хакеры пока знают не так много.
Пара слов о PT Network Attack Discovery
PT NAD — это средство анализа сетевого трафика. Продукт не только исследует общую фактуру сети, но и определяет все стадии атак на инфраструктуру. Схема работы проста: вы передаете в систему копию сетевого трафика (по принципу «чем больше, тем лучше»), и PT NAD выявляет в нем вредоносные программы, слабые пароли, следы атак и всевозможные активности злоумышленников.
Cobalt Strike
Главным фигурантом в наших делах по детекту Cobalt Strike станут метаданные, которые бикон отправляет с каждым «отстуком». Иногда «отстуки» заканчиваются для бикона новыми командами, выполнение которых требует еще нескольких запросов. При этом в каждом сетевом запросе от него передаются метаданные — 128 шифрованных байт. Они имеют высокую энтропию, содержат разные идентификаторы и информацию о самом биконе.
Время между «отстуками» строго фиксируется и задается в Malleable C2 config — конфиг-файле, с которым запускается управляющий Team Server (C2). Этот файл содержит все параметры Cobalt Strike. Отметим, что задержка может случайным образом меняться в заданном диапазоне, например 60 ± 5% секунд.
Самый популярный транспорт для биконов — HTTP-протоколы. У них больше всего настраиваемых параметров: это заголовки, метод, «мусорные» данные (обычные строки, которые можно добавить до или после метаданных для маскировки) и другие. Метаданные, кстати, передаются не в открытом виде, а кодируются в разные формы. Авторы фреймворка хорошо постарались: кодировок действительно много, и они могут быть рекурсивно вложены друг в друга (при этом размер метаданных будет кратно расти). Например, метаданные сначала могут быть поксорены» с четырьмя случайными байтами, затем закодированы в Base64 и потом — в NetBIOS.
Где могут передаваться метаданные? Везде: внутри HTTP-заголовков, в теле POST-запросов и даже в URL. В последнем случае, если данные будут ксориться со случайным ключом, URL будет постоянно меняться, сохраняя при этом первоначальную длину. В любой другой ситуации URL, напротив, случайным образом выбирается из имеющихся в конфиге, что также затрудняет обнаружение злоумышленников.
Я уже говорил, что Cobalt Strike маскируется под легитимные запросы? Для этого перед метаданными и после них можно добавлять «мусорные» строки. Например, сами метаданные могут отправляться в Base64 под видом JWT-токена в HTTP-куки, будучи обрамленными необходимыми конструкциями. Каждый автор волен сам придумывать способ маскировки, поэтому на GitHub можно найти сотни разных Malleable-конфигов.
Готов поспорить, вы уже устали от перечисления возможностей Cobalt Strike. Это неудивительно: он гибкий и имеет огромный потенциал для маскировки, поэтому обнаружение инструмента было для нас довольно нетривиальной задачей. Главным образом в детектировании помогает то, что метаданные передаются в каждом HTTP-запросе. Зная, как они выглядят и в какие рекурсивные формы кодируются, можно научить средство защиты копить HTTP-запросы, пока среди них не начнет прослеживаться некая периодичность, а затем определять, какое именно поле хранит метаданные. Опять же, расположение полей строго фиксируется в конфиг-файле и не меняется, что тоже играет нам на руку. Все перечисленное плюс проверка энтропии байтов метаданных и составляет алгоритм детекта активности Cobalt Strike в PT NAD. Конечно, в настоящем трафике достаточно много периодических HTTP-запросов с подходящей структурой, но мы смогли довести алгоритм до минимального количества ложных срабатываний.
Описание Cobalt Strike будет неполным без упоминания способов горизонтального перемещения фреймворка по сети. В арсенале инструмента — средства для создания сервисов на удаленной машине по протоколу SMB и SSH-сессии на Linux. Такие кейсы хорошо изучены и покрыты нашими детектами, в этой статье мы разберем особенности взаимодействия биконов Cobalt Strike по другим протоколам. Конечно, можно распространить на другие хосты и привычные биконы HTTP и HTTPS, но для машин без доступа в интернет есть только две узкоспециализированные опции — протоколы SMB и TCP. Они действуют схожим образом: это либо bind (reverse) TCP-соединение, либо SMB-пайпы (pipes). Причем появление необычного пайпа также бросается в глаза PT NAD.
После успешного захвата хоста и установки соединения (подключения к пайпу) бикон первым делом передает метаданные. Их размер — 132 байта, что соответствует XOR-шифрованию со случайным ключом, который отправляется в первых четырех байтах.
С протоколом TCP мы наблюдаем ту же картину: 132 байта со сведениями о биконе в начале соединения. В обоих случаях метаданные предваряются полями их длины (длина составляет 4 байта), которые отправляются отдельными пакетами. Для метаданных она будет равняться 0x84 0x00 0x00 0x00 в шестнадцатеричной системе. А раз для SMB- и TCP-биконов метаданные передаются только в начале, все последующие разы хосты будут обмениваться только полями длиной по 4 нулевых байта.
Мы проанализировали трафик Cobalt Strike в лабораторных условиях методом черного ящика и можем сказать, что гибкость фреймворка поражает. При компиляции биконов на командном сервере в их коде буквально компилируется алгоритм по извлечению метаданных (как они описаны в Malleable-конфиге). Все это дает злоумышленникам огромный простор для маскировки запросов. Сетевые средства обнаружения, как правило, находятся в позиции догоняющих, ведь они могут обнаруживать только уже известные конфигурации. Тем не менее механизмы детекта в PT NAD способны находить и новые, еще неизвестные образцы фреймворка. Благодаря чему это возможно? Время между «отстуками» меняется несильно. Кроме того, метаданные:
- передаются в каждом «отстуке» бикона;
- хранятся в одном и том же месте (HTTP-заголовок или тело запроса);
- отправляются в одной и той же кодировке;
- имеют одинаковый размер.
Почему же авторы Cobalt Strike не зададут метаданным случайную длину, не добавят кодировку или не сделают время между «отстуками» максимально непредсказуемым? Причин может быть несколько:
- Сложность кодовой базы. Научить бикон и управляющий сервер хранить метаданные в разных частях запроса — довольно сложная задача.
- Случайная длина упростит процесс обнаружения. После того как метаданные будут зашифрованы, поле со значением их длины должно где-то храниться.
- Случайное время между «отстуками» сделает поведение биконов непредсказуемым. Как в таком случае понять, удалил ли антивирус процесс на узле или бикон просто выжидает дольше обычного? Злоумышленники тоже ценят удобство.
- Необходимость бороться с хостовыми детектами, которые традиционно занимают первое место по эффективности обнаружения.
Подтвердить или опровергнуть эти гипотезы нам поможет следующий фреймворк постэксплуатации — Brute Ratel C4 (BRc4).
Brute Ratel C4
Авторы BRc4 на своем сайте заявляют: «Badger doesn’t care. It takes what it wants!»
У BRc4 и Cobalt Strike схожие функции, но есть и ряд различий. Например, исполняемые файлы BRc4 называются не биконами, а «барсуками» (badgers). У «барсуков» те же транспорты: HTTP(S) и SMB (или TCP), а для искушенных пользователей также существуют способы коммуникации через DNS-тоннели (но во взломанной версии 1.2.2 эта возможность отсутствует). Создатели BRc4 сделали упор на обход хостовых детектов, поэтому инструмент считался не обнаруживаемым на узлах и по-настоящему опасным. Мы думаем иначе.
С точки зрения работы в сети между Brute Ratel 4 и Cobalt Strike есть несколько различий:
- Метаданные передаются не в любом HTTP-заголовке, а строго в теле запроса.
- Данные тоже зашифрованы, но кодируются только в Base64.
- Вся информация отправляется при помощи HTTP-запросов методом POST.
Получается, что гибкости для обхода сетевых детектов у BRc4 даже меньше. Строгие правила передачи метаданных по HTTP делают его еще более легкой целью для наших алгоритмов детектирования. Схема проста:
- Собрать побольше запросов HTTP POST.
- Убедиться, что у них одинаковые заголовки.
- Проверить, что тела запросов тоже совпадают.
- Подсчитать среднее время между запросами и убедиться в регулярности «отстуков».
Что касается общения между «барсуками» по протоколу TCP или SMB, взаимодействие максимально просто. Обмен данными через SMB-пайп или TCP-соединение осуществляется напрямую, ведь спрятать что-либо в них действительно сложно.
В SMB-трафике видно, как «барсук» отправляет метаданные в куске Base64-данных длиной 108 байт (см. рис. 7). После декодирования они превратятся в 80 шифрованных байт, что соразмерно с данными Cobalt Strike во время «отстука». В TCP-сообщениях данные будут иметь длину 110 байт за счет дополнительных символов \r\n в конце каждого сообщения.
Другие платформы
Cobalt Strike разрабатывается более десяти лет, у него уже есть устоявшаяся аудитория. Brute Ratel C4 же появился в конце 2020 года и стал набирать популярность после выхода взломанной версии в 2022-м. Кроме того, злоумышленники продолжают активно искать аналоги привычным инструментам, которые постепенно обрастают детектами. Так, в последнее время все чаще мелькают новые названия: фреймворки Sliver и Havoc (это подтверждает наша команда расследования инцидентов). Функциональность платформ не особенно отличается, а интерфейс Havoc и вовсе напоминает Cobalt Strike. Тем не менее специалисты по ИБ могут быть не готовы к атакам с использованием этих инструментов.
Противодействие
Мы отслеживаем тренды развития хакерских инструментов и постоянно совершенствуем детекты, используемые в PT NAD. С технической точки зрения способы общения Cobalt Strike и Brute Ratel 4 по протоколу HTTP представляют огромный интерес, поскольку они очень вариативны и могут мимикрировать под легитимный трафик. Мы хотели показать вам, к каким мерам порой прибегают злоумышленники, чтобы специалист SOC не смог найти иголку — вредоносный запрос — в стоге легитимного трафика. Но в любом, даже самом хитром протоколе должны быть пригодные для детекта артефакты. Мы реализовали описанную выше логику детектирования в отдельных модулях PT NAD: они отлично справляются со своими задачами и присутствуют в новой версии продукта — 11.1. А для обнаружения других протоколов хорошо подходят правила без сложной логики. Например, первый DNS-запрос Sliver начинается с символов baakb, а DNS-запросы Cobalt Strike часто содержат суффикс «.180.».
И вишенка на торте. Мы пишем детектирующие правила для всех видов коммуникации вредоносных программ. Некоторые из них удивляют (см. рис. 10).
Анализ сетевого трафика очень результативен при обнаружении активности инструментария злоумышленников. На это есть несколько причин. Первая достаточно банальна: за инфраструктурой очень сложно уследить. В крупных организациях новые рабочие станции и серверы могут появляться ежедневно. В какой-то момент ибэшники сталкиваются с неизвестным им устройством, на котором должным образом не настроены ни журналирование, ни агентское средство защиты (антивирус или EDR-система). С сетью такой проблемы нет. Если анализируется копия трафика, новое устройство не останется без внимания.
Вторая причина заключается в ресурсах злоумышленников. Результаты наших проектов по анализу защищенности показывают, что скрыть вредоносное ПО от средств антивирусной защиты не составляет особого труда. Злоумышленники могут как сами адаптировать свои инструменты, так и пользоваться сторонними решениями. Существует большое количество техник для обхода антивирусов, а на черном рынке можно найти готовый упаковщик, который поможет скрыть программу от проверок на конечном устройстве.
Чтобы спрятать сетевую активность, потребуется не только адаптация клиентской части вредоносного ПО, но и изменение самого управляющего сервера, так как придется пересмотреть формат взаимодействия между ними. Для злоумышленника это дополнительные временные затраты и расходы на разработку. Вот почему мало кто может позволить себе так кардинально менять инструментарий между атаками, а анализ трафика показывает высокую эффективность.