Главная / Блог / Стеганография в CTF: пошаговый разбор поиска скрытых данных в изображениях и аудио

14 мин.00

Стеганография в CTF: пошаговый разбор поиска скрытых данных в изображениях и аудио

Стеганография в CTF: пошаговый разбор поиска скрытых данных в изображениях и аудио

Стеганография в CTF: пошаговый разбор поиска скрытых данных в изображениях и аудио

За последние полтора года через мои руки прошли сотни стего-задач — picoCTF, HackTheBox, командные турниры. Закономерность одна: кто знает правильный порядок проверок, тратит на задачу пять минут; кто перебирает инструменты наугад — час. Разница не в знании экзотических утилит, а в системе. Ниже — алгоритм, отработанный на реальных forensics CTF заданиях: от первого запуска file до побитового разбора в stegsolve и расшифровки спектрограмм аудио.

Первые 60 секунд: быстрая разведка файла

Любой стего-таск на CTF начинается не со специализированных инструментов, а с трёх базовых команд. Они отсеивают простейшие случаи и задают направление.

file — определение реального формата. Расширение на CTF врёт постоянно. Файл flag.txt оказывается PNG-изображением, photo.jpg — ZIP-архивом. Команда file challenge_file читает magic bytes — сигнатурные байты в заголовке — и определяет формат независимо от расширения. Если file показывает тип, не совпадающий с расширением, — первая зацепка. По CTF Field Guide от Trail of Bits, file использует библиотеку libmagic для эвристического определения формата, но его можно обмануть специально подготовленными заголовками. Для более точной идентификации есть TrID — утилита с расширенной базой форматов и процентами уверенности.

strings — поиск текстовых строк в бинарных файлах. Команда strings -n 8 challenge_file выводит все последовательности печатных символов длиной от 8 байт. Нередко флаг валяется в файле открытым текстом, среди бинарного мусора. Комбинация strings challenge_file | grep -i flag — первое, что стоит попробовать. Если формат флага известен (например, CTF{...} или flag{...}), более точная фильтрация через grep -oE '[A-Za-z0-9_]+\{[^}]+\}' отсечёт ложные срабатывания.

xxd или hexdump — визуальный осмотр hex-дампа. Просмотр первых и последних байтов файла помогает заметить аномалии: текст после маркера конца файла, подозрительные повторяющиеся паттерны, нестандартные заголовки. Команда xxd challenge_file | head -20 покажет начало, а xxd challenge_file | tail -20 — хвост, куда часто дописывают данные. Если после маркера IEND в PNG видны осмысленные байты — там спрятано сообщение или вложенный файл. Для полноценного редактирования hex-данных на Linux — hexedit (CLI) или GHex (GUI), на Windows — HxD или 010 Editor.

Если три базовых шага ничего не дали — переходим к метаданным.

Exiftool: анализ метаданных как первый источник подсказок

Exiftool — утилита для чтения, записи и редактирования метаданных файлов практически любого формата. В стеганографии в изображениях метаданные — один из самых простых, но регулярно используемых на CTF способов спрятать флаг. И удивительно, как часто он срабатывает.

Запуск exiftool challenge.jpg выводит все метаданные файла: EXIF-теги камеры, GPS-координаты, временные метки, авторские поля, комментарии. Флаг чаще всего прячется в полях Comment, Artist, Copyright, Description или UserComment. Иногда данные закодированы в Base64 — значение поля выглядит как случайная строка вида ZmxhZ3..., которую нужно декодировать через echo "ZmxhZ3..." | base64 -d.

Точечное извлечение: exiftool -Comment challenge.png покажет только поле Comment без лишнего вывода. Удобно, когда метаданных десятки и листать глазами весь список лень. Поиск по всем полям через exiftool challenge.png | grep -i "flag\|secret\|hidden\|key" сужает область до подозрительных тегов.

