Главная / Блог / Стеганография в CTF: находим скрытые данные в изображениях и аудио с помощью steghide, zsteg и binwalk

14 мин.00

Стеганография в CTF: находим скрытые данные в изображениях и аудио с помощью steghide, zsteg и binwalk

Стеганография в CTF: находим скрытые данные в изображениях и аудио с помощью steghide, zsteg и binwalk

Стеганография в CTF: находим скрытые данные в изображениях и аудио с помощью steghide, zsteg и binwalk

На региональном CTF в прошлом году наша команда получила JPEG-файл весом 3 МБ — пейзаж с горами. Два человека параллельно запустили stegsolve и начали перебирать цветовые каналы. Ещё один полез в Python писать скрипт для LSB-извлечения. Через 35 минут четвёртый участник набрал strings mountains.jpg | grep -i flag и получил флаг за три секунды — он был дописан в конец файла открытым текстом.

Вот она, главная болезнь стего-тасков: люди начинают со сложного, пропуская тривиальное. Ниже — пошаговая методология, которая расставляет инструменты в правильном порядке и экономит часы на соревнованиях.

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

Все инструменты из статьи работают на Linux. Оптимальный вариант — Kali Linux, где большинство утилит предустановлено. На Ubuntu или Debian придётся ставить руками.

Минимальные требования: 2 ГБ RAM, любой x86_64-процессор, интернет для установки пакетов (после установки всё работает offline). Для Stegsolve нужен JRE 8+, для zsteg — Ruby 2.7+.

Установка ключевых инструментов:

  • sudo apt install steghide binwalk exiftool — базовый набор из репозиториев Debian/Kali
  • gem install zsteg — установка zsteg через Ruby gems
  • Stegsolve скачивается как JAR-файл с GitHub и запускается через java -jar stegsolve.jar
  • Sonic Visualizer устанавливается через sudo apt install sonic-visualiser или с официального сайта sonicvisualiser.org

Проверить работоспособность стека можно одной строкой: steghide --help && zsteg --help && binwalk --help — если все три утилиты вернули справку, окружение готово.

Алгоритм решения: порядок анализа стеганографии в CTF

Разница между опытным CTF-игроком и новичком — не набор инструментов, а порядок их запуска. Новички хватаются за специализированные утилиты сразу. Опытные идут от простого к сложному и отсекают гипотезы за секунды, а не за минуты.

Последовательность, которая работает на практике:

  1. Определить реальный тип файла (file) — расширение может быть подменено
  2. Проверить строки и метаданные (strings, exiftool) — флаг бывает в открытом виде
  3. Проверить вложенные файлы (binwalk) — внутри картинки может быть ZIP или другой файл
  4. Применить формат-специфичный инструмент: steghide для JPEG/WAV, zsteg для PNG/BMP
  5. Визуальный анализ каналов (stegsolve) — если предыдущие шаги ничего не дали
  6. Для аудио — спектрограмма в Sonic Visualizer

Порядок не случайный. Шаги 1–3 занимают меньше минуты и закрывают примерно половину стего-тасков среднего уровня. Шаги 4–6 требуют больше времени и запускаются только после того, как простые методы не сработали.

Какой инструмент для какого формата

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

Инструмент Поддерживаемые форматы Что находит Ограничения Типичный сценарий в CTF
steghide JPEG, BMP, WAV, AU Данные, встроенные с паролем Не работает с PNG и GIF Задание с подсказкой-паролем
zsteg PNG, BMP LSB-стеганография, скрытые строки Только PNG и BMP PNG с подозрительным размером
binwalk Любой формат Встроенные файлы по сигнатурам Ложные срабатывания на случайных совпадениях Файл подозрительно большой для своего содержимого
stegsolve Любое изображение Визуальные аномалии в битовых плоскостях GUI, требует Java Задание с двумя похожими изображениями
Sonic Visualizer WAV, MP3, FLAC, OGG Паттерны в спектрограмме GUI, не автоматизируется Аудиофайл без явных подсказок
pngcheck PNG Повреждённые чанки, аномалии структуры Только PNG Файл не открывается или отображается частично

Таблица не покрывает экзотику (видеофайлы, PDF, сетевые дампы со стеганографией), но для 90% тасков категории Stego на CTF этого набора хватает за глаза.

Базовая разведка: file, strings и exiftool

Первые три команды при получении любого файла на стего-таске — file, strings и exiftool. Они отвечают на три вопроса: что это за файл на самом деле, есть ли в нём читаемый текст и что записано в метаданных.

