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

14 мин.00

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

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

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

Файл challenge.png, 14 МБ, разрешение 800×600. Обычная фотография с такими размерами весит 300–500 КБ. Не больше. Одна команда binwalk -e, две секунды — и из файла вылезает ZIP-архив с текстовиком flag.txt внутри. Задание на 100 очков решается за три минуты. Половина участников провозилась час, потому что сразу полезла в Stegsolve и пиксельный анализ, проигнорировав самый очевидный признак: аномальный размер файла. Стеганография в CTF — не про знание двадцати утилит, а про правильный порядок их применения. Ниже — алгоритм, отработанный на сотнях стего-задач.

Стеганография в контексте CTF forensics

Цифровая стеганография — сокрытие данных внутри обычных файлов так, чтобы сам факт передачи оставался незамеченным. Криптография делает сообщение нечитаемым, стеганография прячет его на виду: в пикселях картинки, в сэмплах аудиофайла, в метаданных документа.

В CTF-соревнованиях стего-задания входят в категорию Forensics и встречаются на всех уровнях — от picoCTF до DEF CON CTF. Trail of Bits CTF Field Guide относит к forensics анализ форматов файлов, стеганографию, дампы памяти и захваченный сетевой трафик. Стего-таски часто оказываются самыми дружелюбными к новичкам: не нужны дорогие инструменты вроде IDA Pro, хватает набора бесплатных утилит и терминала.

Стеганография живёт не только на соревнованиях. В MITRE ATT&CK техника Steganography (T1027.003, тактика Defense Evasion) описывает сокрытие вредоносного кода внутри медиафайлов для обхода средств защиты. Отдельная техника T1001.002 (тактика Command and Control) покрывает передачу команд через стеганографические каналы. Так что навык пригодится и на CTF, и когда будете разбирать реальный инцидент.

Основные форматы, с которыми придётся работать на forensics CTF заданиях:

  • Изображения — PNG, JPEG, BMP, GIF. Самые частые контейнеры
  • Аудио — WAV, MP3, FLAC. Скрытые данные в спектрограммах и младших битах
  • Архивы — ZIP, RAR, 7z. Часто вшиваются внутрь картинок целиком
  • Видео — MP4, AVI. Реже, но встречается разбивка на кадры через ffmpeg

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

Работает если: Linux (Kali, Parrot, Ubuntu 20.04+), Python 3.8+, минимум 2 ГБ RAM. Большинство инструментов для стеганографии CTF заточены под Linux и работают из коробки. Не работает если: чистая Windows без WSL — часть утилит просто не ставится, часть работает криво.

Базовый набор ставится одной командой: sudo apt install binwalk exiftool steghide foremost xxd pngcheck. Для zsteg понадобится Ruby — gem install zsteg. Stegsolve — Java-приложение, запускается через java -jar stegsolve.jar. Stegseek (быстрый брутфорс для steghide) ставится из .deb-пакета с GitHub-релизов проекта.

Для разведки без установки чего-либо есть Aperi'Solve (aperisolve.com) — сервис, который прогоняет файл через 9–10 инструментов разом: strings, exiftool, binwalk, zsteg, steghide, foremost и другие. Удобно для быстрого первого взгляда, но на реальном CTF с ограничением по времени или без интернета не спасёт — ставьте всё локально.

Первичный анализ файла: file, strings, xxd

Анализ файлов на скрытую информацию всегда начинается с одних и тех же трёх шагов. Не пропускайте их, даже если «и так видно, что это PNG».

Команда file mystery.png определяет реальный тип файла по magic bytes — первым байтам заголовка. Организаторы CTF обожают подменять расширение: файл назван .png, а внутри — JPEG или вовсе ZIP-архив. Утилита file не смотрит на расширение, она анализирует сигнатуру. Если file показывает неожиданный тип — расширение врёт, переименуйте файл и работайте с реальным форматом.

Следующий шаг — strings mystery.png | grep -i flag для поиска текстовых строк внутри бинарного файла. Звучит примитивно, но примерно каждое пятое лёгкое CTF-задание решается одной командой strings. Флаг может валяться открытым текстом в конце файла, в комментариях или между блоками данных. Для более прицельного поиска скрытых данных в изображениях: strings -n 8 mystery.png — вывод строк длиной от 8 символов, отсекает мусор.

Третий шаг — hex-дамп: xxd mystery.png | head -20 покажет первые строки в шестнадцатеричном виде. Здесь видны magic bytes: для PNG — 89 50 4E 47 0D 0A 1A 0A, для JPEG — FF D8 FF, для ZIP — 50 4B 03 04. Зачем смотреть hex руками? Потому что организаторы иногда портят magic bytes нарочно — меняют один байт, чтобы file не определил формат. Визуально такая подмена заметна сразу.