GPS-координаты в EXIF — частая основа для OSINT-задач на стыке стеганографии и разведки. Exiftool выводит координаты в формате градусов, минут и секунд — вставляете в Google Maps и определяете локацию. Если в задаче фигурирует фотография «с места событий» — GPS-теги почти наверняка содержат подсказку.

Exiftool работает далеко не только с изображениями. Утилита читает метаданные из PDF, DOCX, MP3, MP4, WAV и десятков других форматов. В аудиофайлах ID3-теги иногда содержат скрытые строки с флагом — проверяйте обязательно.

Предусловия и ограничения: exiftool работает исключительно с метаданными — структурированной информацией о файле. Если данные спрятаны в пикселях (LSB-стеганография), в теле аудио или внутри вложенного архива — exiftool их не увидит. Это разведка, а не решение стего-задачи целиком. И ещё момент: версии exiftool периодически обновляются — лучше ставить актуальную из репозитория, а не предустановленную в дистрибутиве (там иногда годичной давности).

Binwalk: извлечение встроенных файлов из изображений

Binwalk — один из главных инструментов для CTF forensics. Утилита сканирует бинарный образ, ищет сигнатуры известных форматов (magic bytes) и выводит их смещения. Термин «file carving» — вырезание файлов из бинарного потока — описывает именно то, что делает binwalk.

Запуск binwalk challenge.png без ключей выводит таблицу найденных сигнатур. Типичный вывод для PNG со скрытым ZIP-архивом:

DECIMAL       HEXADECIMAL     DESCRIPTION
0             0x0             PNG image, 800 x 600, 8-bit/color RGBA
91245         0x1644D         Zip archive data, at least v2.0 to extract
91312         0x16490         End of Zip archive

Binwalk нашёл ZIP-архив со смещения 91245 байт. Для автоматического извлечения — binwalk -e challenge.png. Утилита создаст директорию _challenge.png.extracted со всеми находками. Когда автоматика не справилась, вырезаем руками через dd: команда dd if=challenge.png of=extracted.zip bs=1 skip=91245 достанет данные от найденного смещения до конца файла.

Энтропийный анализ — менее известная, но полезная штука. Команда binwalk -E challenge.png строит график энтропии файла. Участки с высокой энтропией (близкой к 1.0) указывают на сжатые или зашифрованные данные. Если в конце «обычного» изображения энтропия резко подскакивает — там спрятан архив или зашифрованный блок. Я пару раз находил так данные, которые обычный поиск сигнатур пропускал.

Предусловия и ограничения: binwalk ищет только известные сигнатуры из своей базы. Зашифрованные данные, raw data без заголовков и нестандартные форматы он пропустит. Бывают и ложноположительные срабатывания: утилита проверяет только стартовые сигнатуры и может принять случайное совпадение байтов за реальный файл. Всегда проверяйте извлечённое вручную — открывается ли «найденный» архив, валидна ли «найденная» картинка. На форуме Codeby эту особенность отмечают как частый источник ложных следов при решении тасков.

Stegsolve: побитовый анализ и LSB-стеганография в изображениях

Stegsolve — Java-приложение для визуального анализа изображений по цветовым каналам и битовым плоскостям. Основной инструмент для поиска скрытых данных в файлах, защищённых LSB-стеганографией — методом, при котором информация записывается в младшие биты пикселей.

Как работает LSB-стеганография. Каждый пиксель хранит значения RGB по 8 бит на канал. Изменение младшего бита (bit 0) сдвигает значение цвета максимум на единицу из 256 — разница неразличима для глаза. Записав в младшие биты тысяч пикселей по одному биту полезной информации, получаем скрытое сообщение, которое визуально не обнаружить. По CTF Field Guide от Trail of Bits, LSB — один из самых распространённых методов стеганографии в CTF-задачах: прост в реализации и не меняет внешний вид изображения.

Стеганография — не только CTF-развлечение. В MITRE ATT&CK она описана как техника T1027.003 (Steganography, тактика stealth) для сокрытия вредоносных нагрузок в медиафайлах и T1001.002 (Steganography, тактика command-and-control) для маскировки C2-трафика. Реальные APT-группировки используют PNG и JPEG для доставки шеллкода через легитимные хостинги изображений — те же принципы, которые отрабатываются на стего-тасках.