Команда file task_image.png определяет тип файла по magic bytes (первые байты файла), а не по расширению. Организаторы CTF регулярно меняют расширение — файл с расширением .txt оказывается BMP, а .gif — на самом деле JPEG. Если file показывает тип, не совпадающий с расширением, — это уже подсказка.

strings task_image.png | grep -i flag ищет читаемые строки с ключевым словом. Если флаг записан открытым текстом, задача решается за секунды. Можно расширить поиск: strings -n 10 task_image.png покажет только строки длиной от 10 символов, отфильтровав мусор. На соревнованиях уровня Easy-Medium этот приём закрывает заметную долю заданий — и именно его пропустила наша команда с горным пейзажем.

file task.*
strings -n 8 task.jpg | grep -iE "flag|ctf|key|secret"
exiftool task.jpg | grep -iE "comment|author|description"

exiftool извлекает метаданные: автор, комментарии, GPS-координаты, софт для создания файла. В CTF-заданиях флаг или подсказка (например, пароль для steghide) часто записаны в поле Comment или Description. Ещё один индикатор — нестандартное значение в поле Software: если PNG якобы создан в «SecretEncoder v1.0», это намёк на конкретный метод стеганографии.

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

steghide CTF: извлечение скрытых данных из JPEG и аудио

Steghide — классика для скрытия и извлечения данных в файлах JPEG, BMP, WAV и AU. В CTF он применяется для извлечения. Главная особенность — данные защищены паролем (passphrase), и без правильного пароля извлечение невозможно.

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

Три типичных сценария с паролем в CTF:

  1. Пароль пустой. Просто нажать Enter при запросе passphrase. Организаторы используют пустой пароль чаще, чем кажется — попробовать этот вариант стоит всегда первым.
  2. Пароль спрятан в метаданных или строках файла. Поэтому exiftool и strings запускаются до steghide. Пароль может быть в поле Comment, в имени автора или даже в имени файла.
  3. Пароль нужно подобрать. Тут помогает stegseek — инструмент для брутфорса паролей steghide. Команда stegseek task.jpg /usr/share/wordlists/rockyou.txt перебирает пароли из словаря. Stegseek работает на порядки быстрее устаревшего stegcracker и на словаре rockyou.txt обычно завершается за секунды.

Ограничение, о котором нужно помнить: steghide не поддерживает PNG. Если в задании PNG-файл, steghide бесполезен — переходите к zsteg. WAV steghide поддерживает, так что для аудиозаданий с WAV-файлами его стоит проверить наряду с анализом спектрограммы.

Ещё нюанс: steghide использует собственный алгоритм встраивания, и данные, внедрённые другими инструментами (OpenStego, jsteg), steghide не обнаружит. Если steghide info ничего не находит — это не значит, что файл чист. Это значит, что steghide-формат не использовался.

zsteg: анализ LSB стеганографии в PNG

Zsteg — специализированный инструмент для обнаружения данных, скрытых методом LSB (Least Significant Bit) в PNG и BMP файлах. LSB-стеганография заменяет младшие биты цветовых каналов на биты скрытого сообщения. Визуально это никак не влияет на картинку — человеческий глаз не различает изменение младшего бита цвета.

Zsteg перебирает комбинации каналов (R, G, B, A), порядок бит (LSB/MSB), направление обхода пикселей (по строкам / по столбцам) и выводит результат для каждой комбинации. Команда zsteg -a file.png запускает все встроенные проверки.

$ zsteg -a challenge.png
b1,r,lsb,xy         .. text: "FLAG{lsb_is_not_that_hard}"
b1,rgb,lsb,xy        .. text: "FLAG{lsb_is_not_that_hard}"
b2,g,msb,xy          .. file: data
b1,rgba,lsb,xy       .. text: "\x00FLAG{lsb_is_not_that_hard}"
b1,abgr,msb,xy       .. file: PGP Secret Key

Тут видно: флаг спрятан в первом бите (b1) красного канала с порядком LSB и обходом xy (по строкам). Zsteg нашёл его сразу в нескольких комбинациях каналов — типичная картина для простого LSB-внедрения.

На что смотреть в выводе zsteg:

  • Строки с text: — читаемый текст, часто содержит флаг
  • Строки с file: — обнаружен файл определённого типа (PNG, ZIP, PDF), который можно извлечь
  • Для извлечения: zsteg -E "b1,r,lsb,xy" file.png > extracted.bin — аргумент после -E берётся из вывода zsteg -a

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