$ file mystery.png
mystery.png: PNG image data, 1024 x 768, 8-bit/color RGBA, non-interlaced
$ strings mystery.png | grep -i "flag\|ctf\|key"
flag{n0t_so_h1dden_4fter_4ll}
$ xxd mystery.png | head -3
00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR
00000010: 0000 0400 0000 0300 0806 0000 0012 d2bf  ................
00000020: a100 0000 0174 4558 7443 6f6d 6d65 6e74  .....tEXtComment

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

Exiftool: анализ метаданных изображений

Exiftool — один из основных CTF forensics инструментов для чтения метаданных. Работает с десятками форматов: JPEG, PNG, TIFF, PDF, WAV и другими. В forensics CTF заданиях метаданные — частое место для подсказок или прямого размещения флага.

Запуск: exiftool mystery.jpg. Вывод покажет дату создания, размеры, программу-создатель, GPS-координаты, а главное — текстовые поля Comment, Artist, Copyright, Description. Именно туда чаще всего прячут флаг или подсказку.

На что обращать внимание при анализе метаданных:

  • Comment / User Comment — текстовое поле свободного формата. Если там Base64-строка — декодируйте: echo "ZmxhZ3t0ZXN0fQ==" | base64 -d
  • Artist / Author — иногда содержит имя пользователя или хеш пароля
  • GPS-координаты — если задание связано с OSINT, координаты укажут на конкретное место
  • Thumbnail — JPEG может содержать встроенную миниатюру с другим изображением. Извлечение: exiftool -b -ThumbnailImage mystery.jpg > thumb.jpg
  • Несоответствие размера — если exiftool показывает картинку 640×480, а файл весит 15 МБ, внутри явно что-то лишнее. Это сигнал для binwalk

Типичная ошибка новичков — бегло проскочить exiftool и сразу бросаться к сложным инструментам. Анализ метаданных изображений занимает 30 секунд и может сэкономить час. Не ленитесь.

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

Binwalk сканирует бинарный файл на наличие сигнатур известных форматов. Trail of Bits CTF Field Guide называет извлечение вложенных файлов (file carving) одним из самых распространённых приёмов в forensics-категории. Binwalk создавался для анализа firmware, но стал стандартом для стего-задач на CTF — и по заслугам.

Базовая команда: binwalk mystery.png — показывает список найденных сигнатур с офсетами (смещениями в байтах). Если binwalk нашёл ZIP, gzip, RAR, JPEG или другой формат — внутри файла вшит ещё один файл.

Извлечение: binwalk -e mystery.png создаёт папку _mystery.png.extracted/ с найденными объектами. Флаг может лежать прямо в извлечённом текстовике или в архиве, который потребует пароль.

$ binwalk -e mystery.png

DECIMAL       HEXADECIMAL     DESCRIPTION
----------------------------------------------
0             0x0             PNG image, 1024 x 768, 8-bit/color RGBA
1048576       0x100000        Zip archive data, at least v2.0 to extract
1048658       0x100052        End of Zip archive

$ ls _mystery.png.extracted/
100000.zip  flag.txt

Binwalk нашёл ZIP-архив, вшитый после данных PNG. Архив извлечён автоматически, внутри — файл с флагом.

Если binwalk не извлёк файл автоматически, поможет dd: команда dd if=mystery.png of=extracted.zip bs=1 skip=1048576 вырежет данные начиная с нужного офсета. Значение офсета берётся из столбца DECIMAL вывода binwalk.

Нюанс: binwalk иногда даёт ложные срабатывания — находит «сигнатуры», которых реально нет. Если извлечённый файл не открывается — это нормально, не застревайте, переходите к следующему инструменту. Альтернатива для file carving — foremost -i mystery.png -o output_dir/. Foremost ищет файлы по заголовкам и футерам, иногда вытаскивает то, что binwalk пропустил.

Steghide и stegseek: данные, защищённые паролем

Steghide — классический инструмент для встраивания и извлечения скрытых данных в JPEG, BMP, WAV и AU файлах. Отличие от binwalk принципиальное: steghide работает с данными, встроенными на уровне пикселей или аудиосэмплов по специальному алгоритму, а не просто дописанными в конец файла.

Работает если: формат файла JPEG, BMP, WAV или AU. Не работает если: файл в формате PNG или GIF — steghide их не поддерживает. Запомните это, сэкономите нервы.

Проверка наличия вложенных данных: steghide info cover.jpg покажет, есть ли скрытое содержимое и какой алгоритм шифрования использовался.

Как использовать steghide для извлечения: steghide extract -sf cover.jpg. Если данные вложены с пустым паролем (просто жмите Enter на запрос passphrase), файл извлечётся. На CTF начального уровня пустой пароль встречается регулярно. С известным паролем: steghide extract -sf cover.jpg -p "password123".

