SNOWLIGHT: извлечение конфигурации и C2-порта из ELF с помощью LIEF
Загрузчик SNOWLIGHT, определённый Mandiant, представляет собой компактный ELF‑исполняемый файл (ELF), написанный на C и предназначенный для получения и выполнения удалённых полезных нагрузок в системах Linux. При размере менее 10 КБ он устанавливает соединение с командно‑управляющей инфраструктурой (C2) через необработанный TCP‑сокет (TCP), при этом используемый порт варьируется между образцами. Понимание механизма извлечения конфигурации критично для обнаружения и нейтрализации этой угрозы.
Ключевые характеристики SNOWLIGHT
- Очень компактный ELF‑бинарник — меньше 10 КБ.
- Связывание с C2 по необработанному TCP-сокету; порт не фиксирован и различается между образцами.
- Динамически разрешаемые вызовы и использование GOT/PLT для сетевой настройки.
- Конфигурационные данные хранятся в разделе
.rodataи содержат маркировки, позволяющие локализовать C2‑адрес и порт.
Инструменты и методология анализа
Для автоматизации извлечения конфигурации из SNOWLIGHT аналитики используют библиотеку LIEF. Эта кроссплатформенная библиотека специально разработана для разбора и модификации исполняемых форматов (ELF, PE, MachO) и предоставляет доступ к низкоуровневым двоичным структурам — заголовкам, таблицам релокаций, экспортируемым символам и т.п. LIEF облегчает контролируемую модификацию и чтение двоичных файлов без ущерба их целостности и играет решающую роль в обратном инжиниринге.
Процесс извлечения конфигурации — пошагово
Разработка надёжного экстрактора конфигурации опирается на чётко структурированный подход. Основные этапы следующие:
- Ручной анализ нескольких образцов SNOWLIGHT для понимания формата хранения конфигурационных данных.
- Парсинг раздела
.rodataс использованием разделителя нулевого байта'x00'для получения списка строкоподобных шаблонов. - Поиск общего маркера — в анализируемых образцах встречается строка «kworker/0:2», непосредственно за которой находится значение C2.
- Определение адреса функции
main(точки входа) — LIEF предоставляет доступ к экспортируемым символам, что позволяет получить виртуальный адресmain. - Дизассемблирование байтов начиная с
mainдля анализа последовательности инструкций и выявления динамических вызовов. - Восстановление динамической компоновки через разрешение таблиц GOT и PLT, чтобы сопоставить инструкции с реальными адресами функций (например, вызовов сокетов и функций обработки строк).
- Автоматизированное сопоставление разобранных инструкций с адресами из LIEF — это позволяет восстановить жестко закодированный порт C2, даже если он определяется через динамически разрешаемые вызовы.
Технические нюансы, важные для экстрактора
При реализации средства извлечения следует учесть следующие моменты:
- Парсинг
.rodata: раздел часто содержит маркеры и последовательности байтов, разделённые'x00'. Поиск стабильных маркеров (например, «kworker/0:2») заметно ускоряет локализацию C2‑данных. - Идентификация функции
main: получение виртуального адресаmainчерез экспортируемые символы LIEF даёт отправную точку для дизассемблирования. - Разрешение GOT/PLT: для динамически связанных ELF‑файлов критично восстановить соответствие между PLT‑записями и реальными адресами библиотечных функций — это позволяет интерпретировать вызовы сетевой и строки обработки.
- Инструкция‑ориентированный анализ: сопоставление конкретных инструкций и байтовых шаблонов с разрешёнными адресами служит «якорем» (sentinel/anchor) для определения места формирования порта и адреса C2.
- Автоматизация на базе LIEF: объединение результатов парсинга LIEF с анализом инструкций делает экстрактор стабильным и масштабируемым для множества образцов.
«Общий маркер «kworker/0:2» помогает быстро локализовать C2 — значение сервера чаще всего следует непосредственно за этой меткой».
Практическое значение для защитников
Понимание описанного процесса важно для команд по реагированию на инциденты и исследований угроз, поскольку SNOWLIGHT маскирует критические параметры коммуникации через динамическое разрешение вызовов. Наличие экстрактора, умеющего корректно парсить .rodata, определять main и восстанавливать соответствия GOT/PLT, позволяет:
- Автоматически извлекать адреса и порты C2 из множества образцов.
- Создавать индикаторы компрометации (IoC) и правила детектирования на основе извлечённых строк и байтовых шаблонов.
- Ускорить процедуру ответных мер и блокирования инфраструктуры злоумышленников.
Рекомендации по инструментам и дальнейшим шагам
- Использовать LIEF в сочетании с дизассемблерами (например, IDA, Ghidra, radare2) для точного сопоставления инструкций и таблиц PLT/GOT.
- Автоматизировать парсинг
.rodataс учётом разделителя'x00'и поиска устоявшихся маркеров. - Разрабатывать тестовый набор образцов для валидации экстрактора на различных вариантах SNOWLIGHT.
- Документировать все найденные маркеры и шаблоны вызовов для обмена с сообществом и продуктами детекта.
SNOWLIGHT демонстрирует, как небольшой, но технически продуманный загрузчик может скрыть важные сетевые параметры через динамическую компоновку. Комбинация статического анализа раздела .rodata, идентификации точки входа и восстановления GOT/PLT — ключ к надёжному извлечению конфигурации и обнаружению этой угрозы.
Отчет получен из сервиса CTT Report Hub. Права на отчет принадлежат его владельцу.
Ознакомиться подробнее с отчетом можно по ссылке.



