Главная / Блог / Стеганография в CTF: чеклист и инструменты для поиска скрытых данных в картинках и аудио

13 мин.00

Стеганография в CTF: чеклист и инструменты для поиска скрытых данных в картинках и аудио

Стеганография в CTF: чеклист и инструменты для поиска скрытых данных в картинках и аудио

Стеганография в CTF: чеклист и инструменты для поиска скрытых данных в картинках и аудио

Четыре часа на PNG размером 6 КБ. Реальный итог команды на CTF средней сложности. Ребята запустили steghide (не поддерживает PNG), потом binwalk (нашёл ложную сигнатуру TIFF), а про zsteg не вспомнили. Флаг сидел в LSB красного канала — zsteg вытащил бы его за секунды. Разница между «крутить таск два часа» и «решить за пять минут» в стеганографии CTF — не уровень мастерства, а наличие системного чеклиста: какой инструмент для какого формата, что запускать первым и когда переключаться на ручной анализ. Здесь — полный алгоритм с командами, таблицей ограничений и decision tree.

Требования к окружению

Перед разбором инструментов — минимальный стек:

  • ОС: Linux (Kali 2024+, Parrot, Ubuntu 22.04+). Большинство утилит работают на macOS, но stegseek и foremost хотят Linux. Windows — через WSL2.
  • RAM: 2 ГБ хватит для всего, что описано ниже. Если файл весит сотни мегабайт (видео-стего) — 4 ГБ и выше.
  • Python: 3.8+ (для Pillow, scipy, WavSteg).
  • Java: JRE 11+ для Stegsolve (JAR-файл). На JDK 17+ может потребоваться явный --add-opens.
  • Ruby: 2.7+ для zsteg (gem install zsteg).
  • Базовый набор пакетов: в Kali бóльшая часть предустановлена — steghide, exiftool, binwalk, foremost, strings, file, sonic-visualiser, audacity. Отдельно ставить: stegseek (.deb с GitHub-репозитория RickdeJager/stegseek), zsteg (Ruby gem), Stegsolve (JAR с GitHub). Aperi'Solve — веб-инструмент, установки не требует.

Первый контакт с файлом: базовый чеклист стеганографии CTF

Любой таск по стеганографии начинается с одних и тех же шагов. Порядок критичен: перепрыгнете базовый анализ и сразу полезете в специализированные инструменты — потеряете время на ложных следах.

Определяем реальный тип файла и метаданные

Первое действие — выяснить, что перед вами на самом деле. Расширение файла в forensics CTF заданиях часто врёт: challenge.txt окажется PNG, image.jpg — ZIP-архивом. Как описывает Trail of Bits CTF Field Guide: «in a CTF, part of the game is to identify the file ourselves, using a heuristic approach.»

Команда file определяет тип по магическим байтам (сигнатурам в заголовке файла). Если file challenge.txt отвечает PNG image data, 800 x 600, 8-bit/color RGBA — перед вами картинка, расширение ложное. Уже подсказка.

Дальше — exiftool для извлечения метаданных. Автор фотографии, GPS-координаты, нестандартные поля Comment, Artist, Description — классические места для сокрытия флагов или хинтов в тасках на стеганографию. На среднем уровне Base64-строка в поле Comment — стабильный паттерн.

Параллельно — strings для вытаскивания всех текстовых строк из бинарного файла. Комбинация с grep сужает поиск: strings challenge.png | grep -iE "flag|ctf|key|{|}|base64". Тривиально, но на лёгких и средних тасках по поиску скрытых данных это решает задачу примерно в трети случаев.

Строки и вложенные файлы — binwalk и foremost

Следующий обязательный шаг — проверка на вложенные файлы. Binwalk сканирует бинарный образ на известные сигнатуры и показывает всё, что спрятано внутри. Trail of Bits CTF Field Guide описывает эту технику как «file carving» — стандартный приём в forensics:

binwalk challenge.png
# DECIMAL    HEXADECIMAL  DESCRIPTION
# 0          0x0          PNG image, 800 x 600
# 524288     0x80000      Zip archive data

Если binwalk нашёл ZIP, вторую картинку или данные после маркера конца файла (IEND для PNG) — извлекаем: binwalk -e challenge.png. Результат попадёт в директорию _challenge.png.extracted.

Ограничение binwalk: инструмент ищет сигнатуры по смещениям, ложные срабатывания — обычное дело. Случайное совпадение байт с сигнатурой ZIP или JPEG — не редкость. Как написал один автор с форума Codeby: «я не советую свято верить ему — были моменты когда он давал неправильную информацию, из-за того что он просматривает только сигнатуры начала.» Извлечённые файлы проверяйте через file и пробуйте открыть.

Если binwalk молчит — foremost -i challenge.png -o output/. Foremost работает иначе: ищет header/footer пары для восстановления файлов. Иногда цепляет то, что binwalk пропускает.

На этом базовый анализ завершён. Нет результата — переходим к специализированным инструментам. Дальнейший путь зависит от типа файла.

Стеганография в изображениях: инструменты и методы анализа

Абсолютное большинство стего-тасков в CTF — изображения: PNG, JPEG, BMP, GIF. У каждого формата свои механизмы сокрытия данных, и путать инструменты между форматами — классическая ошибка (привет, steghide + PNG).

Визуальный анализ слоёв — stegsolve и StegOnline

Stegsolve — Java-приложение для просмотра изображения по отдельным цветовым каналам и битовым плоскостям. Запуск: java -jar stegsolve.jar, открываете файл, листаете стрелками между режимами. Основные режимы для анализа изображений CTF:

  • Red/Green/Blue plane 0–7 — каждый бит каждого канала отдельно. LSB стеганография прячет данные в plane 0 (нулевой, младший бит): на этом слое вместо шума видна структура — текст, QR-код или контуры скрытой картинки.
  • Alpha plane — если изображение RGBA, альфа-канал может нести скрытые данные при визуально полной непрозрачности. Значение alpha = 254 вместо 255 глазом не различимо, но бит хранит информацию. Про альфа-канал многие забывают — а авторы тасков этим пользуются.
  • Data Extract — выбираете конкретные биты конкретных каналов и извлекаете данные в виде текста или файла. Тут главная боль — угадать комбинацию: какие биты, какой порядок байтов (RGB vs BGR), направление обхода (по строкам vs по столбцам).
  • Image Combiner — накладывает два изображения друг на друга. Работает, когда задание даёт оригинальное и изменённое изображение: разница между ними и есть скрытые данные.

Проект стабильный, но JAR давно не обновлялся. На свежих JDK может потребоваться ручная настройка. Не работает по SSH без X-forwarding или VNC.

Веб-альтернатива — StegOnline (georgeom.net/StegOnline). Те же функции в браузере: битовые плоскости, извлечение LSB, анализ гистограмм. Из каталога CTF-инструментов gregalletti/CTF_tools на GitHub: «big stego tool, upload image and modify/extract data.» Спасает, когда GUI-окружения нет.

LSB стеганография — zsteg и ручной анализ

LSB (Least Significant Bit) — самый распространённый метод цифровой стеганографии в CTF-задачах. Принцип: младший бит каждого цветового компонента пикселя заменяется битом скрытого сообщения. Визуально изображение не меняется — разница в один уровень из 256 неразличима.

zsteg автоматически проверяет десятки вариантов LSB-кодирования в PNG и BMP:

zsteg challenge.png
# b1,r,lsb,xy   .. text: "FLAG{hidden_in_plain_sight}"
# b1,rgb,lsb,xy .. file: Zip archive data
# b2,g,msb,xy   .. text: "\x00\x00\x00"