Brute-force пароля через stegseek

Когда пароль неизвестен, в дело вступает stegseek — брутфорсер, который прогоняет миллионы паролей за секунды. Старая альтернатива stegcracker работает, но медленно — тысячи вариантов в секунду вместо миллионов. Разница на порядки.

Запуск: stegseek cover.jpg /usr/share/wordlists/rockyou.txt. Stegseek прогонит словарь и при совпадении автоматически извлечёт данные. Словарь rockyou.txt (14 миллионов паролей) прогоняется за 1–3 секунды в зависимости от железа. Если rockyou не сработал — попробуйте словари из SecLists или составьте свой на основе подсказок из описания задания (название CTF, имена организаторов, ключевые слова из таска).

LSB стеганография: zsteg и Stegsolve

Least Significant Bit (LSB) — самый распространённый метод стеганографии в картинках на CTF. Суть least significant bit кодирования: каждый пиксель изображения хранится как набор байтов (R, G, B или R, G, B, A). Изменение младшего бита в каждом байте визуально незаметно — цвет с яркостью 254 и 255 неотличим для глаза. Записывая биты секретного сообщения в младшие биты пикселей, можно спрятать текст внутри картинки без видимых изменений.

Для тех кто в танке — байт 254 в двоичной записи это 11111110, байт 255 — 11111111. Разница в один уровень яркости из 256 возможных. Если заменить последний бит каждого цветового канала каждого пикселя битами сообщения, в картинке 1024×768 RGBA можно спрятать около 393 КБ данных. Приличный объём.

zsteg — автоматический анализ PNG и BMP

Zsteg — инструмент для автоматического обнаружения LSB стеганографии в PNG и BMP файлах. В русскоязычных гайдах он почти не упоминается, а зря: по моему опыту, zsteg решает больше CTF-задач на стего, чем steghide.

Запуск: zsteg mystery.png — утилита перебирает все возможные комбинации каналов (R, G, B, A), порядков битов (MSB, LSB) и направлений чтения (по строкам, по столбцам). Если обнаружится текст, ASCII-строка или сигнатура файла — zsteg покажет результат.

$ zsteg mystery.png
b1,rgb,lsb,xy    .. text: "flag{lsb_1s_ev3rywh3re}"
b2,r,lsb,xy      .. file: Zip archive data
b1,rgba,lsb,xy   .. text: "\x00\x00flag{lsb_1s_ev3rywh3re}"

Здесь zsteg нашёл флаг в первом бите каналов RGB, порядок LSB, чтение по строкам. Для углублённого анализа: zsteg -a mystery.png включает все проверки. Если zsteg обнаружил бинарные данные — извлеките их в файл: zsteg -e "b1,rgb,lsb" mystery.png > extracted.bin и проверьте через file extracted.bin.

Stegsolve — визуальный разбор битовых плоскостей

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

Стрелками переключайтесь между фильтрами: Red plane 0, Green plane 0, Blue plane 0 — это младшие биты каждого канала. Если в одном из каналов проступает QR-код, текст или характерный паттерн — данные спрятаны именно там. Stegsolve незаменим когда zsteg не справился: иногда данные закодированы нестандартно (только в красном канале каждого третьего пикселя), и автоматика их пропускает, а глазами паттерн очевиден.

Онлайн-альтернатива: StegOnline (georgeom.net) — аналогичные возможности через браузер, без установки Java.

Поиск скрытых данных в аудио

Аудио-стеганография в CTF обычно сводится к двум приёмам: скрытое изображение в спектрограмме и LSB-кодирование в WAV-сэмплах.

Спектрограмма. Организаторы CTF рисуют текст или QR-код, который виден только при построении спектрограммы аудиофайла. Для анализа — Sonic Visualiser: откройте WAV или MP3, добавьте слой Spectrogram через Layer → Add Spectrogram. Если в высокочастотном диапазоне (15–20 кГц) проступает текст — это флаг. В Audacity аналогичная функция: выпадающее меню трека → «Спектрограмма». Иногда для лучшего разрешения нужно увеличить размер окна FFT до 4096–8192.

LSB в WAV. WAV хранит аудиосэмплы как 16-битные числа. Младшие биты каждого сэмпла можно заменить битами секретного сообщения — на слух разница неразличима. Steghide умеет работать с WAV: steghide extract -sf audio.wav. Если данные защищены паролем — натравливайте stegseek.

MIDI. Встречается редко, но ноты MIDI — это числовые значения, которые могут кодировать ASCII-символы. Для анализа подойдёт любой MIDI-редактор.

Какой инструмент когда использовать

