Исчезнувшие конфиденциальные данные трудно обнаружить, анализируя сетевой трафик в режиме реального времени, если злоумышленники предварительно закодировали их в base64. Как правило, невозможно определить и декодировать все возможные последовательности base64 из сетевого трафика, если кодировка не указана в контексте протокола. Это затрудняет механизмы прямого обнаружения, такие как совпадение ключевых слов. Однако при кодировании base64 любая возможная строка может выглядеть как одно из трех уникальных кодированных смещений, что обусловлено природой 6-битного алфавита base64. Используя эти три смещения и сигнатуру YARA с помощью Fidelis Elevate Network, можно найти закодированные данные в сетевом трафике без предварительного декодирования всех возможных блоков в кодировке base64.
Кодирование и декодирование Base64
Base64 – это схема двоично-десятичного кодирования, в которой последовательности из 24 бит могут быть представлены четырьмя 6-битными цифрами Base64. Каждая 6-битная цифра затем представляется набором из 64 уникальных 7-битных символов ASCII из заранее определенного алфавита.
Стандартный алфавит Base64 определен в RFC 4648, хотя могут использоваться и альтернативные алфавиты.

Рисунок 1: Алфавит Base64, определенный в RFC 4648 (источник: Википедия) [3].
В дополнение к 64 возможным символам в конец закодированных последовательностей можно добавить один или два символа подстановки, если общее количество нерасшифрованных битов не кратно 6. Например, буква ‘A’ (hex: x41, binary: 0100 0001) не разбивается равномерно на кратные 6, но ее можно сделать таковой, добавив пару из двух 0-битов. Последовательность становится 010000 01(00)(00), всего 12 бит, что делится на 6. Две 6-битные цифры кодируются с помощью стандартного алфавита base64 в ‘QQ’. Дополнительная пара из 2 битов прокладки представляется добавлением двух символов прокладки, и в итоге получается ‘QQ==’.
Когда кодировка меняется на противоположную, символы подстановки удаляются вместе с дополнительной парой 2-битов. В этом примере QQ== (010000 010000) превращается в 01000001 или ‘A’. Если для того, чтобы общее количество битов было кратно 6, требуется только два дополнительных 0-бита, то к закодированной последовательности добавляется только один символ подстановки, а при обратном кодировании удаляются только два 0-бита.
Киберугрозы, использующие шифрование Base64
Злоумышленники часто используют base64 для кодирования командно-административной связи, а также для утечки данных, используя как стандартный алфавит, так и нестандартные алфавиты. Например, нестандартный алфавит может быть похож на стандартный, но символы «+» и «/» могут быть заменены на символы «-» и «_» соответственно, а в качестве символа подстановки может использоваться «.».
Блоки Base64 трудно распознать в больших объемах сетевого трафика из-за разнообразия всех возможных кодировок. Данные в кодировке Base64 могут содержать столько символов A-Z, a-z, 0-9, сколько необходимо, а также могут содержать или не содержать никаких символов +, / или символов подстановки. Кроме того, обычно невозможно попробовать декодирование Base64 в реальном времени для всего трафика, чтобы попытаться найти утечку конфиденциальных данных, если только кодировка base64 не указана в контексте передающего протокола, например SMTP.
Кроме того, ключевые слова, такие как пути, имена файлов, учетные записи пользователей, ключи реестра или любую другую конфиденциальную информацию — трудно найти в последовательности, закодированной в base64, даже если она может быть распознана, без предварительной попытки обратного декодирования.
Например, когда ключевое слово «password» закодировано в base64, оно кодируется как «cGFzc3dvcmQ=». Однако, когда оно окружено другими символами, кодировка существенно меняется. Строка «QpasswordQ» кодируется как «UXBhc3N3b3JkUQ==», что совсем не похоже на самостоятельную кодировку. Хуже того, «QQpasswordQQ» превращается в «UVFwYXNzd29yZFFR», что представляет собой совершенно другой набор символов.
Поиск ключевых слов в блоках, закодированных в Base64
Можно ли найти закодированное ключевое слово без предварительного обнаружения и декодирования Base64? Если снова рассмотреть пример с ключевым словом «password», то «QQQpasswordQQQ» превращается в «UVFRcGFzc3dvcmRRUVE=», что выглядит очень похоже на отдельную кодировку «cGFzc3dvcmQ=», хотя «Q=» больше нет, а закодированная последовательность начинается по-другому. «QQQQpasswordQQQQQ» становится «UVFRUXBhc3N3b3JkUVFRUQ==», что похоже на вторую кодировку «QpasswordQ», хотя опять же с некоторыми отличиями в начале и конце.
Если продолжать в том же духе, добавляя и добавляя к ключевому слову все новые и новые символы, то окажется, что существует всего три возможных варианта кодировки слова «пароль», хотя и с некоторыми различиями в начале и конце кодировки. Это справедливо для любой кодированной строки, за исключением одиночных символов.
Для строки «password» три возможных смещения, которые будут содержаться в любой возможной base64-кодировке этой строки, независимо от того, какие символы добавлены или добавлены к строке, это: «cGFzc3dvcm», «Bhc3N3b3Jk» и «wYXNzd29yZ». Теперь, чтобы найти строку «password» в любом наборе случайных данных, достаточно найти одно из этих трех смещений. Чем длиннее искомые данные или ключевое слово, тем больше уверенности в том, что они были найдены в блоке base64 при совпадении одной из трех возможных кодированных последовательностей.
Например, следующий блок в кодировке base64 содержит ключевое слово «password», на что указывает наличие смещения «cGFzc3dvcm»:
V2h5IGRpZCB0aGUgcGFzc3dvcmQgdGFrZSB1
cCBnYXJkZW5pbmc/IEl0IGhlYXJkIHRoYXQncyB
0aGUgYmVzdCB3YXkgdG8gY3VsdGl2YXRlIHN0cm9uZyByb290cyE
Обнаружение с использованием смещения Base64
Инструмент CyberChef [2] (https://gchq.github.io/CyberChef) содержит операцию «Show Base64 offsets», которая вычисляет эти три возможные кодированные строки. Чтобы использовать ее, перетащите операцию в Recipe и введите искомое ключевое слово.

Рисунок 2: Операция Show Base64 offsets в CyberChef.
Эта операция даже принимает различные алфавиты, хотя это необходимо знать перед предварительным вычислением смещений для данного ключевого слова.
На рисунке 3 показан захват пакетов HTTP POST файла JPEG с базовыми блоками данных в кодировке Base64 после маркера конца изображения (0xFF 0xD9) [1]. В этих данных также присутствуют некодированные заголовки, такие как os, processes, hdd, build, network, cmd_id, которые указывают на то, что внутри кодированных блоков содержатся данные системного профиля.

Рисунок 3. Исчезновение закодированных данных после маркера конца изображения в файле JPEG

Рисунок 4: Данные появляются в этом JPEG-файле после маркера конца изображения (0xFF 0xD9)
Используя CyberChef для декодирования самого большого закодированного блока, мы видим, что он представляет собой закодированный список исполняемых файлов. Учитывая, что блок появляется после заголовка «процессы», можно предположить, что это список процессов, запущенных в зараженной системе.

Рисунок 5: Декодирование блока в кодировке base64 с помощью CyberChef
Используя смещения Base64, можно легко обнаружить список процессов, запущенных на зараженной системе в кодировке base64. Чтобы обнаружить закодированный список процессов, ищите несколько экземпляров смещения для строки «.exe», за которой следует символ новой строки (0x0A). В YARA реализован модификатор base64 для совпадений строк, который делает это автоматически [4], как показано на рисунке 6:

Рисунок 6: Нахождение нескольких закодированных экземпляров строки «.exe\n» в файле.
Опасения по поводу ложных срабатываний минимизируются требованием, чтобы эти конкретные кодированные смещения, хотя и состоящие всего из 6 символов каждое, встречались не менее 25 раз в файле размером не более 500 КБ. Эти смещения достаточно случайны, поэтому вряд ли удастся найти такое количество повторений в одном закодированном контексте, если только они не находятся там намеренно. Если же они встречаются, есть все основания полагать, что это аномальная активность и ее следует расследовать. Кроме того, ограничение совпадений на основе максимального размера файла является лучшей практикой, поскольку в потоковом контенте такие смещения могут происходить случайно.
Кроме того, Fidelis Network декодирует и идентифицирует все файлы по всем протоколам и портам. Эта логика обнаружения может быть использована в отпечатке содержимого YARA, определяющем тип файла JPEG. С помощью этого правила Fidelis проверит все jpeg-файлы на наличие любого из смещений base64 и предупредит, если они появятся более 25 раз в одном файле.

Рисунок 7: Сетевой YARA-отпечаток Fidelis для поиска смещений в формате jpeg в кодировке base64
Цитаты:
1. ^Title. (2023) Метаданные в файлах JPEG — Exiv2. Retrieved November 21, 2023, from https://dev.exiv2.org/projects/exiv2/wiki/The_Metadata_in_JPEG_files .
2. ^Выбор имени. (2023) CyberChef. Retrieved November 21, 2023, from https://gchq.github.io/CyberChef/.
3. ^Base64 — Википедия. (2023) Retrieved November 21, 2023, from https://en.wikipedia.org/wiki/Base64.
4. ^Запись правил YARA — документация yara 4.4.0. Retrieved November 22, 2023, from https://yara.readthedocs.io/en/stable/writingrules.html#base6
Источник: Securing Networks: Real-Time Base64 Keyword Detection