После запуска через java -jar stegsolve.jar и загрузки изображения стрелки внизу окна переключают представления: Red plane 0, Green plane 0, Blue plane 0, Alpha plane 0 и далее по битовым плоскостям. Plane 0 — младший бит канала. Если на одной из плоскостей видна не шумовая текстура, а чёткий паттерн — текст, QR-код, контуры скрытого изображения — значит, здесь записаны данные методом стеганографии в изображениях.

Data Extract (меню Analyse → Data Extract) — то, ради чего stegsolve и нужен. Выбираете битовые плоскости (обычно bit 0 каждого канала), порядок обхода пикселей (Row или Column) и порядок каналов (RGB, BGR и другие варианты). Stegsolve собирает выбранные биты в последовательность и показывает результат. Если параметры верные — увидите ASCII-текст с флагом или бинарный файл.

Image Combiner — режим для задач, где дают оригинал и модифицированную версию. XOR двух картинок высвечивает только изменённые пиксели — и в этих изменениях скрыто сообщение. Stereogram Solver работает по тому же принципу, но с одной картинкой, сдвигая слои относительно друг друга.

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

from PIL import Image
img = Image.open('challenge.png')
w, h = img.size
bits = ""
for y in range(h):
    for x in range(w):
        r, g, b = img.getpixel((x, y))[:3]
        bits += str(r & 1)
msg = "".join(chr(int(bits[i:i+8], 2)) for i in range(0, len(bits), 8))
print(msg[:200])

Скрипт читает младший бит красного канала каждого пикселя, собирает биты в байты и выводит результат как текст. В реальном таске может потребоваться сменить канал на Green или Blue, перейти на колоночный обход (поменять циклы x и y местами) или использовать не 0-й, а 1-й или 2-й бит. Варианты подбираются экспериментально, но базовая структура скрипта остаётся той же.

Предусловия и ограничения: stegsolve хорош для растровых форматов — PNG, BMP, GIF. Для JPEG он практически бесполезен: lossy-сжатие уничтожает LSB-данные при каждом сохранении. Я видел, как команды на турнирах первым делом открывали stegsolve на JPEG-файле и теряли 20 минут впустую. Для JPEG — другие инструменты (о них ниже). Для запуска нужна установленная Java (JRE или JDK).

Steghide, zsteg и stegseek: инструменты извлечения скрытых данных

Steghide

Steghide — утилита командной строки для встраивания и извлечения данных из JPEG, BMP, WAV и AU. В CTF обычно нужна функция извлечения: steghide extract -sf challenge.jpg. Если данные защищены паролем, утилита запросит passphrase. Пустой пароль (просто Enter) — частый случай в задачах уровня easy. Банально, но работает чаще, чем хотелось бы.

Команда steghide info challenge.jpg показывает, содержит ли файл встроенные данные: размер скрытого файла и применённый алгоритм шифрования. Это позволяет решить заранее — стоит ли тратить время на подбор пароля или перейти к другим инструментам.

Предусловия и ограничения: steghide поддерживает только JPEG, BMP, WAV и AU. PNG не поддерживается — для PNG используйте zsteg или stegsolve. Steghide чувствителен к модификациям файла: если изображение было пережато или отредактировано после встраивания, извлечение может не сработать. GIF и современные аудиокодеки (MP3, FLAC) — мимо.

Zsteg

Zsteg — Ruby-утилита для автоматической детекции LSB-стеганографии в PNG и BMP. В отличие от stegsolve, который требует ручного переключения плоскостей, zsteg сам перебирает комбинации каналов, битовых плоскостей и порядков обхода пикселей. По сути — автопилот для LSB.

Запуск zsteg challenge.png выводит все обнаруженные строки. Среди десятков результатов ищите осмысленный текст, URL-адреса или паттерн флага. Режим zsteg -a challenge.png включает расширенный перебор всех комбинаций — дольше, но находит больше.