Каждая строка — комбинация параметров: номер бита (b1, b2), канал (r, g, b, rgb, rgba), порядок (lsb/msb), направление обхода пикселей (xy/yx). Если zsteg нашёл осмысленный текст или файловую сигнатуру — задача решена. Для более глубокого анализа: zsteg -a challenge.png проверяет все доступные комбинации, включая экзотические — обход по столбцам, отдельные бит-плоскости альфа-канала.

Ограничение zsteg: работает только с PNG и BMP. Для JPEG не подходит принципиально — lossy-сжатие уничтожает LSB-данные. Если вам дали JPEG с подозрением на LSB — скорее всего, данные внедрены специализированным инструментом (jsteg), и zsteg их не найдёт.

Статус: Ruby gem, репозиторий zed-0xff/zsteg на GitHub, проект активен.

Парольная стеганография — steghide и stegseek

Steghide — классика жанра, прячет данные в JPEG и BMP с шифрованием паролем. В CTF это один из самых частых сценариев: получаете JPEG и подсказку к паролю (или пароль где-то рядом — в описании таска, в имени файла, в метаданных).

Просмотр без извлечения: steghide info challenge.jpg покажет, есть ли встроенные данные и размер. Извлечение: steghide extract -sf challenge.jpg — если пароль пустой, данные выйдут сразу, иначе утилита запросит passphrase.

Steghide не поддерживает PNG. Это источник ошибки номер один у начинающих. Steghide работает с JPEG, BMP, WAV и AU. При попытке скормить PNG — ответ the file format of "challenge.png" is not supported. Для PNG — zsteg или stegsolve. Я видел, как на CTF целые команды убивают полчаса, потому что не знают этого ограничения.

Когда пароль неизвестен — stegseek. Брутфорсер для steghide, способный перебрать словарь rockyou.txt за секунды благодаря оптимизации: stegseek challenge.jpg rockyou.txt. Если пароль найден — данные извлекаются автоматически. В тасках средней сложности пароль часто сидит в rockyou.txt или является словом из описания задания.

Статус stegseek: репозиторий RickdeJager/stegseek на GitHub, предоставляет .deb-пакеты для Kali и Ubuntu, активно поддерживается.

Стеганография в аудио: спектрограммы и скрытые данные

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

Спектрограммы: Sonic Visualiser и Audacity

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

Sonic Visualiser — специализированное приложение для анализа аудио. Откройте файл, добавьте слой спектрограммы через Pane → Add Spectrogram. Настройки: FFT size 1024 или 2048, Window Type — Hann. Если скрытое сообщение есть — оно проявится как рисунок на спектре. Из каталога lnwatson.co.uk: «tools to visualise sound waves and frequencies — useful for audio-based steganography challenges.»

Audacity — более распространённый вариант. Откройте файл, переключите отображение дорожки с Waveform на Spectrogram (выпадающее меню слева от трека). Тонкая настройка через Spectrogram Settings: увеличить FFT Size до 2048–4096, попробовать разные цветовые схемы. Иногда сообщение видно только при определённых параметрах окна — приходится покрутить.

Ограничение: спектрограммный анализ бесполезен для LSB-стеганографии в аудио. Там данные спрятаны на уровне отдельных семплов, а не частотного распределения.

LSB в WAV-файлах

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

Для извлечения — WavSteg (Python): pip install WavSteg, затем python3 -m WavSteg -r -i challenge.wav -o output.txt -n 1 (параметр -n 1 — один LSB-бит на семпл).

Ручной подход через Python, если WavSteg не справился:

from scipy.io.wavfile import read
rate, samples = read('challenge.wav')
bits = ''.join(str(s & 1) for s in samples[:8000])
text = ''.join(chr(int(bits[i:i+8], 2))
               for i in range(0, len(bits), 8))
print(text)

Скрипт извлекает младшие биты первых 8000 семплов и конвертирует двоичную строку в текст группами по 8 бит.