binwalk: поиск скрытых файлов внутри файлов

Binwalk сканирует бинарный файл на наличие сигнатур известных форматов. Если внутри JPEG-файла склеен ZIP-архив, binwalk обнаружит заголовок PK (сигнатура ZIP) и покажет смещение. Это один из самых частых приёмов в CTF: два файла конкатенированы в один, при этом изображение открывается нормально, потому что парсер JPEG игнорирует данные после маркера конца (FFD9).

Команда binwalk task.jpg покажет найденные сигнатуры, а binwalk -e task.jpg автоматически извлечёт обнаруженные файлы в директорию _task.jpg.extracted.

$ binwalk task.jpg

DECIMAL       HEXADECIMAL     DESCRIPTION
------------------------------------------
0             0x0             JPEG image data, JFIF standard 1.01
45231         0xB0AF          Zip archive data, name: secret.txt
45389         0xB14D          End of Zip archive

Binwalk обнаружил ZIP-архив начиная с байта 45231. После binwalk -e task.jpg в извлечённой директории окажется secret.txt. Если архив запаролен — пригодится fcrackzip -u -D -p /usr/share/wordlists/rockyou.txt archive.zip для подбора пароля.

Но есть подвох: binwalk определяет сигнатуры по заголовкам, а не по полному парсингу файлов. Это приводит к ложным срабатываниям — случайные последовательности байт могут совпасть с сигнатурой какого-нибудь экзотического формата. Если binwalk показывает десятки «найденных» файлов разных типов в маленьком изображении — почти наверняка это false positives. Ориентируйтесь на распространённые форматы: ZIP, RAR, PNG, GZIP, ELF.

Ещё сценарий: организаторы прячут данные за пределами видимой области PNG-изображения. Записывают информацию в нижнюю часть картинки и уменьшают значение высоты в IHDR-чанке. Изображение выглядит нормально, но binwalk может ничего не обнаружить, потому что скрытые пиксели — часть штатных данных PNG. Тут нужно вручную увеличить высоту в IHDR через hex-редактор и пересчитать CRC чанка.

Визуальный анализ каналов в Stegsolve

Stegsolve — Java-приложение с GUI для побитового анализа изображений. Оно перебирает отображение картинки по отдельным битовым плоскостям каждого цветового канала. Где binwalk ищет вложенные файлы, а zsteg — LSB-данные, Stegsolve даёт визуальную картину: вы видите, что скрыто в конкретном бите конкретного канала.

Запуск: java -jar stegsolve.jar, затем File → Open для загрузки изображения. Стрелки «<» и «>» переключают режимы отображения: Red plane 0, Red plane 1, Green plane 0 и так далее. Если в одной из плоскостей проступает текст, QR-код или контур другого изображения — вот они, скрытые данные.

Три функции Stegsolve, которые реально нужны на CTF:

  • Data Extract — выбираете конкретные биты каждого канала и извлекаете из них данные. Если zsteg показал, что данные в b1,rgb,lsb — в Data Extract отмечаете Bit 0 для R, G, B каналов и получаете байтовый вывод.
  • Image Combiner — накладывает два изображения друг на друга с операциями XOR, AND, OR. Если в задании даны две похожие картинки (оригинал и стего-версия), XOR-наложение покажет только изменённые пиксели.
  • Frame Browser — разбирает GIF и APNG по кадрам. Иногда один из кадров анимации содержит флаг, а остальные — визуальный шум.

Когда Stegsolve не нужен: если zsteg уже нашёл флаг в LSB, открывать Stegsolve для подтверждения — пустая трата времени. Stegsolve полезен, когда автоматические инструменты ничего не нашли, но есть основания полагать, что данные скрыты визуально — например, задание содержит подсказку про «цвета» или «слои».

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

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

Для спектрограммного анализа — Sonic Visualizer: открыть файл, затем Layer → Add Spectrogram. Спектрограмма отображает частоты по вертикали и время по горизонтали. Скрытые надписи обычно сидят в высокочастотном диапазоне (выше 15 кГц) — там, где обычный звук минимален, но паттерн чётко виден. Альтернатива — Audacity с включённым режимом спектрограммы (в выпадающем меню дорожки выбрать Spectrogram).

Типичные формы спектрограммных посланий:

  • Текст крупными буквами (флаг читается глазами)
  • QR-код (нужно сделать скриншот спектрограммы и отсканировать)
  • Азбука Морзе в виде точек и тире на определённой частоте