Zsteg регулярно обнаруживает данные, которые stegsolve пропускает. Особенно это касается нестандартных порядков каналов (BGR вместо RGB), колоночного обхода и нетипичных битовых плоскостей. В русскоязычных CTF-гайдах zsteg почти не упоминается, хотя это один из самых результативных инструментов для стеганографии в PNG-файлах. Недооценённый зверь.

Stegseek

Stegseek — брутфорсер паролей steghide. Когда steghide info подтвердил наличие скрытых данных с парольной защитой, stegseek перебирает пароли из словаря за секунды. Запуск: stegseek challenge.jpg rockyou.txt. Инструмент оптимизирован для скорости и закрывает CTF-задачи на steghide-извлечение данных, где ручной перебор через steghide extract с разными паролями занял бы часы.

Анализ аудио стеганография: спектрограммы и скрытые частоты

Аудио-стеганография — отдельная ветка forensics CTF заданий, требующая других инструментов. Два основных вектора: визуализация спектрограммы и извлечение данных из сэмплов.

Спектрограмма — визуальное представление частот звука во времени. Авторы CTF-задач рисуют текст, QR-код или изображение прямо в частотном спектре: на слух файл звучит как шум или обычная музыка, но при визуализации виден скрытый текст. Приём используется в задачах средней сложности и разгадывается за минуту — если знать, куда смотреть.

Sonic Visualiser — приложение для детального анализа аудиофайлов. После загрузки файла добавьте слой спектрограммы: Layer → Add Spectrogram. Экспериментируйте с частотным диапазоном — расширьте до 20-22 кГц, потому что сообщения часто прячут на ультразвуковых частотах, которые человек не слышит. Размер окна FFT и оконная функция тоже влияют: скрытое сообщение может быть видно только при определённых настройках. Sonic Visualiser даёт более тонкий контроль над параметрами отображения, чем Audacity, и для сложных тасков я предпочитаю именно его.

Audacity — более известный аудиоредактор, который тоже умеет показывать спектрограмму. Переключите отображение дорожки через выпадающее меню слева: Waveform → Spectrogram. Настройки доступны в Edit → Preferences → Spectrograms. Для быстрого осмотра Audacity удобнее (есть в каждом дистрибутиве Linux), для детального анализа — Sonic Visualiser.

LSB в аудио. WAV-файлы хранят звук как последовательность числовых значений — сэмплов. Младшие биты каждого сэмпла можно использовать для LSB-стеганографии точно так же, как в изображениях. Steghide поддерживает WAV для steghide-извлечения данных: steghide extract -sf challenge.wav. Для ручного анализа WAV-сэмплов — Python с модулем scipy.io.wavfile: функция read() возвращает массив сэмплов, из которого можно программно вытянуть младшие биты.

Не пропускайте базовые проверки. Перед запуском Sonic Visualiser прогоните аудиофайл через exiftool challenge.wav, strings challenge.wav и binwalk challenge.wav. В аудиофайл может быть банально вложен ZIP-архив или изображение — binwalk найдёт это за секунду, без всякого спектрального анализа.

Aperi'Solve и автоматизация рутинных проверок

Aperi'Solve — онлайн-платформа, объединяющая около десяти утилит для CTF forensics в одном интерфейсе: strings, file, exiftool, binwalk, foremost, zsteg и другие. Загружаете файл на сайт — получаете результаты всех базовых проверок одновременно. На соревнованиях, где решают минуты, — серьёзное преимущество.

Aperi'Solve автоматически отображает побитовый анализ каждого канала (аналог stegsolve), извлекает вложенные файлы, выводит строки и метаданные. Простые стего-задачи закрываются за 10 секунд без установки локальных инструментов.

StegOnline — ещё одна онлайн-альтернатива stegsolve. Позволяет просматривать битовые плоскости, инвертировать цвета, менять порядок каналов — всё в браузере, без Java. По возможностям близок к stegsolve, но доступнее на машинах без JRE.

