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

13 мин.00

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

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

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

Три часа на стего-таск весом в 100 очков — и ноль результата. На квалификационном CTF я получил PNG-файл с котом, запустил steghide (который PNG не поддерживает в принципе), потом binwalk (нашёл ложные сигнатуры в IDAT-чанках), потом полез в hex-дамп руками. Флаг сидел в LSB красного канала — zsteg вывел его за две секунды. Проблема была не в знании инструментов: каждый из них по отдельности я использовал десятки раз. Проблема — в отсутствии алгоритма: какой инструмент для какого формата, в каком порядке, когда переключаться на следующий. Эта статья — рабочий алгоритм, собранный за полтора года участия в соревнованиях на PicoCTF, HackTheBox CTF и площадках CTFtime.

Зачем CTF-игроку понимать стеганографию

Стеганография в CTF — категория задач, где данные спрятаны внутри обычных файлов: изображений, аудиозаписей, видео. В отличие от криптографии, где факт шифрования очевиден, стеганография маскирует само наличие скрытого сообщения. Задача участника — обнаружить факт сокрытия и вытащить спрятанное.

Навык разбора стего-задач переносится за пределы соревнований. В реальном мире злоумышленники используют стеганографию в двух сценариях, которые MITRE ATT&CK документирует как отдельные техники:

  • Скрытие полезной нагрузки — Steganography (T1027.003, тактика Defense Evasion): вредоносный код встраивается в изображения, чтобы пройти мимо антивирусов. Файл выглядит безобидно, но содержит закодированный пейлоад.
  • Скрытый канал управления — Steganography (T1001.002, тактика Command and Control): C2-коммуникация маскируется внутри легитимного трафика. Малварь получает команды через картинки на публичных хостингах.

В CTF-задачах стего-категории чаще всего встречаются три группы файлов:

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

Аудио (WAV, MP3, FLAC). WAV — основной формат для LSB-вставок и спектрограммных задач. MP3 реже, но встречается в задачах с метаданными или встроенными файлами.

Видео (MP4, AVI). Обычно сводятся к разбору на кадры через ffmpeg -i video.mp4 frame_%03d.png с последующим анализом отдельных фреймов как изображений.

Алгоритм решения стего-тасков: decision tree

Ниже — последовательность шагов, которая покрывает примерно 90% стего-тасков лёгкого и среднего уровня. Оставшиеся 10% — скриптинг на Python и нестандартные подходы.

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

  • ОС: Kali Linux 2023.1+ (большинство инструментов предустановлены) или Ubuntu 22.04+
  • RAM: 2 ГБ минимум, 4 ГБ рекомендуется (Audacity жрёт память на длинных дорожках)
  • Диск: ~500 МБ под инструменты и временные файлы
  • Пакеты: steghide, exiftool, binwalk, audacity, ffmpeg — всё из стандартного репозитория Kali
  • Ruby 2.7+ для zsteg (установка: gem install zsteg)
  • Java 8+ для Stegsolve (JAR-файл, загружаемый отдельно)
  • Опционально: stegseek — форк steghide для брутфорса паролей, доступен на GitHub (RickdeJager/stegseek) и в репозиториях Kali

Шесть шагов от файла до флага

Шаг 1 — определение реального типа файла. Расширение может врать. file mystery_file покажет реальный формат по магическим байтам. Если файл называется flag.txt, а file выдаёт PNG image data, 1920 x 1080 — перед вами изображение с подменённым расширением. Две секунды на эту проверку экономят двадцать минут мучений.

Шаг 2 — поиск строк в открытом виде. strings mystery.png | grep -iE "flag|ctf|key|{|}" ищет текстовые данные внутри бинарного файла. На простых тасках флаг бывает буквально дописан в конец файла или спрятан в текстовых чанках. Смешно, но работает чаще, чем хотелось бы.

Шаг 3 — метаданные. exiftool mystery.png показывает все метаданные: EXIF, IPTC, XMP, текстовые чанки PNG (tEXt, iTXt, zTXt). Авторы тасков часто прячут подсказки или сам флаг в полях Comment, Author, Description или GPS-координатах.

Шаг 4 — встроенные файлы. binwalk mystery.png сканирует файл на наличие известных сигнатур (ZIP-архивы, другие изображения, исполняемые файлы). Если binwalk нашёл что-то — binwalk -e mystery.png для извлечения. Но тут есть подвох: binwalk часто генерирует ложные срабатывания на сжатых данных (IDAT-чанки PNG, DCT-данные JPEG). Проверяйте каждый извлечённый файл — если «архив» не открывается, это не повреждение, а фантом.