MP3, OGG и другие lossy-форматы уничтожают LSB-данные при кодировании. Если вам дали MP3 — LSB-стеганография маловероятна. Проверяйте спектрограмму, метаданные через exiftool, или ищите вложенные файлы через binwalk.

Автоматизация: Aperi'Solve и онлайн-инструменты

Когда нужно быстро прогнать файл через все проверки разом — Aperi'Solve (aperisolve.com). Веб-инструмент автоматически запускает zsteg, steghide (с пустым паролем), exiftool, binwalk, foremost, strings и отображает анализ битовых плоскостей. Загрузили файл — получили сводный отчёт. Из каталога gregalletti/CTF_tools: «one of the best online tools, with static analysis and also running zsteg, steghide, exiftool, binwalk, foremost.»

На практике Aperi'Solve экономит 5–10 минут ручного анализа и часто выдаёт ответ на лёгких тасках сразу. Но полагаться только на него — ошибка.

Ограничения Aperi'Solve: не поддерживает аудиофайлы, steghide пробует только пустой пароль, для файлов больше 10 МБ может тормозить. Это инструмент первой линии, не замена ручному стегоанализу.

CyberChef (gchq.github.io/CyberChef) — для декодирования извлечённых данных. Строка в Base64, Hex, ROT13 или вложенная кодировка — CyberChef конвертирует за секунды. Незаменим, когда результат стего-анализа закодирован в несколько слоёв (а авторы тасков это любят — матрёшка из кодировок).

Алгоритм решения стего-таска: от файла до флага

Вместо хаотичного перебора инструментов — фиксированная последовательность. Каждый шаг даёт результат или сужает область поиска.

Шаг 1. Формат. file challenge.xxx — реальный тип. Расширение врёт — переименовать.

Шаг 2. Метаданные. exiftool challenge.xxx — нестандартные поля, комментарии, GPS.

Шаг 3. Строки. strings challenge.xxx | grep -iE "flag|ctf|key" — открытый текст.

Шаг 4. Вложенные файлы. binwalk -e challenge.xxx — file carving.

Шаг 5 (изображение). Развилка по формату: - PNG/BMP → zsteg -a для автоматического LSB-анализа - JPEG/BMP → steghide info и stegseek с rockyou.txt - Любое изображение → stegsolve или StegOnline для визуального анализа битовых плоскостей - Два файла (оригинал + изменённый) → Image Combiner в stegsolve

Шаг 6 (аудио). Развилка: - Любой формат → спектрограмма в Sonic Visualiser или Audacity - WAV → WavSteg или Python-скрипт для LSB - Нестандартный формат → exiftool, strings, binwalk

Шаг 7. Декодирование. Извлечённые данные часто закодированы: Base64, Hex, XOR, ROT13. CyberChef или быстрый однострочник на Python.

Шаг 8. Автоматизация. Ничего не нашли вручную — Aperi'Solve для изображений. Иногда один инструмент ловит то, что другой пропустил.

Сводная таблица инструментов стеганографии CTF с ограничениями:

Инструмент Форматы Метод Ограничения Когда использовать
zsteg PNG, BMP LSB (автоперебор) Не работает с JPEG; Ruby-зависимость Первым для PNG
steghide JPEG, BMP, WAV, AU Парольная стего Не поддерживает PNG; нужен пароль JPEG-файлы
stegseek JPEG, BMP, WAV, AU Брутфорс steghide Только steghide-контейнеры Когда steghide просит пароль
stegsolve Любое изображение Визуал битовых плоскостей Java; нет CLI-режима Всегда, визуальная проверка
StegOnline Любое изображение Визуал (веб) Лимит на размер загрузки Нет Java или GUI
binwalk Любой файл File carving по сигнатурам Ложные срабатывания Всегда, на этапе базового анализа
Sonic Visualiser Аудио (WAV, MP3, FLAC) Спектрограмма Не находит LSB-стего Аудио: поиск визуальных сообщений
WavSteg WAV LSB в аудио Только WAV; нет GUI WAV с подозрением на LSB
Aperi'Solve Изображения Комплексный анализ Пустой пароль; нет аудио Быстрая первичная проверка
foremost Любой файл File carving (header/footer) Медленнее binwalk Когда binwalk ничего не нашёл