Когда онлайн не подходит. Сложные случаи — нестандартный LSB, парольная защита steghide, кастомные алгоритмы встраивания — требуют локальных инструментов и ручного разбора. На реальных пентестах и в incident response загрузка файлов на публичные сервисы недопустима. Для CTF — удобно и безопасно.

Алгоритм решения стего-таска: от простого к сложному

Порядок проверок — то, что отличает опытного CTF-игрока от новичка в категории стеганографии. Ниже — таблица, которую я использую на соревнованиях. Каждый шаг занимает 15-60 секунд; если ни один из базовых не дал результат — переходим к ручному анализу.

Шаг Инструмент Что ищем Форматы
1 file Реальный тип файла Любой
2 strings + grep Открытый текст, паттерн флага Любой
3 exiftool Метаданные, комментарии Любой
4 binwalk Вложенные файлы, архивы Любой
5 binwalk -e Автоизвлечение вложений Любой
6 zsteg LSB-данные PNG, BMP
7 steghide info Наличие контейнера JPEG, BMP, WAV
8 steghide extract Извлечение (пустой пароль) JPEG, BMP, WAV
9 stegseek + словарь Брутфорс пароля steghide JPEG, BMP, WAV
10 Stegsolve → Data Extract Побитовый анализ плоскостей PNG, BMP, GIF
11 Sonic Visualiser Спектрограмма аудио WAV, MP3

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

Формат файла определяет набор применимых инструментов. Для PNG — связка шагов 4 + 6 + 10. Для JPEG — шаги 7 + 8 + 9. Аудиофайлы — шаги 3 + 7 + 11. Запускать zsteg для JPEG или steghide для PNG — пустая трата времени из-за несовместимости форматов.

Проверяйте не только основной файл, но и всё, что из него извлечено. Если binwalk вытащил ZIP — распакуйте и прогоните содержимое через те же шаги. Матрёшечная структура — любимый приём авторов CTF-задач: CTF Field Guide от Trail of Bits описывает паттерн «matroshka-like files-within-files» как типичный для категории forensics.

Ещё один вектор, который часто упускают: PNG-наполнение за границами картинки. В заголовке IHDR записана высота изображения. Если уменьшить значение высоты в hex-редакторе (пересчитав CRC блока), нижняя часть картинки перестаёт отображаться — но данные остаются в файле. Обратная операция — увеличение высоты — раскрывает скрытую часть. Утилита pngcheck поможет обнаружить несоответствие заявленного размера и реального объёма данных IDAT.

Большинство гайдов по стеганографии CTF сводятся к перечислению инструментов: вот steghide, вот binwalk, вот stegsolve. Проблема не в инструментах — их десяток, все бесплатные. Проблема в отсутствии привязки к формату. Я наблюдал, как команды на турнирах первым делом открывали stegsolve на JPEG-файле — при том что lossy-сжатие JPEG разрушает LSB-данные и stegsolve там бесполезен. Или тратили время на steghide для PNG, хотя steghide PNG не поддерживает в принципе.

Системный подход «определи формат → выбери подходящий инструмент → проверь» закрывает большинство задач быстрее интуитивного перебора. Оставшийся процент — кастомная стеганография с авторскими алгоритмами встраивания: тут без Python, ручного hex-анализа и понимания структуры форматов не обойтись. Но даже в этих случаях грамотная начальная разведка (file, strings, binwalk, exiftool) отсекает ложные направления и сужает зону поиска до конкретного участка файла.

Вместо гадания — методичный обход дерева решений, где каждая ветка привязана к формату и типу сокрытия. Навыки, отработанные на CTF-тасках, напрямую переносятся в incident response: подозрительный PNG на заражённой машине анализируется ровно тем же алгоритмом. Попробуйте прогнать через эту таблицу ближайший стего-таск на HackTheBox — и засеките время. Если уложились в пять минут, система работает.

🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».

Поделиться

0 комментариев

Пожалуйста, войдите, чтобы оставить комментарий.

Загрузка комментариев...