Шаг 5 — формат-специфичный анализ. Здесь маршрут зависит от типа файла:

  • PNG или BMPzsteg, затем Stegsolve для визуального анализа
  • JPEGsteghide extract -sf file.jpg (сначала пустой пароль, потом слова из описания задания)
  • WAV → Audacity (спектрограмма), затем steghide или WavSteg для LSB
  • GIF → покадровый разбор: ffmpeg -i anim.gif frame_%03d.png, затем анализ кадров по отдельности
  • MP3strings + exiftool для метаданных, конвертация в WAV через ffmpeg для дальнейшего анализа

Шаг 6 — эскалация. Если пять шагов ничего не дали — скриптинг. Python с библиотекой PIL/Pillow для ручного чтения пикселей, проверка кастомных алгоритмов (XOR-маска, нестандартные битовые плоскости, дописанные данные за IEND-маркером PNG).

Forensics CTF: стеганография в изображениях

Первичный анализ: file, exiftool, binwalk

Три команды, которые запускаются на любом файле до специализированных инструментов. file определяет формат, exiftool читает метаданные, binwalk ищет встроенные файлы. Эта тройка — фундамент, и в заметной доле тасков флаг находится уже здесь.

Отдельно про exiftool: инструмент активно поддерживается автором (Phil Harvey), работает с сотнями форматов. Помимо стандартных EXIF-полей, он извлекает текстовые чанки PNG, IPTC-блоки, XMP-метаданные и даже миниатюры, встроенные в JPEG. На задачах начального уровня GPS-координаты из EXIF ведут к названию города, которое и оказывается флагом — классический сценарий, описанный на платформе root-me.org. Нюанс: Windows не отображает EXIF у PNG через стандартные свойства — используйте exiftool из командной строки, не полагайтесь на графический интерфейс ОС.

zsteg: LSB-анализ скрытых данных в PNG и BMP

zsteg — инструмент на Ruby, заточенный под обнаружение LSB-стеганографии. Работает быстро, перебирает множество комбинаций каналов и битовых порядков за один запуск. Последний стабильный релиз доступен как Ruby-гем; инструмент активно используется CTF-сообществом.

Поддерживаемые форматы: только PNG и BMP. На JPEG не работает — JPEG использует сжатие с потерями, которое уничтожает данные в младших битах.

Ограничения: не обнаруживает steghide-метод (steghide использует собственный алгоритм на основе графовой теории, а не чистый LSB). Не работает с аудиофайлами. Не справляется с кастомными алгоритмами вставки. Если zsteg молчит — это не значит, что файл чистый. Это значит, что классического LSB там нет.

Типичный запуск и вывод:

$ zsteg challenge.png
b1,r,lsb,xy         .. text: "flag{lsb_is_the_classic_one}"
b1,rgb,lsb,xy        .. text: "CTF{not_so_hidden}"
b2,g,msb,xy          .. file: PNG image data, 64 x 64
b1,rgba,lsb,xy       .. zlib: data="compressed payload"

Обозначения: b1,r,lsb,xy — 1-й бит, красный канал, порядок от младшего бита, построчное чтение. Если стандартный запуск ничего не дал — zsteg -a challenge.png перебирает все возможные комбинации каналов и битовых порядков. Работает дольше, но покрывает экзотические варианты.

На практике zsteg — первый инструмент для любого PNG/BMP на стего-таске. Если в выводе появился читаемый текст или знакомые заголовки файлов (PK для ZIP, PNG для изображения) — вы нашли скрытые данные.

steghide CTF: извлечение из JPEG, BMP, WAV

steghide — консольная утилита, которая встраивает и извлекает данные через собственный алгоритм, модифицирующий DCT-коэффициенты (JPEG) или значения сэмплов (WAV/AU). Последний релиз — версия 0.5.1, 2003 год. Проект не обновляется с тех пор, но утилита включена в репозитории Kali и Debian и остаётся стандартом де-факто для CTF-задач с парольной стеганографией. Двадцать лет без коммитов — а альтернативы до сих пор нет.

Поддерживаемые форматы: JPEG, BMP, WAV, AU. Не поддерживает PNG — самая частая ошибка новичков.

Ограничение: для извлечения данных требуется пароль (passphrase). Если пароль неизвестен — нужен перебор.

$ steghide info secret.jpg
  format: jpeg
  capacity: 3.2 KB
  embedded file "flag.txt": size: 42 Byte

$ steghide extract -sf secret.jpg -p ""
  wrote extracted data to "flag.txt".

$ stegseek secret.jpg /usr/share/wordlists/rockyou.txt
  [i] Found passphrase: "sunshine"
  [i] Extracted to "secret.jpg.out"