Частые ошибки и неочевидные приёмы

В реальных атаках стеганография — не только CTF-головоломка. В матрице MITRE ATT&CK она фигурирует как метод сокрытия команд в C2-трафике — Steganography (T1001.002, Command and Control) и как способ маскировки полезной нагрузки — Steganography (T1027.003, Defense Evasion). Навыки стегоанализа из CTF напрямую транслируются в задачи incident response.

Теперь — про ошибки, на которых горят не только новички.

Первая: steghide и PNG. Steghide физически не работает с этим форматом и выдаёт the file format is not supported. Для PNG — zsteg или stegsolve. Повторяю это третий раз в статье, потому что это третья по частоте причина потраченного впустую времени на CTF.

Вторая: игнорирование альфа-канала. PNG формата RGBA содержит канал прозрачности, и данные нередко спрятаны именно в нём. Stegsolve покажет Alpha plane 0 — проверяйте при каждом анализе изображений.

Третья: слепая вера binwalk. Инструмент находит «ZIP-архив» внутри файла, хотя это случайное совпадение байт с сигнатурой. Извлечённые файлы всегда проверяйте через file и пробуйте открыть — если не открываются, это артефакт.

Неочевидный приём — PNG с манипулированным IHDR. Значение высоты изображения в заголовке PNG можно уменьшить. Визуально картинка обрезается снизу, но пиксельные данные остаются в файле. Признак: binwalk или pngcheck показывают несоответствие между размером IDAT-блоков и заявленными размерами. Исправление — увеличить высоту в IHDR через hex-редактор и пересчитать четыре байта CRC блока. Скрытая часть проявится внизу изображения. В русскоязычных гайдах по CTF этот приём почти не описан, хотя в тасках встречается регулярно.

Ещё нюанс — GIF-анимация. Stegsolve имеет режим Frame Browser для покадрового просмотра. Флаг может быть в одном кадре из сотни, и обычный просмотр GIF его не покажет — кадр мелькнёт на 10 миллисекунд. Разбивайте GIF на отдельные кадры через convert challenge.gif frame_%d.png (ImageMagick) и анализируйте каждый.

Решаю стего-таски на CTF с 2020 года, и за это время один вывод подтверждается снова и снова: 80% задач закрываются на первых четырёх шагах чеклиста — file, strings, exiftool, binwalk. Авторы тасков переоценивают хитрость своих решений: прячут флаг в комментарии EXIF, дописывают ZIP после маркера конца PNG или кладут текст в поле Artist — и считают это «средней сложностью». Настоящая средняя начинается с LSB и парольной стеганографии, настоящая высокая — с кастомных алгоритмов сокрытия информации в файлах, где автоматические инструменты бессильны и нужен собственный скрипт на Python.

Проблема большинства русскоязычных гайдов — они дают список инструментов, но не объясняют порядок и ограничения. Человек читает «steghide — утилита для стеганографии», пробует на PNG, получает ошибку, и думает, что инструмент сломан. Или запускает десять утилит подряд, не понимая, какая для чего. Чеклист решает эту проблему: шаг за шагом, с развилками по формату, с таблицей «когда использовать / когда бесполезно».

Если через пять минут zsteg, stegseek и Aperi'Solve молчат — перечитывайте описание таска. Хинт почти всегда есть: в названии файла, в теге категории, в количестве очков за задание. Стеганография в CTF — последовательный перебор по чеклисту, а не магия. Кто это понял — перестаёт тратить часы на один PNG.

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

Поделиться

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

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

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