Если спектрограмма чистая — проверить steghide extract -sf task.wav. Steghide умеет работать с WAV и AU. Дальше — strings task.wav | grep -i flag на случай, если данные записаны текстом между аудиосэмплами. И binwalk task.wav покажет, нет ли вложенных файлов.

Для WAV-файлов есть WavSteg — Python-инструмент для LSB-стеганографии в аудио. Извлечение: python3 WavSteg.py -r -s task.wav -o output.txt. Инструмент вытаскивает данные из младших бит аудиосэмплов по аналогии с LSB в изображениях.

MP3-файлы — отдельная история. MP3 использует lossy-сжатие, поэтому LSB-методы к нему напрямую не применимы. Для MP3 в CTF чаще всего скрывают данные между фреймами (mp3stego) или в спектрограмме. Если задание — MP3, первый шаг — Sonic Visualizer, второй — strings и binwalk.

Типичные тупики в forensics CTF заданиях

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

Гонка за глубиной при простой задаче. Организатор спрятал флаг в комментарии EXIF, а участник полтора часа анализирует битовые плоскости. Правило: первые 60 секунд — базовая разведка (file, strings, exiftool, binwalk). Ничего не нашлось — тогда переходить к специализированным инструментам.

Steghide на PNG. Steghide не поддерживает PNG — только JPEG и BMP. Утилита просто выдаст ошибку, но новички иногда решают, что «данных нет», и идут дальше, пропуская файл. Для PNG — zsteg.

Ложные срабатывания binwalk. Binwalk нашёл «LZMA compressed data» в середине JPEG — и участник тратит время на извлечение. А это случайное совпадение байтов с сигнатурой LZMA. Индикатор ложного срабатывания: извлечённые файлы нулевого размера или содержат мусор.

Игнорирование альфа-канала в PNG. Изображение выглядит полностью непрозрачным, но альфа-канал содержит данные — значения альфы немного отличаются от 255, и эти отличия кодируют сообщение. Stegsolve показывает это в режиме Alpha plane 0. Если PNG имеет тип RGBA — проверка альфа-канала обязательна.

Перебор без системы. Участник запускает все инструменты по очереди, каждый с дефолтными параметрами, получает отрицательный результат и сдаётся. Но данные могут быть в нестандартном порядке бит (MSB вместо LSB), в нестандартной комбинации каналов (только синий канал) или с обходом пикселей по столбцам вместо строк. Zsteg с флагом -a перебирает основные комбинации, но покрывает не всё — иногда нужен ручной подбор параметров в Data Extract Stegsolve.

Изменённый заголовок PNG. Организатор уменьшил высоту изображения в IHDR-чанке. Картинка отображается обрезанной, а скрытые данные находятся в пикселях ниже видимой границы. Утилита pngcheck покажет несоответствие CRC чанка IHDR — верный индикатор манипуляции с размерами.

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

В реальных инцидентах скрытые данные в изображениях — не академическая экзотика. APT-группы встраивают команды C2 в изображения, размещённые на легитимных хостингах, чтобы обойти сетевые фильтры. Техника T1027.009 (Embedded Payloads) описывает встраивание вредоносного кода в легитимные файлы — по сути, тот же binwalk-сценарий, только в продакшене.

Самый частый вопрос от новичков: «какой инструмент выучить?» — и это неправильный вопрос. Инструменты — самая простая часть. Steghide, zsteg, binwalk осваиваются за вечер. Stegsolve — за два. Сложная часть — научиться отбрасывать гипотезы быстро. Понять, что если zsteg ничего не нашёл в PNG за 5 секунд, надо не перебирать руками оставшиеся 200 комбинаций каналов, а переключиться на binwalk или проверить альфа-канал. Или что steghide с пустым паролем на JPEG — это первые 3 секунды работы, а не «запасной вариант».

За последние пару лет мета стего-заданий сдвинулась: организаторы знают, что участники прогоняют стандартный тулкит автоматом, и усложняют задания через нестандартные кодировки, кастомные алгоритмы встраивания и многоступенчатые цепочки, где извлечённый из картинки файл оказывается ещё одним контейнером (матрёшка, да). Побеждают не те, у кого длиннее список инструментов, а те, кто быстрее строит и проверяет гипотезы — и умеет вовремя выбросить текущую и взять следующую. Попробуйте на ближайшем CTF засечь время: сколько секунд от получения файла до первого strings | grep flag? Если больше десяти — есть над чем работать.

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

Поделиться

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

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

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