Порядок действий: (1) steghide info — проверить, есть ли вложенные данные; (2) steghide extract -sf file.jpg -p "" — попробовать пустой пароль (срабатывает примерно в трети простых тасков); (3) если задание содержит хинт — слова из хинта подставлять как пароль; (4) если ничего не помогает — stegseek со словарём rockyou.txt.

stegseek — форк steghide, оптимизированный под перебор паролей. Проходит словарь на 14 миллионов записей за секунды, тогда как встроенный перебор steghide занял бы часы. На Kali доступен через apt install stegseek.

Stegsolve: побитовый визуальный анализ изображений

Stegsolve — Java-приложение для визуального анализа изображений по отдельным битовым плоскостям. Запускается через java -jar Stegsolve.jar. Проект не обновлялся несколько лет, но остаётся незаменимым для задач, где автоматические инструменты пасуют.

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

Ключевые функции:

  • Переключение между слоями (стрелки в интерфейсе): Red plane 0 через Red plane 7, аналогично Green, Blue, Alpha. Скрытое изображение обычно проявляется на 0-м бите одного из каналов.
  • Data Extract — ручное извлечение LSB с указанием конкретных битов и каналов. Нужно, когда стеганография использует нестандартную комбинацию (2-й бит синего канала, MSB вместо LSB).
  • Image Combiner — наложение двух изображений через XOR, AND, OR. Если задание выдаёт оригинал и модифицированную копию, XOR покажет разницу — то есть скрытые данные.
  • Frame Browser — покадровый просмотр GIF-анимаций. Некоторые кадры содержат данные, невидимые при стандартном воспроизведении.

По данным CTF Field Guide от Trail of Bits, Stegsolve — один из основных инструментов для побитового анализа изображений при решении стего-тасков.

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

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

Audacity: скрытые данные на спектрограмме

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

Последовательность действий в Audacity:

  1. Откройте аудиофайл
  2. Кликните на имя дорожки слева → «Спектрограмма» (Spectrogram)
  3. Правый клик на шкале частот → «Настройки спектрограммы» → максимальная частота 22000 Гц, размер окна FFT 4096 или 8192 для лучшей детализации
  4. Скрытое сообщение проявится как текст или QR-код в спектрограмме

Типичная ошибка: по умолчанию Audacity отображает спектрограмму с ограниченным частотным диапазоном и низким разрешением. Если скрытые данные сидят в высоких частотах (16–22 кГц) — вы их просто не увидите без настройки. Я на этом терял время дважды, пока не вбил себе в привычку сразу выкручивать диапазон на максимум.

Альтернатива — Sonic Visualiser (разработан Queen Mary University of London, активно поддерживается). Даёт более гибкую настройку спектрограммы: размер окна FFT, цветовая схема, диапазон dB. В ряде случаев показывает скрытые данные отчётливее, чем Audacity.

SSTV-сигналы в аудиодорожках CTF

SSTV (Slow Scan Television) — протокол передачи изображений через звуковой канал, изначально из мира радиолюбителей. В CTF SSTV-сигнал звучит как характерное «буканье» с меняющимся тоном — нечто среднее между факс-модемом и трелью робота. Если вы слышите что-то подобное, а спектрограмма не показала ничего визуального — пробуйте SSTV-декодер.

Для декодирования на Linux — QSSTV (apt install qsstv). На Windows — RX-SSTV. Принцип: декодер принимает аудиосигнал и восстанавливает из него изображение. В Linux можно настроить PulseAudio для перенаправления вывода проигрывателя на вход QSSTV без физического аудиокабеля.

SSTV-таски иногда маскируют сигнал внутри обычной музыкальной дорожки. Обращайте внимание на участки с нехарактерным тоновым шумом — именно там может прятаться передача.

LSB в WAV-файлах: стеганография аудиофайлов

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

Для извлечения подходит WavSteg (Python-скрипт, доступен на GitHub). Команда python3 WavSteg.py -r -i audio.wav -o output.txt -n 1 извлекает по одному младшему биту из каждого сэмпла. Параметр -n 2 извлечёт два младших бита — пробуйте разные значения. И не забывайте, что steghide тоже работает с WAV и AU — если WavSteg не дал результата, попробуйте steghide extract -sf audio.wav.

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