Инструмент Форматы Что ищет Когда применять
file Любые Реальный тип файла Первый шаг всегда
strings Любые Текст в бинарных данных Второй шаг — поиск флага в открытом виде
exiftool Изображения, PDF, аудио Метаданные Третий шаг — Comment, Author, GPS
binwalk Любые Вложенные файлы по сигнатурам Аномальный размер файла
steghide JPEG, BMP, WAV, AU Данные, встроенные с паролем Только для поддерживаемых форматов
stegseek JPEG, BMP, WAV, AU Брутфорс пароля steghide Пароль неизвестен
zsteg PNG, BMP LSB-данные в каналах Основной инструмент для PNG
Stegsolve PNG, BMP, JPEG Битовые плоскости визуально Когда zsteg не нашёл, но подозрение есть
Sonic Visualiser WAV, MP3, FLAC Спектрограмма Аудио-задания
foremost Любые Файлы по заголовкам/футерам Альтернатива binwalk

Steghide не работает с PNG, zsteg не работает с JPEG. Путаница между ними — одна из самых частых ошибок новичков. Запомните связку: PNG → zsteg, JPEG → steghide. Напечатайте на стикере и приклейте на монитор, если нужно.

Пошаговый алгоритм решения стего-заданий в CTF

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

  1. file — определить реальный тип файла. Расширение может врать
  2. strings | grep -i flag — поиск флага в открытом тексте
  3. exiftool — проверить метаданные, искать Comment, Description, нестандартные поля
  4. binwalk -e — извлечь вложенные файлы. Если нашёлся архив с паролем — пароль обычно в описании задания или в метаданных
  5. steghide extract (для JPEG/BMP/WAV) — попробовать пустой пароль, затем очевидные варианты
  6. stegseek + rockyou.txt — брутфорс пароля steghide, занимает секунды
  7. zsteg (для PNG/BMP) — LSB-анализ. Молчит — попробовать zsteg -a
  8. Stegsolve — визуальный анализ битовых плоскостей, поиск QR-кодов и паттернов
  9. Спектрограмма (для аудио) — Sonic Visualiser или Audacity
  10. xxd + ручной анализ — последний рубеж. Искать данные после маркера конца файла (IEND для PNG, FFD9 для JPEG), изменённые заголовки, нестандартные чанки

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

Ловушки организаторов и ошибки новичков

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

Подменённые magic bytes. Файл назван .png, но первые байты изменены. file скажет «data» вместо конкретного формата. Решение: смотрите hex через xxd | head, сравнивайте с эталонными сигнатурами, исправляйте байт в hex-редакторе (hexedit mystery.png).

Изменённый IHDR в PNG. Организаторы уменьшают значение высоты в заголовке IHDR. Изображение отображается обрезанным, скрытые данные находятся в невидимой нижней части. Этот приём называется post-pixel padding: данные остаются в файле, но рендерер их не показывает. Решение: откройте hex-редактором, найдите IHDR (обычно байт 12), увеличьте значение высоты. Пересчитайте CRC блока IHDR — без этого PNG-парсер отклонит файл. Утилита pngcheck mystery.png обнаружит несоответствие CRC и укажет на проблему.

Файлы-матрёшки. ZIP внутри PNG, внутри которого ещё один ZIP с паролем, внутри которого JPEG со steghide-вложением. Решение: применяйте алгоритм итеративно — каждый извлечённый файл прогоняйте через тот же набор инструментов с шага 1.

Fake flags. Внутри файла лежит строка flag{this_is_not_the_flag} — ловушка для тех, кто остановился на strings и побежал сдавать. Настоящий флаг спрятан глубже: в LSB, во вложенном архиве или в метаданных извлечённого файла.

Нестандартный порядок каналов. Данные закодированы не в RGB-LSB, а в BGR, только в альфа-канале или в каждом втором пикселе. Команда zsteg -a перебирает большинство комбинаций, но экзотические варианты требуют ручного скрипта на Python.

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

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

Что реально изменилось за последние пару лет: задания усложняются в сторону нестандартных контейнеров. Всё чаще данные прячут в PDF, SVG, шрифтах, WebP. Базовый набор binwalk + exiftool + steghide + zsteg по-прежнему закрывает процентов восемьдесят задач, но оставшаяся часть требует уже скриптинга на Python и понимания формата файла на уровне спецификации. Читать RFC и писать парсеры — вот граница между тем, кто решает Easy-Medium, и тем, кто стабильно берёт Hard.

Ещё одна заметная тенденция: организаторы стали комбинировать стеганографию с криптографией. Данные не просто спрятаны — они ещё и зашифрованы, причём ключ нужно собрать из нескольких источников внутри задания. Для таких задач одних инструментов мало, нужно понимание основ: кодировки, симметричное шифрование, хеширование. На IB Basics берут с любого старта, и для тех, кто хочет собрать базу перед первым CTF — рабочий вариант.

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

Поделиться

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

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

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