Инструмент Форматы Что находит Ограничения Когда применять
zsteg PNG, BMP LSB в различных каналах и битовых порядках Не работает с JPEG и аудио; не детектирует steghide-метод Первый шаг для любого PNG/BMP
steghide JPEG, BMP, WAV, AU Данные, встроенные алгоритмом steghide Не поддерживает PNG; требует пароль; релиз 2003, не обновляется Парольная стеганография в JPEG/WAV
stegseek JPEG, BMP, WAV, AU То же, что steghide, плюс брутфорс пароля Только словарный перебор, не кастомные алгоритмы Когда steghide требует пароль без подсказок
Stegsolve PNG, BMP, JPEG, GIF Визуальные артефакты в битовых плоскостях Java-зависимость; только ручной анализ; не обновляется Визуальная стеганография, XOR двух изображений
Audacity WAV, MP3, FLAC, OGG Скрытые изображения в спектрограмме Ручной анализ; не извлекает LSB автоматически Все аудио-таски, спектрограммный анализ
binwalk Любые Встроенные файлы по сигнатурам Много ложных срабатываний на сжатых данных Поиск файлов внутри файлов (шаг 4)
exiftool Любые Метаданные: EXIF, XMP, IPTC, GPS, комментарии Не находит стеганографию, только метаданные Быстрая проверка метаданных (шаг 3)
WavSteg WAV LSB в аудиосэмплах Только WAV; нет GUI LSB-извлечение из WAV-файлов

Главное, что стоит запомнить: zsteg работает с PNG, но не с JPEG. steghide работает с JPEG, но не с PNG. Путаница между ними — причина номер один потерянного времени на стего-тасках.

Типичные ошибки в CTF forensics заданиях

steghide на PNG-файле. Steghide выдаст the file format of the file "image.png" is not supported — и это прямой текст ошибки, но новички игнорируют его и думают, что файл повреждён. Для PNG — zsteg и Stegsolve.

Пустой пароль не пробовался. При запуске steghide extract без -p утилита запросит пароль интерактивно. Нажатие Enter (пустая строка) срабатывает удивительно часто на тасках начального и среднего уровня. Многие сразу запускают брутфорс, потеряв минуты на ровном месте.

Слепое доверие binwalk. В сжатых данных (PNG IDAT, JPEG-потоки) binwalk находит «фантомные» ZIP-заголовки и GZIP-сигнатуры, которые на деле — часть стандартного сжатия формата. Если извлечённый «архив» не открывается — это ложное срабатывание, а не повреждённый файл.

Игнорирование условия задания. Название таска, описание, теги, количество баллов — всё это подсказки. Название «Johnny» может означать пароль «johnny» для steghide. Описание «Listen carefully» указывает на аудио-стеганографию. Не бросайтесь в инструменты до прочтения условия целиком.

Стандартные настройки спектрограммы Audacity. По умолчанию спектрограмма показывает ограниченный частотный диапазон с низким разрешением. Скрытые данные в высоких частотах (16–22 кГц) невидимы без увеличения максимальной частоты и размера FFT-окна.

Пропущенный первый шаг — file. Авторы CTF-тасков обожают менять расширение. Файл .mp3 может оказаться PNG, а .jpg — ZIP-архивом. Две секунды на file mystery_file экономят двадцать минут попыток открыть файл неправильным инструментом. Алгоритм на бумаге понятен, но отработать его по-настоящему получается только на живых тасках — готовый стенд есть на HackerLab.pro, российской CTF-платформе с категориями forensics и stegano, нужна регистрация, после неё доступны таски разных уровней.

Девять из десяти стего-тасков среднего уровня решаются пятью инструментами: file, strings, exiftool, zsteg (или steghide для JPEG) и binwalk. Сложные — это Python-скрипты, кастомные алгоритмы, нестандартные форматы. Но фундамент один: определил формат → проверил очевидное → применил правильный инструмент.

Большинство CTF-игроков, застревающих на стего, знают все перечисленные инструменты. Проблема не в знании — в хаотичном подходе. Запускают всё подряд, надеясь на удачу, теряют время на несовместимых связках «инструмент — формат». Я видел, как команды-новички с чётким чеклистом из шести шагов обходили опытных игроков на стего-категории, потому что не уходили в тупиковые ветки. Стеганография — одна из немногих CTF-категорий, где дисциплина бьёт талант. В pwn нужна глубокая экспертиза в эксплуатации памяти, в crypto — математическая база. В stego — правильный порядок действий и твёрдое знание ограничений каждого инструмента. Мой прогноз на ближайшие год-два: серьёзные CTF будут сдвигать стего-таски от классического «найди LSB в PNG» к задачам с кастомными алгоритмами, AI-генерированным контентом и стеганографией в нетипичных контейнерах (PDF, DOCX, сетевые протоколы). Но базовый алгоритм — «определи формат, проверь очевидное, применяй правильный инструмент» — останется фундаментом, на который наслаивается всё остальное.

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

Поделиться

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

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

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